2.5.69 support for restricting cpu usage to callers of sys_setaffinity
Subsystems (3)
PATCH 1/1 2.5.69 support for restricting cpu usage to callers of sys_setaffinity
Hi all,
Following on from
http://www.ussg.iu.edu/hypermail/linux/kernel/0304.1/1634.html
here is a patch against 2.5.69 to add support for restricting cpu usage to callers of sys_setaffinity. Please review and apply.
Thanks, Shaheed
1. The patch is against a clean 2.5.69
2. There is a new boot flag "restricted_cpus". This takes a bit mask of CPUs.
3. The initial task has it's cpus_allowed mask set to ~restricted_cpus in the fork initialisation code (it cannot be done in TASK_INIT since the value is not
static). This should mean that any task that does not override cpus_allowed with sys_setaffinity does not get to run on the restricted processors.
4. The parsing of the boot flag does a sanity check to prevent all available CPUs being restricted.
5. Patch follows...
--- linux-2.5.69-vanilla/Documentation/kernel-parameters.txt Sun May 4
23:53:57 2003
+++ linux-2.5.69/Documentation/kernel-parameters.txt Thu May 8 10:14:51 2003
@@ -809,6 +809,10 @@
reserve= [KNL,BUGS] Force the kernel to ignore some iomem area
+ restricted_cpus=
+ [KNL] Don't use these CPUs for processes by default.
+ Format: <cpu_mask>
+
resume= [SWSUSP] Specify the partition device for software suspension
riscom8= [HW,SERIAL]
kernel/fork.c +37 -0
@@ -62,6 +62,30 @@*/ static task_t *task_cache[NR_CPUS] __cacheline_aligned; +/* +* The boot flag "restricted_cpus" is negated to form the default per-task +* cpus_allowed mask. This has the effect of only allowing processes which +* call sys_setaffinity() to run on restricted_cpus. +*/ +static unsigned long restricted_cpus =0 ; + +/* +* set_restricted_cpus - process boot flag to set restricted_cpus. +* +* NOTE: This function is a __setup and __init function. +*/ +int __init set_restricted_cpus (char *options) +{ +char *value = options; + +if (!value || !*value) +return 0 ; + restricted_cpus =simple_strtoul (value, &value,0 ); +return 0 ; +} + +__setup ("restricted_cpus=" , set_restricted_cpus); +int nr_processes (void ) {int cpu;
@@ -208,6 +232,19 @@ init_task.rlim[RLIMIT_NPROC ].rlim_cur = max_threads/2 ; init_task.rlim[RLIMIT_NPROC ].rlim_max = max_threads/2 ; + +/* +* Make sure that the user has not restricted all available CPUs, +* otherwise a functioning system won't result! Note that at this +* point, only the boot CPU is actually online... +*/ +if (~restricted_cpus & cpu_online_map) { +printk (KERN_ERR "restricted CPUs 0x%lx\n" , restricted_cpus); + }else { +printk (KERN_ERR "cannot restrict all CPUs!\n" ); + restricted_cpus =0 ; + } + init_task.cpus_allowed = ~restricted_cpus; }static struct task_struct *dup_task_struct (struct task_struct *orig)