From: Tejun Heo <tj@kernel.org>
To: Christoph Hellwig <hch@infradead.org>
Cc: axboe@kernel.dk, vgoyal@redhat.com, jgarzik@pobox.com,
davem@davemloft.net, linux-kernel@vger.kernel.org,
ctalbott@google.com, rni@google.com
Subject: Re: [PATCH 2/6] block: allow blk_execute_rq_nowait() to be called form IRQ context
Date: Fri, 21 Oct 2011 11:13:39 -0700 [thread overview]
Message-ID: <20111021181339.GA28670@google.com> (raw)
In-Reply-To: <20111021092016.GA14388@infradead.org>
Hello,
On Fri, Oct 21, 2011 at 05:20:16AM -0400, Christoph Hellwig wrote:
> On Thu, Oct 20, 2011 at 08:56:36PM -0700, Tejun Heo wrote:
> > Currently blk_execute_rq_nowait() directly calls __blk_run_queue() and
> > thus can't be called from IRQ context. This patch updates it to use
> > blk_run_queue_async() instead. This will be used to unexport
> > elv_add_request().
> >
> > This changes how queue is kicked after blk_execute_rq_nowait() but
> > it's hardly a hot path and the effect shouldn't be noticeable.
>
> It actually very much is a fasthpath for many of it's users, e.g. the
> SCSI tape drivers, the OSD layer and the target scsi passthrough
> backend.
>
> I don't think blindly adding a context switch here without benchmarking
> is doable. Just add variants that do the workqueue dance or not.
Hmm... I'd really like to keep that detail inside block layer. How
about something like the following?
Thanks.
>From b6954535fe7a585a97e2ce3955569981b833e4db Mon Sep 17 00:00:00 2001
From: Tejun Heo <tj@kernel.org>
Date: Fri, 21 Oct 2011 11:07:58 -0700
Subject: [PATCH 2/6] block: allow blk_execute_rq_nowait() to be called form IRQ context
Currently blk_execute_rq_nowait() directly calls __blk_run_queue() and
thus must be called from sleepable context. This patch updates the
function such that it can be called from non-sleepable context and
schedules async execution in such cases. This will be used to
unexport elv_add_request().
While at it, add FIXME comment for REQ_TYPE_PM_RESUME special case.
-v2: hch pointed out that blk_execute_rq_nowait() can be hot path for
some drivers. Retained direct execution from sleepable context.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Christoph Hellwig <hch@infradead.org>
---
block/blk-exec.c | 29 ++++++++++++++++++++++-------
1 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/block/blk-exec.c b/block/blk-exec.c
index a1ebceb..b686f2b 100644
--- a/block/blk-exec.c
+++ b/block/blk-exec.c
@@ -49,6 +49,8 @@ void blk_execute_rq_nowait(struct request_queue *q, struct gendisk *bd_disk,
rq_end_io_fn *done)
{
int where = at_head ? ELEVATOR_INSERT_FRONT : ELEVATOR_INSERT_BACK;
+ bool may_sleep = !preempt_count() && !irqs_disabled();
+ unsigned long flags;
if (unlikely(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags))) {
rq->errors = -ENXIO;
@@ -59,14 +61,27 @@ void blk_execute_rq_nowait(struct request_queue *q, struct gendisk *bd_disk,
rq->rq_disk = bd_disk;
rq->end_io = done;
- WARN_ON(irqs_disabled());
- spin_lock_irq(q->queue_lock);
+
+ spin_lock_irqsave(q->queue_lock, flags);
__elv_add_request(q, rq, where);
- __blk_run_queue(q);
- /* the queue is stopped so it won't be run */
- if (rq->cmd_type == REQ_TYPE_PM_RESUME)
- q->request_fn(q);
- spin_unlock_irq(q->queue_lock);
+
+ /*
+ * Some drivers beat this path pretty hard. As an optimization, if
+ * we're being called from sleepable context, run @q directly.
+ */
+ if (may_sleep) {
+ __blk_run_queue(q);
+ /*
+ * The queue is stopped so it won't be run.
+ * FIXME: Please kill me along with REQ_TYPE_PM_RESUME.
+ */
+ if (rq->cmd_type == REQ_TYPE_PM_RESUME)
+ q->request_fn(q);
+ } else {
+ blk_run_queue_async(q);
+ }
+
+ spin_unlock_irqrestore(q->queue_lock, flags);
}
EXPORT_SYMBOL_GPL(blk_execute_rq_nowait);
--
1.7.3.1
next prev parent reply other threads:[~2011-10-21 18:13 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-21 3:56 [PATCHSET block:for-3.2/core] further updates to blk_cleanup_queue() Tejun Heo
2011-10-21 3:56 ` [PATCH 1/6] block, sx8: kill blk_insert_request() Tejun Heo
2011-10-21 4:03 ` Jeff Garzik
2011-10-21 3:56 ` [PATCH 2/6] block: allow blk_execute_rq_nowait() to be called form IRQ context Tejun Heo
2011-10-21 9:20 ` Christoph Hellwig
2011-10-21 18:13 ` Tejun Heo [this message]
2011-10-21 3:56 ` [PATCH 3/6] block, ide: unexport elv_add_request() Tejun Heo
2011-10-21 3:56 ` [PATCH 4/6] block: add blk_queue_dead() Tejun Heo
2011-10-21 3:56 ` [PATCH 5/6] block: fix drain_all condition in blk_drain_queue() Tejun Heo
2011-10-21 3:56 ` [PATCH 6/6] block: add missing blk_queue_dead() checks Tejun Heo
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=20111021181339.GA28670@google.com \
--to=tj@kernel.org \
--cc=axboe@kernel.dk \
--cc=ctalbott@google.com \
--cc=davem@davemloft.net \
--cc=hch@infradead.org \
--cc=jgarzik@pobox.com \
--cc=linux-kernel@vger.kernel.org \
--cc=rni@google.com \
--cc=vgoyal@redhat.com \
/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.