From: Andrew Morton <akpm@linux-foundation.org>
To: Mikulas Patocka <mpatocka@redhat.com>
Cc: Mandeep Singh Baines <msb@chromium.org>,
linux-kernel@vger.kernel.org, dm-devel@redhat.com,
Alasdair G Kergon <agk@redhat.com>,
Will Drewry <wad@chromium.org>,
Elly Jones <ellyjones@chromium.org>,
Milan Broz <mbroz@redhat.com>,
Olof Johansson <olofj@chromium.org>,
Steffen Klassert <steffen.klassert@secunet.com>,
Tejun Heo <tj@kernel.org>, Rusty Russell <rusty@rustcorp.com.au>
Subject: Re: workqueues and percpu (was: [PATCH] dm: remake of the verity target)
Date: Thu, 8 Mar 2012 14:39:09 -0800 [thread overview]
Message-ID: <20120308143909.bfc4cb4d.akpm@linux-foundation.org> (raw)
In-Reply-To: <Pine.LNX.4.64.1203081656590.31821@file.rdu.redhat.com>
On Thu, 8 Mar 2012 17:21:53 -0500
Mikulas Patocka <mpatocka@redhat.com> wrote:
>
>
> On Tue, 6 Mar 2012, Mandeep Singh Baines wrote:
>
> > You are
> > allocated a complete shash_desc per I/O. We only allocate one per CPU.
>
> I looked at it --- and using percpu variables in workqueues isn't safe
> because the workqueue can change CPU if the CPU is hot-unplugged.
>
> dm-crypt has the same bug --- it also uses workqueue with per-cpu
> variables and assumes that the CPU doesn't change for a single work item.
>
> This program shows that work executed in a workqueue can be switched to a
> different CPU.
>
> I'm wondering how much other kernel code assumes that workqueues are bound
> to a specific CPU, which isn't true if we unplug that CPU.
ugh.
We really don't want to have to avoid using workqueues because of some
daft issue with CPU hot-unplug. And yes, there are assumptions in various
work handlers that they will be pinned to a single CPU. Finding and fixing
those assumptions would be painful.
Heck, even debug_smp_processor_id() can be wrong in the presence of the
cpu-unplug thing.
I'm not sure what we can do about it really, apart from blocking unplug
until all the target CPU's workqueues have been cleared. And/or refusing
to unplug a CPU until all pinned-to-that-cpu kernel threads have been
shut down or pinned elsewhere (which is the same thing, only more
general).
Tejun, is this new behaviour? I do recall that a long time ago we
wrestled with unplug-vs-worker-threads and I ended up OK with the
result, but I forget what it was. IIRC Rusty was involved.
That being said, I don't think it's worth compromising the DM code
because of this workqueue wart: lots of other code has the same wart,
and we should find a centralised fix for it.
> /*
> * A proof of concept that a work item executed on a workqueue may change CPU
> * when CPU hot-unplugging is used.
> * Compile this as a module and run:
> * insmod test.ko; sleep 1; echo 0 >/sys/devices/system/cpu/cpu1/online
> * You see that the work item starts executing on CPU 1 and ends up executing
> * on different CPU, usually 0.
> */
>
> #include <linux/module.h>
> #include <linux/delay.h>
>
> static struct workqueue_struct *wq;
> static struct work_struct work;
>
> static void do_work(struct work_struct *w)
> {
> printk("starting work on cpu %d\n", smp_processor_id());
> msleep(10000);
> printk("finishing work on cpu %d\n", smp_processor_id());
> }
>
> static int __init test_init(void)
> {
> printk("module init\n");
> wq = alloc_workqueue("testd", WQ_MEM_RECLAIM | WQ_CPU_INTENSIVE, 1);
> if (!wq) {
> printk("alloc_workqueue failed\n");
> return -ENOMEM;
> }
> INIT_WORK(&work, do_work);
> queue_work_on(1, wq, &work);
> return 0;
> }
>
> static void __exit test_exit(void)
> {
> destroy_workqueue(wq);
> printk("module exit\n");
> }
>
> module_init(test_init)
> module_exit(test_exit)
> MODULE_LICENSE("GPL");
next prev parent reply other threads:[~2012-03-08 22:39 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-02 0:33 [PATCH] dm: verity target Mandeep Singh Baines
2012-03-02 16:08 ` Mandeep Singh Baines
2012-03-04 19:18 ` [PATCH] dm: remake of the " Mikulas Patocka
2012-03-04 19:35 ` userspace hashing utility for dm-verity Mikulas Patocka
2012-03-06 21:59 ` [PATCH] dm: remake of the verity target Mandeep Singh Baines
2012-03-08 22:21 ` workqueues and percpu (was: [PATCH] dm: remake of the verity target) Mikulas Patocka
2012-03-08 22:39 ` Andrew Morton [this message]
2012-03-08 23:15 ` Tejun Heo
2012-03-08 23:30 ` Andrew Morton
2012-03-09 0:33 ` Tejun Heo
2012-03-09 0:51 ` Tejun Heo
2012-03-09 21:15 ` Mandeep Singh Baines
2012-03-09 21:20 ` Tejun Heo
2012-03-09 22:06 ` Mandeep Singh Baines
2012-08-14 17:54 ` Tejun Heo
2012-03-13 22:20 ` [PATCH] dm: remake of the verity target Mikulas Patocka
2012-03-14 21:13 ` Will Drewry
2012-03-17 1:16 ` Mikulas Patocka
2012-03-17 3:06 ` Will Drewry
2012-03-14 21:43 ` Mandeep Singh Baines
2012-03-20 15:41 ` Mandeep Singh Baines
2012-03-21 0:54 ` Mikulas Patocka
2012-03-21 3:03 ` Mandeep Singh Baines
2012-03-21 3:11 ` [dm-devel] " Mikulas Patocka
2012-03-21 3:30 ` Mandeep Singh Baines
2012-03-21 3:44 ` Mikulas Patocka
2012-03-21 3:49 ` Mandeep Singh Baines
2012-03-21 17:08 ` Mikulas Patocka
2012-03-21 17:09 ` Mikulas Patocka
2012-03-22 17:41 ` Mandeep Singh Baines
2012-03-22 21:52 ` Mikulas Patocka
2012-03-23 3:15 ` Mandeep Singh Baines
2012-03-24 3:48 ` Mikulas Patocka
2012-03-21 1:10 ` Mikulas Patocka
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120308143909.bfc4cb4d.akpm@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=agk@redhat.com \
--cc=dm-devel@redhat.com \
--cc=ellyjones@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mbroz@redhat.com \
--cc=mpatocka@redhat.com \
--cc=msb@chromium.org \
--cc=olofj@chromium.org \
--cc=rusty@rustcorp.com.au \
--cc=steffen.klassert@secunet.com \
--cc=tj@kernel.org \
--cc=wad@chromium.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome