* SMP: bind process to cpu
@ 2001-02-17 12:36 Thomas Widmann
2001-02-17 13:27 ` Christoph Hellwig
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Thomas Widmann @ 2001-02-17 12:36 UTC (permalink / raw)
To: linux-kernel
Hi,
I run an 3*XEON 550MHz Primergy with 2GB of RAM.
On this machine, i have compiled kernel 2.4.0SMP.
Is it possible to bind a process to a specific
cpu on this SMP machine (process affinity) ?
I there something like pset ?
Thanks in advance
Regards
Widmann Thomas
Siemens AG - Munich
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: SMP: bind process to cpu
2001-02-17 12:36 SMP: bind process to cpu Thomas Widmann
@ 2001-02-17 13:27 ` Christoph Hellwig
2001-02-17 14:13 ` Manfred Spraul
2001-02-17 14:37 ` Andrew Morton
2001-02-17 19:49 ` Tim Hockin
2 siblings, 1 reply; 9+ messages in thread
From: Christoph Hellwig @ 2001-02-17 13:27 UTC (permalink / raw)
To: "Thomas Widmann"; +Cc: linux-kernel
In article <BGEDIODHBENLENEMBEPAEEDFCAAA.thomas.widmann@icn.siemens.de> you wrote:
> Hi,
>
> I run an 3*XEON 550MHz Primergy with 2GB of RAM.
> On this machine, i have compiled kernel 2.4.0SMP.
>
> Is it possible to bind a process to a specific
> cpu on this SMP machine (process affinity) ?
Linux 2.4 is mostlu ready for process affinity, but it is not (yet)
exported to userspace. I've attached at patch by Nick Pollitt from SGI
that allows to enable process pinning using prctl().
> I there something like pset ?
I've seen patches for SGI-like psets for 2.2.<something>, but not for 2.4.
Christoph
--
Of course it doesn't work. We've performed a software upgrade.
diff -X /home/npollitt/dontdiff -Nur origlinux/fs/proc/array.c linux/fs/proc/array.c
--- origlinux/fs/proc/array.c Tue Nov 14 11:22:36 2000
+++ linux/fs/proc/array.c Thu Jan 25 15:17:35 2001
@@ -347,7 +347,7 @@
read_unlock(&tasklist_lock);
res = sprintf(buffer,"%d (%s) %c %d %d %d %d %d %lu %lu \
%lu %lu %lu %lu %lu %ld %ld %ld %ld %ld %ld %lu %lu %ld %lu %lu %lu %lu %lu \
-%lu %lu %lu %lu %lu %lu %lu %lu %d %d\n",
+%lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu\n",
task->pid,
task->comm,
state,
@@ -390,7 +390,8 @@
task->nswap,
task->cnswap,
task->exit_signal,
- task->processor);
+ task->processor,
+ task->cpus_allowed);
if(mm)
mmput(mm);
return res;
diff -X /home/npollitt/dontdiff -Nur origlinux/include/linux/prctl.h linux/include/linux/prctl.h
--- origlinux/include/linux/prctl.h Sun Mar 19 11:15:32 2000
+++ linux/include/linux/prctl.h Thu Jan 25 15:17:35 2001
@@ -20,4 +20,9 @@
#define PR_GET_KEEPCAPS 7
#define PR_SET_KEEPCAPS 8
+#define PR_GET_RUNON 9
+#define PR_SET_RUNON 10
+#define PR_MUSTRUN_PID 11
+#define PR_RUNANY_PID 12
+
#endif /* _LINUX_PRCTL_H */
diff -X /home/npollitt/dontdiff -Nur origlinux/kernel/sched.c linux/kernel/sched.c
--- origlinux/kernel/sched.c Thu Jan 4 13:50:38 2001
+++ linux/kernel/sched.c Thu Jan 25 17:22:23 2001
@@ -108,6 +108,10 @@
#ifdef CONFIG_SMP
#define idle_task(cpu) (init_tasks[cpu_number_map(cpu)])
+#define can_schedule_goodness(p,cpu) ( (!(p)->has_cpu || \
+ p->processor == cpu) && \
+ ((p)->cpus_allowed & (1 << cpu)))
+
#define can_schedule(p,cpu) ((!(p)->has_cpu) && \
((p)->cpus_allowed & (1 << cpu)))
@@ -568,7 +572,7 @@
still_running_back:
list_for_each(tmp, &runqueue_head) {
p = list_entry(tmp, struct task_struct, run_list);
- if (can_schedule(p, this_cpu)) {
+ if (can_schedule_goodness(p, this_cpu)) {
int weight = goodness(p, this_cpu, prev->active_mm);
if (weight > c)
c = weight, next = p;
diff -X /home/npollitt/dontdiff -Nur origlinux/kernel/sys.c linux/kernel/sys.c
--- origlinux/kernel/sys.c Mon Oct 16 12:58:51 2000
+++ linux/kernel/sys.c Thu Jan 25 15:17:35 2001
@@ -1203,12 +1203,95 @@
}
current->keep_capabilities = arg2;
break;
+ case PR_GET_RUNON:
+ error = put_user(current->cpus_allowed, (long *)arg2);
+ break;
+ case PR_SET_RUNON:
+ if (arg2 == 0)
+ arg2 = 1 << smp_processor_id();
+ arg2 &= cpu_online_map;
+ if (!arg2)
+ error = -EINVAL;
+ else {
+ current->cpus_allowed = arg2;
+ if (!(arg2 & (1 << smp_processor_id())))
+ current->need_resched = 1;
+ }
+ break;
+ case PR_MUSTRUN_PID:
+ /* arg2 is cpu, arg3 is pid */
+ if (arg2 == 0)
+ arg2 = 1 << smp_processor_id();
+ arg2 &= cpu_online_map;
+ if (!arg2)
+ error = -EINVAL;
+ error = mp_mustrun_pid(arg2, arg3);
+ break;
+ case PR_RUNANY_PID:
+ /* arg2 is pid */
+ if (!arg2)
+ error = -EINVAL;
+ error = mp_runany_pid(arg2);
+ break;
default:
error = -EINVAL;
break;
}
return error;
}
+
+static int mp_mustrun_pid(int cpu, int pid)
+{
+ struct task_struct *p;
+ int ret;
+
+ ret = -EPERM;
+ /* Not allowed to change 1 */
+ if (pid == 1)
+ goto out;
+
+ read_lock(&tasklist_lock);
+ p = find_task_by_pid(pid);
+ if (p)
+ get_task_struct(p);
+ read_unlock(&tasklist_lock);
+ if (!p)
+ ret = -ESRCH;
+
+ p->cpus_allowed = cpu;
+ p->need_resched = 1;
+ free_task_struct(p);
+ ret = 0;
+out:
+ return ret;
+}
+
+static int mp_runany_pid(int pid)
+{
+ struct task_struct *p;
+ int ret;
+
+ ret = -EPERM;
+ /* Not allowed to change 1 */
+ if (pid == 1)
+ goto out;
+
+ read_lock(&tasklist_lock);
+ p = find_task_by_pid(pid);
+ if (p)
+ get_task_struct(p);
+ read_unlock(&tasklist_lock);
+ if (!p)
+ ret = -ESRCH;
+
+ p->cpus_allowed = 0xFFFFFFFF;
+ p->need_resched = 0;
+ free_task_struct(p);
+ ret = 0;
+out:
+ return ret;
+}
+
EXPORT_SYMBOL(notifier_chain_register);
EXPORT_SYMBOL(notifier_chain_unregister);
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: SMP: bind process to cpu
2001-02-17 13:27 ` Christoph Hellwig
@ 2001-02-17 14:13 ` Manfred Spraul
2001-02-17 17:47 ` Christoph Hellwig
0 siblings, 1 reply; 9+ messages in thread
From: Manfred Spraul @ 2001-02-17 14:13 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Thomas Widmann, linux-kernel
Christoph Hellwig wrote:
>
> In article <BGEDIODHBENLENEMBEPAEEDFCAAA.thomas.widmann@icn.siemens.de> you wrote:
> > Hi,
> >
> > I run an 3*XEON 550MHz Primergy with 2GB of RAM.
> > On this machine, i have compiled kernel 2.4.0SMP.
> >
> > Is it possible to bind a process to a specific
> > cpu on this SMP machine (process affinity) ?
>
> Linux 2.4 is mostlu ready for process affinity, but it is not (yet)
> exported to userspace. I've attached at patch by Nick Pollitt from SGI
> that allows to enable process pinning using prctl().
>
> > I there something like pset ?
>
> I've seen patches for SGI-like psets for 2.2.<something>, but not for 2.4.
>
> Christoph
>
You must also update wake_process_synchroneous(), otherwise you can get
lost wakeups with pipes.
Something like
> if (!(p->cpus_allowed & (1 << smp_processor_id()))
> reschedule_idle(p);
must be added after add_to_runqueue().
Ingo Molnar did some testing with tux2, and under high load wakeups were
lost without such a patch.
--
Manfred
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: SMP: bind process to cpu
2001-02-17 12:36 SMP: bind process to cpu Thomas Widmann
2001-02-17 13:27 ` Christoph Hellwig
@ 2001-02-17 14:37 ` Andrew Morton
2001-02-17 19:08 ` Thomas Widmann
2001-02-17 19:49 ` Tim Hockin
2 siblings, 1 reply; 9+ messages in thread
From: Andrew Morton @ 2001-02-17 14:37 UTC (permalink / raw)
To: Thomas Widmann; +Cc: linux-kernel
Thomas Widmann wrote:
>
> Hi,
>
> I run an 3*XEON 550MHz Primergy with 2GB of RAM.
> On this machine, i have compiled kernel 2.4.0SMP.
>
> Is it possible to bind a process to a specific
> cpu on this SMP machine (process affinity) ?
>
> I there something like pset ?
A patch which creates /proc/<pid>/cpus_allowed is at
http://www.uow.edu.au/~andrewm/linux/#cpus_allowed
You just write a bitmask into it.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: SMP: bind process to cpu
2001-02-17 14:13 ` Manfred Spraul
@ 2001-02-17 17:47 ` Christoph Hellwig
0 siblings, 0 replies; 9+ messages in thread
From: Christoph Hellwig @ 2001-02-17 17:47 UTC (permalink / raw)
To: Manfred Spraul
Cc: Christoph Hellwig, Thomas Widmann, linux-kernel, Nick Pollitt
[Nick, I've added you to the Cc list so you can look at
it for future versions of your patch]
On Sat, Feb 17, 2001 at 03:13:45PM +0100, Manfred Spraul wrote:
> You must also update wake_process_synchroneous(), otherwise you can get
> lost wakeups with pipes.
>
> Something like
>
> > if (!(p->cpus_allowed & (1 << smp_processor_id()))
> > reschedule_idle(p);
>
> must be added after add_to_runqueue().
Ok.
> Ingo Molnar did some testing with tux2, and under high load wakeups were
> lost without such a patch.
(s/tux2/tux/ I suppose)
Yepp - but tux is again not userspace...
Christoph
--
Of course it doesn't work. We've performed a software upgrade.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: SMP: bind process to cpu
2001-02-17 14:37 ` Andrew Morton
@ 2001-02-17 19:08 ` Thomas Widmann
2001-02-17 19:57 ` Francis Galiegue
2001-02-18 1:01 ` Andrew Morton
0 siblings, 2 replies; 9+ messages in thread
From: Thomas Widmann @ 2001-02-17 19:08 UTC (permalink / raw)
To: linux-kernel; +Cc: Andrew Morton
Hi,
* Andrew Morton wrote:
> > Hi,
> >
> > I run an 3*XEON 550MHz Primergy with 2GB of RAM.
> > On this machine, i have compiled kernel 2.4.0SMP.
> >
> > Is it possible to bind a process to a specific
> > cpu on this SMP machine (process affinity) ?
> >
> > I there something like pset ?
>
> A patch which creates /proc/<pid>/cpus_allowed is at
>
> http://www.uow.edu.au/~andrewm/linux/#cpus_allowed
>
> You just write a bitmask into it.
Thanks for this information. I patched my the kernel with it.
After rebooting with the new kernel i can see the bitmask
for every process running on my server.
#cat /proc/1310/cpus_allowed
ffffffff
Now, if i want to run this process on only one cpu, i which way
do i have to set the bitmask ?
Let's say, i want to run it on cpu0. how look's the bitmask ?
Thanks
Regards
Thomas
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: SMP: bind process to cpu
2001-02-17 12:36 SMP: bind process to cpu Thomas Widmann
2001-02-17 13:27 ` Christoph Hellwig
2001-02-17 14:37 ` Andrew Morton
@ 2001-02-17 19:49 ` Tim Hockin
2 siblings, 0 replies; 9+ messages in thread
From: Tim Hockin @ 2001-02-17 19:49 UTC (permalink / raw)
To: Thomas Widmann; +Cc: linux-kernel
> Is it possible to bind a process to a specific
> cpu on this SMP machine (process affinity) ?
>
> I there something like pset ?
http://isunix.it.ilstu.edu/~thockin/pset - pset for linux-2.2 (not ported
to 2.4 yet)
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: SMP: bind process to cpu
2001-02-17 19:08 ` Thomas Widmann
@ 2001-02-17 19:57 ` Francis Galiegue
2001-02-18 1:01 ` Andrew Morton
1 sibling, 0 replies; 9+ messages in thread
From: Francis Galiegue @ 2001-02-17 19:57 UTC (permalink / raw)
To: Thomas Widmann; +Cc: linux-kernel
On Sat, 17 Feb 2001, Thomas Widmann wrote:
>
> #cat /proc/1310/cpus_allowed
> ffffffff
>
> Now, if i want to run this process on only one cpu, i which way
> do i have to set the bitmask ?
> Let's say, i want to run it on cpu0. how look's the bitmask ?
>
Wild guess: as this is a bitmask, you must "or" the bitmask with (1 <<
cpu_number). 1 for CPU 0 only, 5 for CPU 0 and 2, etc, etc.
--
Francis Galiegue, fg@mandrakesoft.com - Normand et fier de l'être
"Programming is a race between programmers, who try and make more and more
idiot-proof software, and universe, which produces more and more remarkable
idiots. Until now, universe leads the race" -- R. Cook
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: SMP: bind process to cpu
2001-02-17 19:08 ` Thomas Widmann
2001-02-17 19:57 ` Francis Galiegue
@ 2001-02-18 1:01 ` Andrew Morton
1 sibling, 0 replies; 9+ messages in thread
From: Andrew Morton @ 2001-02-18 1:01 UTC (permalink / raw)
To: Thomas Widmann; +Cc: linux-kernel
Thomas Widmann wrote:
> ...
> * Andrew Morton wrote:
>
> > http://www.uow.edu.au/~andrewm/linux/#cpus_allowed
> >
> > You just write a bitmask into it.
>
> Thanks for this information. I patched my the kernel with it.
> After rebooting with the new kernel i can see the bitmask
> for every process running on my server.
>
> #cat /proc/1310/cpus_allowed
> ffffffff
>
> Now, if i want to run this process on only one cpu, i which way
> do i have to set the bitmask ?
> Let's say, i want to run it on cpu0. how look's the bitmask ?
Each bit corresponds to a logical CPU on which the task
is permitted to run. So 1->CPU0, 2->CPU1, 5->CPU0+CPU2, etc.
But it does seem there are problems with the scheduler
which occur when cpus_allowed it not all-ones. I didn't
observe any problems in the 1-2 hours testing which I
needed that patch for, so it should be OK for experimentation
purposes..
-
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2001-02-18 0:56 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2001-02-17 12:36 SMP: bind process to cpu Thomas Widmann
2001-02-17 13:27 ` Christoph Hellwig
2001-02-17 14:13 ` Manfred Spraul
2001-02-17 17:47 ` Christoph Hellwig
2001-02-17 14:37 ` Andrew Morton
2001-02-17 19:08 ` Thomas Widmann
2001-02-17 19:57 ` Francis Galiegue
2001-02-18 1:01 ` Andrew Morton
2001-02-17 19:49 ` Tim Hockin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox