diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/audit_tree.c | 3 | ||||
| -rw-r--r-- | kernel/irq/manage.c | 5 | ||||
| -rw-r--r-- | kernel/lockdep.c | 22 | ||||
| -rw-r--r-- | kernel/panic.c | 2 | ||||
| -rw-r--r-- | kernel/power/disk.c | 51 | ||||
| -rw-r--r-- | kernel/ptrace.c | 4 | ||||
| -rw-r--r-- | kernel/slow-work.c | 4 | ||||
| -rw-r--r-- | kernel/sysctl.c | 5 | ||||
| -rw-r--r-- | kernel/time/clocksource.c | 8 | ||||
| -rw-r--r-- | kernel/time/jiffies.c | 2 | ||||
| -rw-r--r-- | kernel/time/timekeeping.c | 12 |
11 files changed, 66 insertions, 52 deletions
diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c index 917ab9525568..6e7351739a82 100644 --- a/kernel/audit_tree.c +++ b/kernel/audit_tree.c | |||
| @@ -734,9 +734,6 @@ int audit_tag_tree(char *old, char *new) | |||
| 734 | dentry = dget(path.dentry); | 734 | dentry = dget(path.dentry); |
| 735 | path_put(&path); | 735 | path_put(&path); |
| 736 | 736 | ||
| 737 | if (dentry == tagged->mnt_root && dentry == mnt->mnt_root) | ||
| 738 | follow_up(&mnt, &dentry); | ||
| 739 | |||
| 740 | list_add_tail(&list, &tagged->mnt_list); | 737 | list_add_tail(&list, &tagged->mnt_list); |
| 741 | 738 | ||
| 742 | mutex_lock(&audit_filter_mutex); | 739 | mutex_lock(&audit_filter_mutex); |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 7e2e7dd4cd2f..2734eca59243 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -109,10 +109,9 @@ int irq_set_affinity(unsigned int irq, const struct cpumask *cpumask) | |||
| 109 | spin_lock_irqsave(&desc->lock, flags); | 109 | spin_lock_irqsave(&desc->lock, flags); |
| 110 | 110 | ||
| 111 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 111 | #ifdef CONFIG_GENERIC_PENDING_IRQ |
| 112 | if (desc->status & IRQ_MOVE_PCNTXT || desc->status & IRQ_DISABLED) { | 112 | if (desc->status & IRQ_MOVE_PCNTXT) |
| 113 | cpumask_copy(desc->affinity, cpumask); | ||
| 114 | desc->chip->set_affinity(irq, cpumask); | 113 | desc->chip->set_affinity(irq, cpumask); |
| 115 | } else { | 114 | else { |
| 116 | desc->status |= IRQ_MOVE_PENDING; | 115 | desc->status |= IRQ_MOVE_PENDING; |
| 117 | cpumask_copy(desc->pending_mask, cpumask); | 116 | cpumask_copy(desc->pending_mask, cpumask); |
| 118 | } | 117 | } |
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index b0f011866969..accb40cdb12a 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
| @@ -2490,13 +2490,20 @@ static int mark_lock(struct task_struct *curr, struct held_lock *this, | |||
| 2490 | void lockdep_init_map(struct lockdep_map *lock, const char *name, | 2490 | void lockdep_init_map(struct lockdep_map *lock, const char *name, |
| 2491 | struct lock_class_key *key, int subclass) | 2491 | struct lock_class_key *key, int subclass) |
| 2492 | { | 2492 | { |
| 2493 | if (unlikely(!debug_locks)) | 2493 | lock->class_cache = NULL; |
| 2494 | #ifdef CONFIG_LOCK_STAT | ||
| 2495 | lock->cpu = raw_smp_processor_id(); | ||
| 2496 | #endif | ||
| 2497 | |||
| 2498 | if (DEBUG_LOCKS_WARN_ON(!name)) { | ||
| 2499 | lock->name = "NULL"; | ||
| 2494 | return; | 2500 | return; |
| 2501 | } | ||
| 2502 | |||
| 2503 | lock->name = name; | ||
| 2495 | 2504 | ||
| 2496 | if (DEBUG_LOCKS_WARN_ON(!key)) | 2505 | if (DEBUG_LOCKS_WARN_ON(!key)) |
| 2497 | return; | 2506 | return; |
| 2498 | if (DEBUG_LOCKS_WARN_ON(!name)) | ||
| 2499 | return; | ||
| 2500 | /* | 2507 | /* |
| 2501 | * Sanity check, the lock-class key must be persistent: | 2508 | * Sanity check, the lock-class key must be persistent: |
| 2502 | */ | 2509 | */ |
| @@ -2505,12 +2512,11 @@ void lockdep_init_map(struct lockdep_map *lock, const char *name, | |||
| 2505 | DEBUG_LOCKS_WARN_ON(1); | 2512 | DEBUG_LOCKS_WARN_ON(1); |
| 2506 | return; | 2513 | return; |
| 2507 | } | 2514 | } |
| 2508 | lock->name = name; | ||
| 2509 | lock->key = key; | 2515 | lock->key = key; |
| 2510 | lock->class_cache = NULL; | 2516 | |
| 2511 | #ifdef CONFIG_LOCK_STAT | 2517 | if (unlikely(!debug_locks)) |
| 2512 | lock->cpu = raw_smp_processor_id(); | 2518 | return; |
| 2513 | #endif | 2519 | |
| 2514 | if (subclass) | 2520 | if (subclass) |
| 2515 | register_lock_class(lock, subclass, 1); | 2521 | register_lock_class(lock, subclass, 1); |
| 2516 | } | 2522 | } |
diff --git a/kernel/panic.c b/kernel/panic.c index 934fb377f4b3..3dcaa1661357 100644 --- a/kernel/panic.c +++ b/kernel/panic.c | |||
| @@ -221,7 +221,7 @@ void add_taint(unsigned flag) | |||
| 221 | * post-warning case. | 221 | * post-warning case. |
| 222 | */ | 222 | */ |
| 223 | if (flag != TAINT_CRAP && flag != TAINT_WARN && __debug_locks_off()) | 223 | if (flag != TAINT_CRAP && flag != TAINT_WARN && __debug_locks_off()) |
| 224 | printk(KERN_WARNING "Disabling lockdep due to kernel taint\n"); | 224 | printk(KERN_WARNING "Disabling lock debugging due to kernel taint\n"); |
| 225 | 225 | ||
| 226 | set_bit(flag, &tainted_mask); | 226 | set_bit(flag, &tainted_mask); |
| 227 | } | 227 | } |
diff --git a/kernel/power/disk.c b/kernel/power/disk.c index 0854770b63b9..e71ca9cd81b2 100644 --- a/kernel/power/disk.c +++ b/kernel/power/disk.c | |||
| @@ -646,13 +646,6 @@ static int software_resume(void) | |||
| 646 | return 0; | 646 | return 0; |
| 647 | 647 | ||
| 648 | /* | 648 | /* |
| 649 | * We can't depend on SCSI devices being available after loading one of | ||
| 650 | * their modules if scsi_complete_async_scans() is not called and the | ||
| 651 | * resume device usually is a SCSI one. | ||
| 652 | */ | ||
| 653 | scsi_complete_async_scans(); | ||
| 654 | |||
| 655 | /* | ||
| 656 | * name_to_dev_t() below takes a sysfs buffer mutex when sysfs | 649 | * name_to_dev_t() below takes a sysfs buffer mutex when sysfs |
| 657 | * is configured into the kernel. Since the regular hibernate | 650 | * is configured into the kernel. Since the regular hibernate |
| 658 | * trigger path is via sysfs which takes a buffer mutex before | 651 | * trigger path is via sysfs which takes a buffer mutex before |
| @@ -663,32 +656,42 @@ static int software_resume(void) | |||
| 663 | * here to avoid lockdep complaining. | 656 | * here to avoid lockdep complaining. |
| 664 | */ | 657 | */ |
| 665 | mutex_lock_nested(&pm_mutex, SINGLE_DEPTH_NESTING); | 658 | mutex_lock_nested(&pm_mutex, SINGLE_DEPTH_NESTING); |
| 659 | |||
| 660 | if (swsusp_resume_device) | ||
| 661 | goto Check_image; | ||
| 662 | |||
| 663 | if (!strlen(resume_file)) { | ||
| 664 | error = -ENOENT; | ||
| 665 | goto Unlock; | ||
| 666 | } | ||
| 667 | |||
| 668 | pr_debug("PM: Checking image partition %s\n", resume_file); | ||
| 669 | |||
| 670 | /* Check if the device is there */ | ||
| 671 | swsusp_resume_device = name_to_dev_t(resume_file); | ||
| 666 | if (!swsusp_resume_device) { | 672 | if (!swsusp_resume_device) { |
| 667 | if (!strlen(resume_file)) { | ||
| 668 | mutex_unlock(&pm_mutex); | ||
| 669 | return -ENOENT; | ||
| 670 | } | ||
| 671 | /* | 673 | /* |
| 672 | * Some device discovery might still be in progress; we need | 674 | * Some device discovery might still be in progress; we need |
| 673 | * to wait for this to finish. | 675 | * to wait for this to finish. |
| 674 | */ | 676 | */ |
| 675 | wait_for_device_probe(); | 677 | wait_for_device_probe(); |
| 678 | /* | ||
| 679 | * We can't depend on SCSI devices being available after loading | ||
| 680 | * one of their modules until scsi_complete_async_scans() is | ||
| 681 | * called and the resume device usually is a SCSI one. | ||
| 682 | */ | ||
| 683 | scsi_complete_async_scans(); | ||
| 684 | |||
| 676 | swsusp_resume_device = name_to_dev_t(resume_file); | 685 | swsusp_resume_device = name_to_dev_t(resume_file); |
| 677 | pr_debug("PM: Resume from partition %s\n", resume_file); | 686 | if (!swsusp_resume_device) { |
| 678 | } else { | 687 | error = -ENODEV; |
| 679 | pr_debug("PM: Resume from partition %d:%d\n", | 688 | goto Unlock; |
| 680 | MAJOR(swsusp_resume_device), | 689 | } |
| 681 | MINOR(swsusp_resume_device)); | ||
| 682 | } | 690 | } |
| 683 | 691 | ||
| 684 | if (noresume) { | 692 | Check_image: |
| 685 | /** | 693 | pr_debug("PM: Resume from partition %d:%d\n", |
| 686 | * FIXME: If noresume is specified, we need to find the | 694 | MAJOR(swsusp_resume_device), MINOR(swsusp_resume_device)); |
| 687 | * partition and reset it back to normal swap space. | ||
| 688 | */ | ||
| 689 | mutex_unlock(&pm_mutex); | ||
| 690 | return 0; | ||
| 691 | } | ||
| 692 | 695 | ||
| 693 | pr_debug("PM: Checking hibernation image.\n"); | 696 | pr_debug("PM: Checking hibernation image.\n"); |
| 694 | error = swsusp_check(); | 697 | error = swsusp_check(); |
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index dfcd83ceee3b..0692ab5a0d67 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c | |||
| @@ -188,7 +188,7 @@ int ptrace_attach(struct task_struct *task) | |||
| 188 | /* Protect exec's credential calculations against our interference; | 188 | /* Protect exec's credential calculations against our interference; |
| 189 | * SUID, SGID and LSM creds get determined differently under ptrace. | 189 | * SUID, SGID and LSM creds get determined differently under ptrace. |
| 190 | */ | 190 | */ |
| 191 | retval = mutex_lock_interruptible(¤t->cred_exec_mutex); | 191 | retval = mutex_lock_interruptible(&task->cred_exec_mutex); |
| 192 | if (retval < 0) | 192 | if (retval < 0) |
| 193 | goto out; | 193 | goto out; |
| 194 | 194 | ||
| @@ -232,7 +232,7 @@ repeat: | |||
| 232 | bad: | 232 | bad: |
| 233 | write_unlock_irqrestore(&tasklist_lock, flags); | 233 | write_unlock_irqrestore(&tasklist_lock, flags); |
| 234 | task_unlock(task); | 234 | task_unlock(task); |
| 235 | mutex_unlock(¤t->cred_exec_mutex); | 235 | mutex_unlock(&task->cred_exec_mutex); |
| 236 | out: | 236 | out: |
| 237 | return retval; | 237 | return retval; |
| 238 | } | 238 | } |
diff --git a/kernel/slow-work.c b/kernel/slow-work.c index cf2bc01186ef..b28d19135f43 100644 --- a/kernel/slow-work.c +++ b/kernel/slow-work.c | |||
| @@ -609,14 +609,14 @@ void slow_work_unregister_user(void) | |||
| 609 | if (slow_work_user_count == 0) { | 609 | if (slow_work_user_count == 0) { |
| 610 | printk(KERN_NOTICE "Slow work thread pool: Shutting down\n"); | 610 | printk(KERN_NOTICE "Slow work thread pool: Shutting down\n"); |
| 611 | slow_work_threads_should_exit = true; | 611 | slow_work_threads_should_exit = true; |
| 612 | del_timer_sync(&slow_work_cull_timer); | ||
| 613 | del_timer_sync(&slow_work_oom_timer); | ||
| 612 | wake_up_all(&slow_work_thread_wq); | 614 | wake_up_all(&slow_work_thread_wq); |
| 613 | wait_for_completion(&slow_work_last_thread_exited); | 615 | wait_for_completion(&slow_work_last_thread_exited); |
| 614 | printk(KERN_NOTICE "Slow work thread pool:" | 616 | printk(KERN_NOTICE "Slow work thread pool:" |
| 615 | " Shut down complete\n"); | 617 | " Shut down complete\n"); |
| 616 | } | 618 | } |
| 617 | 619 | ||
| 618 | del_timer_sync(&slow_work_cull_timer); | ||
| 619 | |||
| 620 | mutex_unlock(&slow_work_user_lock); | 620 | mutex_unlock(&slow_work_user_lock); |
| 621 | } | 621 | } |
| 622 | EXPORT_SYMBOL(slow_work_unregister_user); | 622 | EXPORT_SYMBOL(slow_work_unregister_user); |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index e3d2c7dd59b9..ea78fa101ad6 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
| @@ -103,6 +103,9 @@ static unsigned long one_ul = 1; | |||
| 103 | static int one_hundred = 100; | 103 | static int one_hundred = 100; |
| 104 | static int one_thousand = 1000; | 104 | static int one_thousand = 1000; |
| 105 | 105 | ||
| 106 | /* this is needed for the proc_doulongvec_minmax of vm_dirty_bytes */ | ||
| 107 | static unsigned long dirty_bytes_min = 2 * PAGE_SIZE; | ||
| 108 | |||
| 106 | /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */ | 109 | /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */ |
| 107 | static int maxolduid = 65535; | 110 | static int maxolduid = 65535; |
| 108 | static int minolduid; | 111 | static int minolduid; |
| @@ -1006,7 +1009,7 @@ static struct ctl_table vm_table[] = { | |||
| 1006 | .mode = 0644, | 1009 | .mode = 0644, |
| 1007 | .proc_handler = &dirty_bytes_handler, | 1010 | .proc_handler = &dirty_bytes_handler, |
| 1008 | .strategy = &sysctl_intvec, | 1011 | .strategy = &sysctl_intvec, |
| 1009 | .extra1 = &one_ul, | 1012 | .extra1 = &dirty_bytes_min, |
| 1010 | }, | 1013 | }, |
| 1011 | { | 1014 | { |
| 1012 | .procname = "dirty_writeback_centisecs", | 1015 | .procname = "dirty_writeback_centisecs", |
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index c46c931a7fe7..ecfd7b5187e0 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c | |||
| @@ -181,12 +181,12 @@ static void clocksource_watchdog(unsigned long data) | |||
| 181 | 181 | ||
| 182 | resumed = test_and_clear_bit(0, &watchdog_resumed); | 182 | resumed = test_and_clear_bit(0, &watchdog_resumed); |
| 183 | 183 | ||
| 184 | wdnow = watchdog->read(); | 184 | wdnow = watchdog->read(watchdog); |
| 185 | wd_nsec = cyc2ns(watchdog, (wdnow - watchdog_last) & watchdog->mask); | 185 | wd_nsec = cyc2ns(watchdog, (wdnow - watchdog_last) & watchdog->mask); |
| 186 | watchdog_last = wdnow; | 186 | watchdog_last = wdnow; |
| 187 | 187 | ||
| 188 | list_for_each_entry_safe(cs, tmp, &watchdog_list, wd_list) { | 188 | list_for_each_entry_safe(cs, tmp, &watchdog_list, wd_list) { |
| 189 | csnow = cs->read(); | 189 | csnow = cs->read(cs); |
| 190 | 190 | ||
| 191 | if (unlikely(resumed)) { | 191 | if (unlikely(resumed)) { |
| 192 | cs->wd_last = csnow; | 192 | cs->wd_last = csnow; |
| @@ -247,7 +247,7 @@ static void clocksource_check_watchdog(struct clocksource *cs) | |||
| 247 | 247 | ||
| 248 | list_add(&cs->wd_list, &watchdog_list); | 248 | list_add(&cs->wd_list, &watchdog_list); |
| 249 | if (!started && watchdog) { | 249 | if (!started && watchdog) { |
| 250 | watchdog_last = watchdog->read(); | 250 | watchdog_last = watchdog->read(watchdog); |
| 251 | watchdog_timer.expires = jiffies + WATCHDOG_INTERVAL; | 251 | watchdog_timer.expires = jiffies + WATCHDOG_INTERVAL; |
| 252 | add_timer_on(&watchdog_timer, | 252 | add_timer_on(&watchdog_timer, |
| 253 | cpumask_first(cpu_online_mask)); | 253 | cpumask_first(cpu_online_mask)); |
| @@ -268,7 +268,7 @@ static void clocksource_check_watchdog(struct clocksource *cs) | |||
| 268 | cse->flags &= ~CLOCK_SOURCE_WATCHDOG; | 268 | cse->flags &= ~CLOCK_SOURCE_WATCHDOG; |
| 269 | /* Start if list is not empty */ | 269 | /* Start if list is not empty */ |
| 270 | if (!list_empty(&watchdog_list)) { | 270 | if (!list_empty(&watchdog_list)) { |
| 271 | watchdog_last = watchdog->read(); | 271 | watchdog_last = watchdog->read(watchdog); |
| 272 | watchdog_timer.expires = | 272 | watchdog_timer.expires = |
| 273 | jiffies + WATCHDOG_INTERVAL; | 273 | jiffies + WATCHDOG_INTERVAL; |
| 274 | add_timer_on(&watchdog_timer, | 274 | add_timer_on(&watchdog_timer, |
diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c index 06f197560f3b..c3f6c30816e3 100644 --- a/kernel/time/jiffies.c +++ b/kernel/time/jiffies.c | |||
| @@ -50,7 +50,7 @@ | |||
| 50 | */ | 50 | */ |
| 51 | #define JIFFIES_SHIFT 8 | 51 | #define JIFFIES_SHIFT 8 |
| 52 | 52 | ||
| 53 | static cycle_t jiffies_read(void) | 53 | static cycle_t jiffies_read(struct clocksource *cs) |
| 54 | { | 54 | { |
| 55 | return (cycle_t) jiffies; | 55 | return (cycle_t) jiffies; |
| 56 | } | 56 | } |
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 900f1b6598d1..687dff49f6e7 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
| @@ -182,7 +182,7 @@ EXPORT_SYMBOL(do_settimeofday); | |||
| 182 | */ | 182 | */ |
| 183 | static void change_clocksource(void) | 183 | static void change_clocksource(void) |
| 184 | { | 184 | { |
| 185 | struct clocksource *new; | 185 | struct clocksource *new, *old; |
| 186 | 186 | ||
| 187 | new = clocksource_get_next(); | 187 | new = clocksource_get_next(); |
| 188 | 188 | ||
| @@ -191,11 +191,16 @@ static void change_clocksource(void) | |||
| 191 | 191 | ||
| 192 | clocksource_forward_now(); | 192 | clocksource_forward_now(); |
| 193 | 193 | ||
| 194 | new->raw_time = clock->raw_time; | 194 | if (clocksource_enable(new)) |
| 195 | return; | ||
| 195 | 196 | ||
| 197 | new->raw_time = clock->raw_time; | ||
| 198 | old = clock; | ||
| 196 | clock = new; | 199 | clock = new; |
| 200 | clocksource_disable(old); | ||
| 201 | |||
| 197 | clock->cycle_last = 0; | 202 | clock->cycle_last = 0; |
| 198 | clock->cycle_last = clocksource_read(new); | 203 | clock->cycle_last = clocksource_read(clock); |
| 199 | clock->error = 0; | 204 | clock->error = 0; |
| 200 | clock->xtime_nsec = 0; | 205 | clock->xtime_nsec = 0; |
| 201 | clocksource_calculate_interval(clock, NTP_INTERVAL_LENGTH); | 206 | clocksource_calculate_interval(clock, NTP_INTERVAL_LENGTH); |
| @@ -292,6 +297,7 @@ void __init timekeeping_init(void) | |||
| 292 | ntp_init(); | 297 | ntp_init(); |
| 293 | 298 | ||
| 294 | clock = clocksource_get_next(); | 299 | clock = clocksource_get_next(); |
| 300 | clocksource_enable(clock); | ||
| 295 | clocksource_calculate_interval(clock, NTP_INTERVAL_LENGTH); | 301 | clocksource_calculate_interval(clock, NTP_INTERVAL_LENGTH); |
| 296 | clock->cycle_last = clocksource_read(clock); | 302 | clock->cycle_last = clocksource_read(clock); |
| 297 | 303 | ||
