diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/cpuset.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 39c1a4c1c5a9..345ace5117de 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
@@ -240,6 +240,17 @@ static struct cpuset top_cpuset = { | |||
240 | static DEFINE_MUTEX(callback_mutex); | 240 | static DEFINE_MUTEX(callback_mutex); |
241 | 241 | ||
242 | /* | 242 | /* |
243 | * cpuset_buffer_lock protects both the cpuset_name and cpuset_nodelist | ||
244 | * buffers. They are statically allocated to prevent using excess stack | ||
245 | * when calling cpuset_print_task_mems_allowed(). | ||
246 | */ | ||
247 | #define CPUSET_NAME_LEN (128) | ||
248 | #define CPUSET_NODELIST_LEN (256) | ||
249 | static char cpuset_name[CPUSET_NAME_LEN]; | ||
250 | static char cpuset_nodelist[CPUSET_NODELIST_LEN]; | ||
251 | static DEFINE_SPINLOCK(cpuset_buffer_lock); | ||
252 | |||
253 | /* | ||
243 | * This is ugly, but preserves the userspace API for existing cpuset | 254 | * This is ugly, but preserves the userspace API for existing cpuset |
244 | * users. If someone tries to mount the "cpuset" filesystem, we | 255 | * users. If someone tries to mount the "cpuset" filesystem, we |
245 | * silently switch it to mount "cgroup" instead | 256 | * silently switch it to mount "cgroup" instead |
@@ -2356,6 +2367,29 @@ int cpuset_mems_allowed_intersects(const struct task_struct *tsk1, | |||
2356 | return nodes_intersects(tsk1->mems_allowed, tsk2->mems_allowed); | 2367 | return nodes_intersects(tsk1->mems_allowed, tsk2->mems_allowed); |
2357 | } | 2368 | } |
2358 | 2369 | ||
2370 | /** | ||
2371 | * cpuset_print_task_mems_allowed - prints task's cpuset and mems_allowed | ||
2372 | * @task: pointer to task_struct of some task. | ||
2373 | * | ||
2374 | * Description: Prints @task's name, cpuset name, and cached copy of its | ||
2375 | * mems_allowed to the kernel log. Must hold task_lock(task) to allow | ||
2376 | * dereferencing task_cs(task). | ||
2377 | */ | ||
2378 | void cpuset_print_task_mems_allowed(struct task_struct *tsk) | ||
2379 | { | ||
2380 | struct dentry *dentry; | ||
2381 | |||
2382 | dentry = task_cs(tsk)->css.cgroup->dentry; | ||
2383 | spin_lock(&cpuset_buffer_lock); | ||
2384 | snprintf(cpuset_name, CPUSET_NAME_LEN, | ||
2385 | dentry ? (const char *)dentry->d_name.name : "/"); | ||
2386 | nodelist_scnprintf(cpuset_nodelist, CPUSET_NODELIST_LEN, | ||
2387 | tsk->mems_allowed); | ||
2388 | printk(KERN_INFO "%s cpuset=%s mems_allowed=%s\n", | ||
2389 | tsk->comm, cpuset_name, cpuset_nodelist); | ||
2390 | spin_unlock(&cpuset_buffer_lock); | ||
2391 | } | ||
2392 | |||
2359 | /* | 2393 | /* |
2360 | * Collection of memory_pressure is suppressed unless | 2394 | * Collection of memory_pressure is suppressed unless |
2361 | * this flag is enabled by writing "1" to the special | 2395 | * this flag is enabled by writing "1" to the special |