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 | |
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')
-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), |