Prev: [PATCH repost] sched: export sched_set/getaffinity to modules
Next: [PATCH 15/16] staging/wlags49_h2: use ARRAY_SIZE
From: Peter Zijlstra on 1 Jul 2010 09:40 On Thu, 2010-07-01 at 16:08 +0300, Michael S. Tsirkin wrote: > On Thu, Jul 01, 2010 at 02:46:35PM +0200, Peter Zijlstra wrote: > > On Thu, 2010-07-01 at 14:34 +0200, Peter Zijlstra wrote: > > > On Thu, 2010-07-01 at 15:23 +0300, Michael S. Tsirkin wrote: > > > > > > > > The patch using this is here: > > > > http://www.mail-archive.com/kvm(a)vger.kernel.org/msg35411.html > > > > > > > > It simply copies the affinity from the parent when thread is created. > > > > > > Sounds like policy, not something the kernel should do.. > > > > The alternative would be using clone() instead of thread_create() and > > inherit everything from the creating task. > > Inheriting from kthreadd and then undoing some aspects just sounds > > like daft policy that really ought to be in userspace. > > Yes, that's basically what this patchset is trying to do: > create a workqueue inheriting everything from the creating task. > Sridhar started with an API to do exactly this: > http://linux.derkeiler.com/Mailing-Lists/Kernel/2010-05/msg07478.html > > Then we switched to raw kthread to avoid stepping on cwq toes. > Maybe it makes sense to add kthread_clone (in addition to > kthread_create) that would do what you suggest? > If yes, any hints on an implementation? I think that's called kernel_thread() see kernel/kthread.c:create_kthread(). Doing the whole kthreadd dance and then copying bits and pieces back sounds very fragile, so yeah, something like that should work. The other issue to consider is the thread group status of these things, I think it would be best if these threads were still considered part of the process that spawned them so that they would die nicely when the process gets whacked. At which point one could wonder if the kthread interface makes any sense, why not let userspace fork tasks and let them call into the kernel to perform work... -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Michael S. Tsirkin on 1 Jul 2010 09:50 On Thu, Jul 01, 2010 at 03:30:24PM +0200, Peter Zijlstra wrote: > On Thu, 2010-07-01 at 16:08 +0300, Michael S. Tsirkin wrote: > > On Thu, Jul 01, 2010 at 02:46:35PM +0200, Peter Zijlstra wrote: > > > On Thu, 2010-07-01 at 14:34 +0200, Peter Zijlstra wrote: > > > > On Thu, 2010-07-01 at 15:23 +0300, Michael S. Tsirkin wrote: > > > > > > > > > > The patch using this is here: > > > > > http://www.mail-archive.com/kvm(a)vger.kernel.org/msg35411.html > > > > > > > > > > It simply copies the affinity from the parent when thread is created. > > > > > > > > Sounds like policy, not something the kernel should do.. > > > > > > The alternative would be using clone() instead of thread_create() and > > > inherit everything from the creating task. > > > Inheriting from kthreadd and then undoing some aspects just sounds > > > like daft policy that really ought to be in userspace. > > > > Yes, that's basically what this patchset is trying to do: > > create a workqueue inheriting everything from the creating task. > > Sridhar started with an API to do exactly this: > > http://linux.derkeiler.com/Mailing-Lists/Kernel/2010-05/msg07478.html > > > > Then we switched to raw kthread to avoid stepping on cwq toes. > > Maybe it makes sense to add kthread_clone (in addition to > > kthread_create) that would do what you suggest? > > If yes, any hints on an implementation? > > I think that's called kernel_thread() see > kernel/kthread.c:create_kthread(). > > Doing the whole kthreadd dance and then copying bits and pieces back > sounds very fragile, so yeah, something like that should work. Thanks! Sridhar, Tejun, have the time to look into this approach? > The other issue to consider is the thread group status of these things, > I think it would be best if these threads were still considered part of > the process that spawned them so that they would die nicely when the > process gets whacked. The proposed patch kills the thread when the fd is closed, so I think this already works without making it part of the process. > At which point one could wonder if the kthread interface makes any > sense, why not let userspace fork tasks and let them call into the > kernel to perform work... One thing I wanted to avoid is letting userspace know just how many threads are there. We are using a single one now, but we used to have threads per-cpu, and we might switch to a thread per virtqueue in the future. IMO all this should ideally be transparent to userspace. -- MST -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Peter Zijlstra on 1 Jul 2010 10:00 On Thu, 2010-07-01 at 16:39 +0300, Michael S. Tsirkin wrote: > > The proposed patch kills the thread when the fd is closed, > so I think this already works without making it part of the process. > OK, fd bound resources are fine. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Tejun Heo on 1 Jul 2010 10:30 Hello, On 07/01/2010 03:39 PM, Michael S. Tsirkin wrote: >> I think that's called kernel_thread() see >> kernel/kthread.c:create_kthread(). >> >> Doing the whole kthreadd dance and then copying bits and pieces back >> sounds very fragile, so yeah, something like that should work. > > Thanks! > Sridhar, Tejun, have the time to look into this approach? All that's necessary is shortcutting indirection through kthreadd. ie. An exported function which looks like the following, struct kthread_clone_or_whatever(int (*threadfn).....) { struct kthread_create_info create; int pid; INIT create; pid = kernel_thread(kthread, &create, CLONE_FS...); if (pid < 0) return ERROR; wait_for_completion(&create.done); if (!IS_ERR(create.result)) SET NAME; return create.result; } It might be a good idea to make the function take extra clone flags but anyways once created cloned task can be treated the same way as other kthreads, so nothing else needs to be changed. Thanks. -- tejun -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Oleg Nesterov on 1 Jul 2010 10:40
On 07/01, Peter Zijlstra wrote: > > On Thu, 2010-07-01 at 16:08 +0300, Michael S. Tsirkin wrote: > > Maybe it makes sense to add kthread_clone (in addition to > > kthread_create) that would do what you suggest? > > If yes, any hints on an implementation? > > I think that's called kernel_thread() see > kernel/kthread.c:create_kthread(). Well, strictly speaking kernel_thread() doesn't create the kernel thread. Unless the caller is the kernel thread. And daemonize() is deprecated. kernel_thread() just forks the CLONE_VM + flags child. Oleg. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |