Messages in this thread Patch in this message | | | Date | Wed, 16 Oct 2013 14:13:26 -0700 | From | Andrew Morton <> | Subject | Re: [PATCH] kmod: Run usermodehelpers only on cpus allowed for kthreadd |
| |
On Wed, 16 Oct 2013 14:44:28 +0000 Christoph Lameter <cl@linux.com> wrote:
> This is a follow on patch related to the earlier > discussion about restricting the > spawning of kernel threads. See https://lkml.org/lkml/2013/9/5/426 > > > > > usermodehelper() threads can currently run on all processors. > This is an issue for low latency cores.
How much of an issue? The severity of the problem is utterly unclear from this description.
> Restrict usermodehelper() threads to the cores that kthreadd is > restricted to. > > The default for kthreadd is to be allowed to run on an processors. > If the user restricts kthreadd then threads spawned by > usermodhelper() will similarly restricted. > > Before this patch there is no way to limit the cpus that usermodehelper > can run on since the affinity is set when the thread is spawned to > all processors. > > ... > > --- linux.orig/include/linux/kthread.h 2013-10-10 11:00:34.167771996 -0500 > +++ linux/include/linux/kthread.h 2013-10-15 13:57:52.859056676 -0500 > @@ -51,6 +51,7 @@ void kthread_parkme(void); > int kthreadd(void *unused); > extern struct task_struct *kthreadd_task; > extern int tsk_fork_get_node(struct task_struct *tsk); > +void set_kthreadd_affinity(void); > > /* > * Simple work processor based on kthread. > Index: linux/kernel/kmod.c > =================================================================== > --- linux.orig/kernel/kmod.c 2013-10-10 11:00:39.091771917 -0500 > +++ linux/kernel/kmod.c 2013-10-15 14:02:01.904261324 -0500 > @@ -40,6 +40,7 @@ > #include <linux/ptrace.h> > #include <linux/async.h> > #include <asm/uaccess.h> > +#include <linux/kthread.h> > > #include <trace/events/module.h> > > @@ -209,8 +210,8 @@ static int ____call_usermodehelper(void > flush_signal_handlers(current, 1); > spin_unlock_irq(¤t->sighand->siglock); > > - /* We can run anywhere, unlike our parent keventd(). */ > - set_cpus_allowed_ptr(current, cpu_all_mask); > + /* We can run anywhere kthreadd can run */
This is a poor comment - it explains "what" (which was utterly obvious) but doesn't explain "why". The reader will want to know *why* call_usermodehelper() only runs on kthreadd CPUs, but we didn't tell him.
> + set_kthreadd_affinity(); >
| |