diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/cpuset.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 10131fdaff70..ed0ff443f036 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
| @@ -949,6 +949,8 @@ static void cpuset_migrate_mm(struct mm_struct *mm, const nodemask_t *from, | |||
| 949 | static void cpuset_change_task_nodemask(struct task_struct *tsk, | 949 | static void cpuset_change_task_nodemask(struct task_struct *tsk, |
| 950 | nodemask_t *newmems) | 950 | nodemask_t *newmems) |
| 951 | { | 951 | { |
| 952 | bool masks_disjoint = !nodes_intersects(*newmems, tsk->mems_allowed); | ||
| 953 | |||
| 952 | repeat: | 954 | repeat: |
| 953 | /* | 955 | /* |
| 954 | * Allow tasks that have access to memory reserves because they have | 956 | * Allow tasks that have access to memory reserves because they have |
| @@ -963,7 +965,6 @@ repeat: | |||
| 963 | nodes_or(tsk->mems_allowed, tsk->mems_allowed, *newmems); | 965 | nodes_or(tsk->mems_allowed, tsk->mems_allowed, *newmems); |
| 964 | mpol_rebind_task(tsk, newmems, MPOL_REBIND_STEP1); | 966 | mpol_rebind_task(tsk, newmems, MPOL_REBIND_STEP1); |
| 965 | 967 | ||
| 966 | |||
| 967 | /* | 968 | /* |
| 968 | * ensure checking ->mems_allowed_change_disable after setting all new | 969 | * ensure checking ->mems_allowed_change_disable after setting all new |
| 969 | * allowed nodes. | 970 | * allowed nodes. |
| @@ -980,9 +981,11 @@ repeat: | |||
| 980 | 981 | ||
| 981 | /* | 982 | /* |
| 982 | * Allocation of memory is very fast, we needn't sleep when waiting | 983 | * Allocation of memory is very fast, we needn't sleep when waiting |
| 983 | * for the read-side. | 984 | * for the read-side. No wait is necessary, however, if at least one |
| 985 | * node remains unchanged. | ||
| 984 | */ | 986 | */ |
| 985 | while (ACCESS_ONCE(tsk->mems_allowed_change_disable)) { | 987 | while (masks_disjoint && |
| 988 | ACCESS_ONCE(tsk->mems_allowed_change_disable)) { | ||
| 986 | task_unlock(tsk); | 989 | task_unlock(tsk); |
| 987 | if (!task_curr(tsk)) | 990 | if (!task_curr(tsk)) |
| 988 | yield(); | 991 | yield(); |
