diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/cgroup.c | 5 | ||||
| -rw-r--r-- | kernel/cpuset.c | 29 | ||||
| -rw-r--r-- | kernel/events/core.c | 8 | ||||
| -rw-r--r-- | kernel/sched_fair.c | 14 | ||||
| -rw-r--r-- | kernel/sysctl_binary.c | 2 | ||||
| -rw-r--r-- | kernel/time/clockevents.c | 1 | ||||
| -rw-r--r-- | kernel/time/clocksource.c | 12 |
7 files changed, 48 insertions, 23 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index d9d5648f3cdc..a184470cf9b5 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
| @@ -2098,11 +2098,6 @@ int cgroup_attach_proc(struct cgroup *cgrp, struct task_struct *leader) | |||
| 2098 | continue; | 2098 | continue; |
| 2099 | /* get old css_set pointer */ | 2099 | /* get old css_set pointer */ |
| 2100 | task_lock(tsk); | 2100 | task_lock(tsk); |
| 2101 | if (tsk->flags & PF_EXITING) { | ||
| 2102 | /* ignore this task if it's going away */ | ||
| 2103 | task_unlock(tsk); | ||
| 2104 | continue; | ||
| 2105 | } | ||
| 2106 | oldcg = tsk->cgroups; | 2101 | oldcg = tsk->cgroups; |
| 2107 | get_css_set(oldcg); | 2102 | get_css_set(oldcg); |
| 2108 | task_unlock(tsk); | 2103 | task_unlock(tsk); |
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 9fe58c46a426..0b1712dba587 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
| @@ -123,6 +123,19 @@ static inline struct cpuset *task_cs(struct task_struct *task) | |||
| 123 | struct cpuset, css); | 123 | struct cpuset, css); |
| 124 | } | 124 | } |
| 125 | 125 | ||
| 126 | #ifdef CONFIG_NUMA | ||
| 127 | static inline bool task_has_mempolicy(struct task_struct *task) | ||
| 128 | { | ||
| 129 | return task->mempolicy; | ||
| 130 | } | ||
| 131 | #else | ||
| 132 | static inline bool task_has_mempolicy(struct task_struct *task) | ||
| 133 | { | ||
| 134 | return false; | ||
| 135 | } | ||
| 136 | #endif | ||
| 137 | |||
| 138 | |||
| 126 | /* bits in struct cpuset flags field */ | 139 | /* bits in struct cpuset flags field */ |
| 127 | typedef enum { | 140 | typedef enum { |
| 128 | CS_CPU_EXCLUSIVE, | 141 | CS_CPU_EXCLUSIVE, |
| @@ -949,7 +962,7 @@ static void cpuset_migrate_mm(struct mm_struct *mm, const nodemask_t *from, | |||
| 949 | static void cpuset_change_task_nodemask(struct task_struct *tsk, | 962 | static void cpuset_change_task_nodemask(struct task_struct *tsk, |
| 950 | nodemask_t *newmems) | 963 | nodemask_t *newmems) |
| 951 | { | 964 | { |
| 952 | bool masks_disjoint = !nodes_intersects(*newmems, tsk->mems_allowed); | 965 | bool need_loop; |
| 953 | 966 | ||
| 954 | repeat: | 967 | repeat: |
| 955 | /* | 968 | /* |
| @@ -962,6 +975,14 @@ repeat: | |||
| 962 | return; | 975 | return; |
| 963 | 976 | ||
| 964 | task_lock(tsk); | 977 | task_lock(tsk); |
| 978 | /* | ||
| 979 | * Determine if a loop is necessary if another thread is doing | ||
| 980 | * get_mems_allowed(). If at least one node remains unchanged and | ||
| 981 | * tsk does not have a mempolicy, then an empty nodemask will not be | ||
| 982 | * possible when mems_allowed is larger than a word. | ||
| 983 | */ | ||
| 984 | need_loop = task_has_mempolicy(tsk) || | ||
| 985 | !nodes_intersects(*newmems, tsk->mems_allowed); | ||
| 965 | nodes_or(tsk->mems_allowed, tsk->mems_allowed, *newmems); | 986 | nodes_or(tsk->mems_allowed, tsk->mems_allowed, *newmems); |
| 966 | mpol_rebind_task(tsk, newmems, MPOL_REBIND_STEP1); | 987 | mpol_rebind_task(tsk, newmems, MPOL_REBIND_STEP1); |
| 967 | 988 | ||
| @@ -981,11 +1002,9 @@ repeat: | |||
| 981 | 1002 | ||
| 982 | /* | 1003 | /* |
| 983 | * Allocation of memory is very fast, we needn't sleep when waiting | 1004 | * Allocation of memory is very fast, we needn't sleep when waiting |
| 984 | * for the read-side. No wait is necessary, however, if at least one | 1005 | * for the read-side. |
| 985 | * node remains unchanged. | ||
| 986 | */ | 1006 | */ |
| 987 | while (masks_disjoint && | 1007 | while (need_loop && ACCESS_ONCE(tsk->mems_allowed_change_disable)) { |
| 988 | ACCESS_ONCE(tsk->mems_allowed_change_disable)) { | ||
| 989 | task_unlock(tsk); | 1008 | task_unlock(tsk); |
| 990 | if (!task_curr(tsk)) | 1009 | if (!task_curr(tsk)) |
| 991 | yield(); | 1010 | yield(); |
diff --git a/kernel/events/core.c b/kernel/events/core.c index d3b9df5962c2..58690af323e4 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -3558,9 +3558,13 @@ static void ring_buffer_wakeup(struct perf_event *event) | |||
| 3558 | 3558 | ||
| 3559 | rcu_read_lock(); | 3559 | rcu_read_lock(); |
| 3560 | rb = rcu_dereference(event->rb); | 3560 | rb = rcu_dereference(event->rb); |
| 3561 | list_for_each_entry_rcu(event, &rb->event_list, rb_entry) { | 3561 | if (!rb) |
| 3562 | goto unlock; | ||
| 3563 | |||
| 3564 | list_for_each_entry_rcu(event, &rb->event_list, rb_entry) | ||
| 3562 | wake_up_all(&event->waitq); | 3565 | wake_up_all(&event->waitq); |
| 3563 | } | 3566 | |
| 3567 | unlock: | ||
| 3564 | rcu_read_unlock(); | 3568 | rcu_read_unlock(); |
| 3565 | } | 3569 | } |
| 3566 | 3570 | ||
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index a78ed2736ba7..8a39fa3e3c6c 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
| @@ -2352,13 +2352,11 @@ again: | |||
| 2352 | if (!smt && (sd->flags & SD_SHARE_CPUPOWER)) | 2352 | if (!smt && (sd->flags & SD_SHARE_CPUPOWER)) |
| 2353 | continue; | 2353 | continue; |
| 2354 | 2354 | ||
| 2355 | if (!(sd->flags & SD_SHARE_PKG_RESOURCES)) { | 2355 | if (smt && !(sd->flags & SD_SHARE_CPUPOWER)) |
| 2356 | if (!smt) { | 2356 | break; |
| 2357 | smt = 1; | 2357 | |
| 2358 | goto again; | 2358 | if (!(sd->flags & SD_SHARE_PKG_RESOURCES)) |
| 2359 | } | ||
| 2360 | break; | 2359 | break; |
| 2361 | } | ||
| 2362 | 2360 | ||
| 2363 | sg = sd->groups; | 2361 | sg = sd->groups; |
| 2364 | do { | 2362 | do { |
| @@ -2378,6 +2376,10 @@ next: | |||
| 2378 | sg = sg->next; | 2376 | sg = sg->next; |
| 2379 | } while (sg != sd->groups); | 2377 | } while (sg != sd->groups); |
| 2380 | } | 2378 | } |
| 2379 | if (!smt) { | ||
| 2380 | smt = 1; | ||
| 2381 | goto again; | ||
| 2382 | } | ||
| 2381 | done: | 2383 | done: |
| 2382 | rcu_read_unlock(); | 2384 | rcu_read_unlock(); |
| 2383 | 2385 | ||
diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c index 6318b511afa1..a650694883a1 100644 --- a/kernel/sysctl_binary.c +++ b/kernel/sysctl_binary.c | |||
| @@ -1354,7 +1354,7 @@ static ssize_t binary_sysctl(const int *name, int nlen, | |||
| 1354 | 1354 | ||
| 1355 | fput(file); | 1355 | fput(file); |
| 1356 | out_putname: | 1356 | out_putname: |
| 1357 | putname(pathname); | 1357 | __putname(pathname); |
| 1358 | out: | 1358 | out: |
| 1359 | return result; | 1359 | return result; |
| 1360 | } | 1360 | } |
diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c index c4eb71c8b2ea..1ecd6ba36d6c 100644 --- a/kernel/time/clockevents.c +++ b/kernel/time/clockevents.c | |||
| @@ -387,7 +387,6 @@ void clockevents_exchange_device(struct clock_event_device *old, | |||
| 387 | * released list and do a notify add later. | 387 | * released list and do a notify add later. |
| 388 | */ | 388 | */ |
| 389 | if (old) { | 389 | if (old) { |
| 390 | old->event_handler = clockevents_handle_noop; | ||
| 391 | clockevents_set_mode(old, CLOCK_EVT_MODE_UNUSED); | 390 | clockevents_set_mode(old, CLOCK_EVT_MODE_UNUSED); |
| 392 | list_del(&old->list); | 391 | list_del(&old->list); |
| 393 | list_add(&old->list, &clockevents_released); | 392 | list_add(&old->list, &clockevents_released); |
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index da2f760e780c..d3ad022136e5 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c | |||
| @@ -647,7 +647,7 @@ static void clocksource_enqueue(struct clocksource *cs) | |||
| 647 | 647 | ||
| 648 | /** | 648 | /** |
| 649 | * __clocksource_updatefreq_scale - Used update clocksource with new freq | 649 | * __clocksource_updatefreq_scale - Used update clocksource with new freq |
| 650 | * @t: clocksource to be registered | 650 | * @cs: clocksource to be registered |
| 651 | * @scale: Scale factor multiplied against freq to get clocksource hz | 651 | * @scale: Scale factor multiplied against freq to get clocksource hz |
| 652 | * @freq: clocksource frequency (cycles per second) divided by scale | 652 | * @freq: clocksource frequency (cycles per second) divided by scale |
| 653 | * | 653 | * |
| @@ -699,7 +699,7 @@ EXPORT_SYMBOL_GPL(__clocksource_updatefreq_scale); | |||
| 699 | 699 | ||
| 700 | /** | 700 | /** |
| 701 | * __clocksource_register_scale - Used to install new clocksources | 701 | * __clocksource_register_scale - Used to install new clocksources |
| 702 | * @t: clocksource to be registered | 702 | * @cs: clocksource to be registered |
| 703 | * @scale: Scale factor multiplied against freq to get clocksource hz | 703 | * @scale: Scale factor multiplied against freq to get clocksource hz |
| 704 | * @freq: clocksource frequency (cycles per second) divided by scale | 704 | * @freq: clocksource frequency (cycles per second) divided by scale |
| 705 | * | 705 | * |
| @@ -727,7 +727,7 @@ EXPORT_SYMBOL_GPL(__clocksource_register_scale); | |||
| 727 | 727 | ||
| 728 | /** | 728 | /** |
| 729 | * clocksource_register - Used to install new clocksources | 729 | * clocksource_register - Used to install new clocksources |
| 730 | * @t: clocksource to be registered | 730 | * @cs: clocksource to be registered |
| 731 | * | 731 | * |
| 732 | * Returns -EBUSY if registration fails, zero otherwise. | 732 | * Returns -EBUSY if registration fails, zero otherwise. |
| 733 | */ | 733 | */ |
| @@ -761,6 +761,8 @@ static void __clocksource_change_rating(struct clocksource *cs, int rating) | |||
| 761 | 761 | ||
| 762 | /** | 762 | /** |
| 763 | * clocksource_change_rating - Change the rating of a registered clocksource | 763 | * clocksource_change_rating - Change the rating of a registered clocksource |
| 764 | * @cs: clocksource to be changed | ||
| 765 | * @rating: new rating | ||
| 764 | */ | 766 | */ |
| 765 | void clocksource_change_rating(struct clocksource *cs, int rating) | 767 | void clocksource_change_rating(struct clocksource *cs, int rating) |
| 766 | { | 768 | { |
| @@ -772,6 +774,7 @@ EXPORT_SYMBOL(clocksource_change_rating); | |||
| 772 | 774 | ||
| 773 | /** | 775 | /** |
| 774 | * clocksource_unregister - remove a registered clocksource | 776 | * clocksource_unregister - remove a registered clocksource |
| 777 | * @cs: clocksource to be unregistered | ||
| 775 | */ | 778 | */ |
| 776 | void clocksource_unregister(struct clocksource *cs) | 779 | void clocksource_unregister(struct clocksource *cs) |
| 777 | { | 780 | { |
| @@ -787,6 +790,7 @@ EXPORT_SYMBOL(clocksource_unregister); | |||
| 787 | /** | 790 | /** |
| 788 | * sysfs_show_current_clocksources - sysfs interface for current clocksource | 791 | * sysfs_show_current_clocksources - sysfs interface for current clocksource |
| 789 | * @dev: unused | 792 | * @dev: unused |
| 793 | * @attr: unused | ||
| 790 | * @buf: char buffer to be filled with clocksource list | 794 | * @buf: char buffer to be filled with clocksource list |
| 791 | * | 795 | * |
| 792 | * Provides sysfs interface for listing current clocksource. | 796 | * Provides sysfs interface for listing current clocksource. |
| @@ -807,6 +811,7 @@ sysfs_show_current_clocksources(struct sys_device *dev, | |||
| 807 | /** | 811 | /** |
| 808 | * sysfs_override_clocksource - interface for manually overriding clocksource | 812 | * sysfs_override_clocksource - interface for manually overriding clocksource |
| 809 | * @dev: unused | 813 | * @dev: unused |
| 814 | * @attr: unused | ||
| 810 | * @buf: name of override clocksource | 815 | * @buf: name of override clocksource |
| 811 | * @count: length of buffer | 816 | * @count: length of buffer |
| 812 | * | 817 | * |
| @@ -842,6 +847,7 @@ static ssize_t sysfs_override_clocksource(struct sys_device *dev, | |||
| 842 | /** | 847 | /** |
| 843 | * sysfs_show_available_clocksources - sysfs interface for listing clocksource | 848 | * sysfs_show_available_clocksources - sysfs interface for listing clocksource |
| 844 | * @dev: unused | 849 | * @dev: unused |
| 850 | * @attr: unused | ||
| 845 | * @buf: char buffer to be filled with clocksource list | 851 | * @buf: char buffer to be filled with clocksource list |
| 846 | * | 852 | * |
| 847 | * Provides sysfs interface for listing registered clocksources | 853 | * Provides sysfs interface for listing registered clocksources |
