diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-06 13:23:33 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-06 13:23:33 -0500 |
| commit | 65b2074f84be2287e020839e93b4cdaaf60eb37c (patch) | |
| tree | d020c3c37fa5b112ee531b324214236bef9feec6 /fs/proc/base.c | |
| parent | 28d9bfc37c861aa9c8386dff1ac7e9a10e5c5162 (diff) | |
| parent | 6bf4123760a5aece6e4829ce90b70b6ffd751d65 (diff) | |
Merge branch 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (30 commits)
sched: Change wait_for_completion_*_timeout() to return a signed long
sched, autogroup: Fix reference leak
sched, autogroup: Fix potential access to freed memory
sched: Remove redundant CONFIG_CGROUP_SCHED ifdef
sched: Fix interactivity bug by charging unaccounted run-time on entity re-weight
sched: Move periodic share updates to entity_tick()
printk: Use this_cpu_{read|write} api on printk_pending
sched: Make pushable_tasks CONFIG_SMP dependant
sched: Add 'autogroup' scheduling feature: automated per session task groups
sched: Fix unregister_fair_sched_group()
sched: Remove unused argument dest_cpu to migrate_task()
mutexes, sched: Introduce arch_mutex_cpu_relax()
sched: Add some clock info to sched_debug
cpu: Remove incorrect BUG_ON
cpu: Remove unused variable
sched: Fix UP build breakage
sched: Make task dump print all 15 chars of proc comm
sched: Update tg->shares after cpu.shares write
sched: Allow update_cfs_load() to update global load
sched: Implement demand based update_cfs_load()
...
Diffstat (limited to 'fs/proc/base.c')
| -rw-r--r-- | fs/proc/base.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index 182845147fe4..08cba2c3b612 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
| @@ -1407,6 +1407,82 @@ static const struct file_operations proc_pid_sched_operations = { | |||
| 1407 | 1407 | ||
| 1408 | #endif | 1408 | #endif |
| 1409 | 1409 | ||
| 1410 | #ifdef CONFIG_SCHED_AUTOGROUP | ||
| 1411 | /* | ||
| 1412 | * Print out autogroup related information: | ||
| 1413 | */ | ||
| 1414 | static int sched_autogroup_show(struct seq_file *m, void *v) | ||
| 1415 | { | ||
| 1416 | struct inode *inode = m->private; | ||
| 1417 | struct task_struct *p; | ||
| 1418 | |||
| 1419 | p = get_proc_task(inode); | ||
| 1420 | if (!p) | ||
| 1421 | return -ESRCH; | ||
| 1422 | proc_sched_autogroup_show_task(p, m); | ||
| 1423 | |||
| 1424 | put_task_struct(p); | ||
| 1425 | |||
| 1426 | return 0; | ||
| 1427 | } | ||
| 1428 | |||
| 1429 | static ssize_t | ||
| 1430 | sched_autogroup_write(struct file *file, const char __user *buf, | ||
| 1431 | size_t count, loff_t *offset) | ||
| 1432 | { | ||
| 1433 | struct inode *inode = file->f_path.dentry->d_inode; | ||
| 1434 | struct task_struct *p; | ||
| 1435 | char buffer[PROC_NUMBUF]; | ||
| 1436 | long nice; | ||
| 1437 | int err; | ||
| 1438 | |||
| 1439 | memset(buffer, 0, sizeof(buffer)); | ||
| 1440 | if (count > sizeof(buffer) - 1) | ||
| 1441 | count = sizeof(buffer) - 1; | ||
| 1442 | if (copy_from_user(buffer, buf, count)) | ||
| 1443 | return -EFAULT; | ||
| 1444 | |||
| 1445 | err = strict_strtol(strstrip(buffer), 0, &nice); | ||
| 1446 | if (err) | ||
| 1447 | return -EINVAL; | ||
| 1448 | |||
| 1449 | p = get_proc_task(inode); | ||
| 1450 | if (!p) | ||
| 1451 | return -ESRCH; | ||
| 1452 | |||
| 1453 | err = nice; | ||
| 1454 | err = proc_sched_autogroup_set_nice(p, &err); | ||
| 1455 | if (err) | ||
| 1456 | count = err; | ||
| 1457 | |||
| 1458 | put_task_struct(p); | ||
| 1459 | |||
| 1460 | return count; | ||
| 1461 | } | ||
| 1462 | |||
| 1463 | static int sched_autogroup_open(struct inode *inode, struct file *filp) | ||
| 1464 | { | ||
| 1465 | int ret; | ||
| 1466 | |||
| 1467 | ret = single_open(filp, sched_autogroup_show, NULL); | ||
| 1468 | if (!ret) { | ||
| 1469 | struct seq_file *m = filp->private_data; | ||
| 1470 | |||
| 1471 | m->private = inode; | ||
| 1472 | } | ||
| 1473 | return ret; | ||
| 1474 | } | ||
| 1475 | |||
| 1476 | static const struct file_operations proc_pid_sched_autogroup_operations = { | ||
| 1477 | .open = sched_autogroup_open, | ||
| 1478 | .read = seq_read, | ||
| 1479 | .write = sched_autogroup_write, | ||
| 1480 | .llseek = seq_lseek, | ||
| 1481 | .release = single_release, | ||
| 1482 | }; | ||
| 1483 | |||
| 1484 | #endif /* CONFIG_SCHED_AUTOGROUP */ | ||
| 1485 | |||
| 1410 | static ssize_t comm_write(struct file *file, const char __user *buf, | 1486 | static ssize_t comm_write(struct file *file, const char __user *buf, |
| 1411 | size_t count, loff_t *offset) | 1487 | size_t count, loff_t *offset) |
| 1412 | { | 1488 | { |
| @@ -2733,6 +2809,9 @@ static const struct pid_entry tgid_base_stuff[] = { | |||
| 2733 | #ifdef CONFIG_SCHED_DEBUG | 2809 | #ifdef CONFIG_SCHED_DEBUG |
| 2734 | REG("sched", S_IRUGO|S_IWUSR, proc_pid_sched_operations), | 2810 | REG("sched", S_IRUGO|S_IWUSR, proc_pid_sched_operations), |
| 2735 | #endif | 2811 | #endif |
| 2812 | #ifdef CONFIG_SCHED_AUTOGROUP | ||
| 2813 | REG("autogroup", S_IRUGO|S_IWUSR, proc_pid_sched_autogroup_operations), | ||
| 2814 | #endif | ||
| 2736 | REG("comm", S_IRUGO|S_IWUSR, proc_pid_set_comm_operations), | 2815 | REG("comm", S_IRUGO|S_IWUSR, proc_pid_set_comm_operations), |
| 2737 | #ifdef CONFIG_HAVE_ARCH_TRACEHOOK | 2816 | #ifdef CONFIG_HAVE_ARCH_TRACEHOOK |
| 2738 | INF("syscall", S_IRUSR, proc_pid_syscall), | 2817 | INF("syscall", S_IRUSR, proc_pid_syscall), |
