From: Shaohua Li <shaohua.li@intel.com>
To: Tiju Jacob <jacobtiju@gmail.com>
Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: Multi-partition block layer behaviour
Date: Mon, 31 Oct 2011 13:39:24 +0800 [thread overview]
Message-ID: <1320039564.22361.178.camel@sli10-conroe> (raw)
In-Reply-To: <CADAg6uy2xOoAaAhVg07oYia+AZAuOGKywPGx8fvT0EF4ThuKCQ@mail.gmail.com>
On Mon, 2011-10-31 at 12:35 +0800, Tiju Jacob wrote:
> On Thu, Oct 27, 2011 at 6:12 AM, Shaohua Li <shaohua.li@intel.com> wrote:
> > On Wed, 2011-10-26 at 18:10 +0800, Tiju Jacob wrote:
> >> >> 1. When an I/O request is made to the filesystem, process 'A' acquires
> >> >> a mutex FS lock and a mutex block driver lock.
> >> >>
> >> >> 2. Process 'B' tries to acquire the mutex FS lock, which is not
> >> >> available. Hence, it goes to sleep. Due to the new plugging mechanism,
> >> >> before going to sleep, shcedule() is invoked which disables preemption
> >> >> and the context becomes atomic. In schedule(), the newly added
> >> >> blk_flush_plug_list() is invoked which unplugs the block driver.
> >> >>
> >> >> 3) During unplug operation the block driver tries to acquire the mutex
> >> >> lock which fails, because the lock was held by process 'A'. Previous
> >> >> invocation of scheudle() in step 2 has already made the context as
> >> >> atomic, hence the error "Schedule while atomic" occured.
> >> > if blk_flush_plug_list() is called in schedule(), it will use
> >> > blk_run_queue_async
> >> > to unplug the queue. This runs in a workqueue. So how could this happen?
> >> >
> >>
> >> The call stack goes as follows:
> >>
> >> From schedule() it calls blk_schedule_flush_plug() and
> >> blk_flush_plug_list() gets invoked.
> >>
> >> In blk_flush_plug_list() queue_unplugged() does not get invoked. Hence
> >> blk_run_queue_async is not called.
> >> Instead __elv_add_request() is invoked with ELEVATOR_INSERT_SORT_MERGE
> >> flag and the flag gets reassigned to ELEVATOR_INSERT_BACK.
> >>
> >> In ELEVATOR_INSERT_BACK, __blk_run_queue() gets invoked and calls request_fn().
>
> > This doesn't make sense. why the flag is changed from
> > ELEVATOR_INSERT_SORT_MERGE to ELEVATOR_INSERT_BACK?
>
> In __elv_add_request() "where" gets reassigned as follows:
>
> } else if (!(rq->cmd_flags & REQ_ELVPRIV) &&
> (where == ELEVATOR_INSERT_SORT ||
> where == ELEVATOR_INSERT_SORT_MERGE))
> where = ELEVATOR_INSERT_BACK;
>
ok, thanks. So this means the elevator is switching in the test. How
about below patch:
diff --git a/block/elevator.c b/block/elevator.c
index a3b64bc..e14824a 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -683,8 +683,13 @@ void __elv_add_request(struct request_queue *q, struct request *rq, int where)
* - Usually, back inserted requests won't be merged
* with anything. There's no point in delaying queue
* processing.
+ * If elevator is switching, doesn't need run the queue.
+ * elevator switching will run it anyway. And this could
+ * cause warning since the code might run in atomic
+ * environment(blk_flush_plug_list() callbed in schedule())
*/
- __blk_run_queue(q);
+ if (!test_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags))
+ __blk_run_queue(q);
break;
case ELEVATOR_INSERT_SORT_MERGE:
next prev parent reply other threads:[~2011-10-31 5:31 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-26 5:12 Multi-partition block layer behaviour Tiju Jacob
2011-10-26 5:42 ` Shaohua Li
2011-10-26 10:10 ` Tiju Jacob
2011-10-27 0:42 ` Shaohua Li
2011-10-31 4:35 ` Tiju Jacob
2011-10-31 5:39 ` Shaohua Li [this message]
2011-10-31 6:14 ` Shaohua Li
2011-10-31 10:21 ` Tiju Jacob
2011-11-01 0:29 ` Shaohua Li
2011-11-03 11:18 ` Tiju Jacob
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=1320039564.22361.178.camel@sli10-conroe \
--to=shaohua.li@intel.com \
--cc=jacobtiju@gmail.com \
--cc=linux-kernel@vger.kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.