diff options
Diffstat (limited to 'kernel/cpuset.c')
| -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 |
