aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/cgroups/cpusets.txt6
-rw-r--r--include/linux/cpuset.h4
-rw-r--r--include/linux/sched.h13
-rw-r--r--kernel/cpuset.c9
-rw-r--r--mm/slab.c4
5 files changed, 23 insertions, 13 deletions
diff --git a/Documentation/cgroups/cpusets.txt b/Documentation/cgroups/cpusets.txt
index 7740038d82bc..3c94ff3f9693 100644
--- a/Documentation/cgroups/cpusets.txt
+++ b/Documentation/cgroups/cpusets.txt
@@ -345,14 +345,14 @@ the named feature on.
345The implementation is simple. 345The implementation is simple.
346 346
347Setting the flag 'cpuset.memory_spread_page' turns on a per-process flag 347Setting the flag 'cpuset.memory_spread_page' turns on a per-process flag
348PF_SPREAD_PAGE for each task that is in that cpuset or subsequently 348PFA_SPREAD_PAGE for each task that is in that cpuset or subsequently
349joins that cpuset. The page allocation calls for the page cache 349joins that cpuset. The page allocation calls for the page cache
350is modified to perform an inline check for this PF_SPREAD_PAGE task 350is modified to perform an inline check for this PFA_SPREAD_PAGE task
351flag, and if set, a call to a new routine cpuset_mem_spread_node() 351flag, and if set, a call to a new routine cpuset_mem_spread_node()
352returns the node to prefer for the allocation. 352returns the node to prefer for the allocation.
353 353
354Similarly, setting 'cpuset.memory_spread_slab' turns on the flag 354Similarly, setting 'cpuset.memory_spread_slab' turns on the flag
355PF_SPREAD_SLAB, and appropriately marked slab caches will allocate 355PFA_SPREAD_SLAB, and appropriately marked slab caches will allocate
356pages from the node returned by cpuset_mem_spread_node(). 356pages from the node returned by cpuset_mem_spread_node().
357 357
358The cpuset_mem_spread_node() routine is also simple. It uses the 358The cpuset_mem_spread_node() routine is also simple. It uses the
diff --git a/include/linux/cpuset.h b/include/linux/cpuset.h
index ade2390ffe92..6e39c9bb0dae 100644
--- a/include/linux/cpuset.h
+++ b/include/linux/cpuset.h
@@ -93,12 +93,12 @@ extern int cpuset_slab_spread_node(void);
93 93
94static inline int cpuset_do_page_mem_spread(void) 94static inline int cpuset_do_page_mem_spread(void)
95{ 95{
96 return current->flags & PF_SPREAD_PAGE; 96 return task_spread_page(current);
97} 97}
98 98
99static inline int cpuset_do_slab_mem_spread(void) 99static inline int cpuset_do_slab_mem_spread(void)
100{ 100{
101 return current->flags & PF_SPREAD_SLAB; 101 return task_spread_slab(current);
102} 102}
103 103
104extern int current_cpuset_is_being_rebound(void); 104extern int current_cpuset_is_being_rebound(void);
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 5630763956d9..7b1cafefb05e 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1903,8 +1903,6 @@ extern void thread_group_cputime_adjusted(struct task_struct *p, cputime_t *ut,
1903#define PF_KTHREAD 0x00200000 /* I am a kernel thread */ 1903#define PF_KTHREAD 0x00200000 /* I am a kernel thread */
1904#define PF_RANDOMIZE 0x00400000 /* randomize virtual address space */ 1904#define PF_RANDOMIZE 0x00400000 /* randomize virtual address space */
1905#define PF_SWAPWRITE 0x00800000 /* Allowed to write to swap */ 1905#define PF_SWAPWRITE 0x00800000 /* Allowed to write to swap */
1906#define PF_SPREAD_PAGE 0x01000000 /* Spread page cache over cpuset */
1907#define PF_SPREAD_SLAB 0x02000000 /* Spread some slab caches over cpuset */
1908#define PF_NO_SETAFFINITY 0x04000000 /* Userland is not allowed to meddle with cpus_allowed */ 1906#define PF_NO_SETAFFINITY 0x04000000 /* Userland is not allowed to meddle with cpus_allowed */
1909#define PF_MCE_EARLY 0x08000000 /* Early kill for mce process policy */ 1907#define PF_MCE_EARLY 0x08000000 /* Early kill for mce process policy */
1910#define PF_MUTEX_TESTER 0x20000000 /* Thread belongs to the rt mutex tester */ 1908#define PF_MUTEX_TESTER 0x20000000 /* Thread belongs to the rt mutex tester */
@@ -1958,6 +1956,9 @@ static inline void memalloc_noio_restore(unsigned int flags)
1958 1956
1959/* Per-process atomic flags. */ 1957/* Per-process atomic flags. */
1960#define PFA_NO_NEW_PRIVS 0 /* May not gain new privileges. */ 1958#define PFA_NO_NEW_PRIVS 0 /* May not gain new privileges. */
1959#define PFA_SPREAD_PAGE 1 /* Spread page cache over cpuset */
1960#define PFA_SPREAD_SLAB 2 /* Spread some slab caches over cpuset */
1961
1961 1962
1962#define TASK_PFA_TEST(name, func) \ 1963#define TASK_PFA_TEST(name, func) \
1963 static inline bool task_##func(struct task_struct *p) \ 1964 static inline bool task_##func(struct task_struct *p) \
@@ -1972,6 +1973,14 @@ static inline void memalloc_noio_restore(unsigned int flags)
1972TASK_PFA_TEST(NO_NEW_PRIVS, no_new_privs) 1973TASK_PFA_TEST(NO_NEW_PRIVS, no_new_privs)
1973TASK_PFA_SET(NO_NEW_PRIVS, no_new_privs) 1974TASK_PFA_SET(NO_NEW_PRIVS, no_new_privs)
1974 1975
1976TASK_PFA_TEST(SPREAD_PAGE, spread_page)
1977TASK_PFA_SET(SPREAD_PAGE, spread_page)
1978TASK_PFA_CLEAR(SPREAD_PAGE, spread_page)
1979
1980TASK_PFA_TEST(SPREAD_SLAB, spread_slab)
1981TASK_PFA_SET(SPREAD_SLAB, spread_slab)
1982TASK_PFA_CLEAR(SPREAD_SLAB, spread_slab)
1983
1975/* 1984/*
1976 * task->jobctl flags 1985 * task->jobctl flags
1977 */ 1986 */
diff --git a/kernel/cpuset.c b/kernel/cpuset.c
index 22874d7cf2c0..52cb04c993b7 100644
--- a/kernel/cpuset.c
+++ b/kernel/cpuset.c
@@ -365,13 +365,14 @@ static void cpuset_update_task_spread_flag(struct cpuset *cs,
365 struct task_struct *tsk) 365 struct task_struct *tsk)
366{ 366{
367 if (is_spread_page(cs)) 367 if (is_spread_page(cs))
368 tsk->flags |= PF_SPREAD_PAGE; 368 task_set_spread_page(tsk);
369 else 369 else
370 tsk->flags &= ~PF_SPREAD_PAGE; 370 task_clear_spread_page(tsk);
371
371 if (is_spread_slab(cs)) 372 if (is_spread_slab(cs))
372 tsk->flags |= PF_SPREAD_SLAB; 373 task_set_spread_slab(tsk);
373 else 374 else
374 tsk->flags &= ~PF_SPREAD_SLAB; 375 task_clear_spread_slab(tsk);
375} 376}
376 377
377/* 378/*
diff --git a/mm/slab.c b/mm/slab.c
index a467b308c682..881951e67f12 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -2994,7 +2994,7 @@ out:
2994 2994
2995#ifdef CONFIG_NUMA 2995#ifdef CONFIG_NUMA
2996/* 2996/*
2997 * Try allocating on another node if PF_SPREAD_SLAB is a mempolicy is set. 2997 * Try allocating on another node if PFA_SPREAD_SLAB is a mempolicy is set.
2998 * 2998 *
2999 * If we are in_interrupt, then process context, including cpusets and 2999 * If we are in_interrupt, then process context, including cpusets and
3000 * mempolicy, may not apply and should not be used for allocation policy. 3000 * mempolicy, may not apply and should not be used for allocation policy.
@@ -3226,7 +3226,7 @@ __do_cache_alloc(struct kmem_cache *cache, gfp_t flags)
3226{ 3226{
3227 void *objp; 3227 void *objp;
3228 3228
3229 if (current->mempolicy || unlikely(current->flags & PF_SPREAD_SLAB)) { 3229 if (current->mempolicy || cpuset_do_slab_mem_spread()) {
3230 objp = alternate_node_alloc(cache, flags); 3230 objp = alternate_node_alloc(cache, flags);
3231 if (objp) 3231 if (objp)
3232 goto out; 3232 goto out;