[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20071121155842.GA864@tv-sign.ru>
Date: Wed, 21 Nov 2007 18:58:42 +0300
From: Oleg Nesterov <oleg@...sign.ru>
To: Alasdair G Kergon <agk@...hat.com>, Milan Broz <mbroz@...hat.com>
Cc: Ingo Molnar <mingo@...e.hu>,
Johannes Berg <johannes@...solutions.net>,
Torsten Kaiser <just.for.lkml@...glemail.com>,
Andrew Morton <akpm@...ux-foundation.org>,
linux-kernel@...r.kernel.org
Subject: Re: 2.6.24-rc2-mm1: kcryptd vs lockdep
Alasdair G Kergon wrote:
>
> - But what happens if kcryptd_crypt_write_convert_loop() calls
> INIT_WORK/queue_work twice?
Can't find this function. But "INIT_WORK + queue_work" twice is very
wrong of course.
Milan Broz wrote:
>
> Ok, then I have question: Is the following pseudocode correct
> (and problem is in lock validation which checks something
> already initialized for another queue) or reusing work_struct
> is not permitted from inside called work function ?
>
> (Note comment in code "It is permissible to free the struct
> work_struct from inside the function that is called from it".)
>
> struct work_struct work;
> struct workqueue_struct *a, *b;
>
> do_b(*work)
> {
> /* do something else */
> }
>
> do_a(*work)
> {
> /* do something */
> INIT_WORK(&work, do_b);
> queue_work(b, &work);
> }
>
>
> INIT_WORK(&work, do_a);
> queue_work(a, &work);
(just in case, in that particular case PREPARE_WORK() should be used)
INIT_WORK(w) can be used if we know that "w" is not pending, and nobody
else can write to this work (say, queue_work(w) or cancel_work_sync(w)).
So currently the code above should work correctly.
However, I'd say it is not correct, INIT_WORK() can throw out some debug
info for example, or the implementation could be changed.
I'm not sure about CONFIG_LOCKDEP (Johannes cc'ed). INIT_WORK() does
lockdep_init_map(->lockdep_map) but run_workqueue() has a local copy,
looks ok.
Oleg.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists