From: Bob Liu <bob.liu@oracle.com> To: xen-devel@lists.xen.org Cc: david.vrabel@citrix.com, linux-kernel@vger.kernel.org, roger.pau@citrix.com, konrad.wilk@oracle.com, felipe.franciosi@citrix.com, axboe@fb.com, hch@infradead.org, avanzini.arianna@gmail.com, Bob Liu <bob.liu@oracle.com> Subject: [PATCH 03/10] xen/blkfront: reorg info->io_lock after using blk-mq API Date: Sun, 15 Feb 2015 16:18:58 +0800 [thread overview] Message-ID: <1423988345-4005-4-git-send-email-bob.liu@oracle.com> (raw) In-Reply-To: <1423988345-4005-1-git-send-email-bob.liu@oracle.com> Drop unnecessary holding of info->io_lock when calling into blk-mq apis. Signed-off-by: Bob Liu <bob.liu@oracle.com> --- drivers/block/xen-blkfront.c | 38 ++++++++++++++++---------------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 3589436..5a90a51 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -614,25 +614,28 @@ static int blk_mq_queue_rq(struct blk_mq_hw_ctx *hctx, blk_mq_start_request(qd->rq); spin_lock_irq(&info->io_lock); if (RING_FULL(&info->ring)) { + spin_unlock_irq(&info->io_lock); blk_mq_stop_hw_queue(hctx); ret = BLK_MQ_RQ_QUEUE_BUSY; goto out; } if (blkif_request_flush_invalid(qd->rq, info)) { + spin_unlock_irq(&info->io_lock); ret = BLK_MQ_RQ_QUEUE_ERROR; goto out; } if (blkif_queue_request(qd->rq)) { + spin_unlock_irq(&info->io_lock); blk_mq_stop_hw_queue(hctx); ret = BLK_MQ_RQ_QUEUE_BUSY; goto out; } flush_requests(info); -out: spin_unlock_irq(&info->io_lock); +out: return ret; } @@ -891,19 +894,15 @@ static int xlvbd_alloc_gendisk(blkif_sector_t capacity, static void xlvbd_release_gendisk(struct blkfront_info *info) { unsigned int minor, nr_minors; - unsigned long flags; if (info->rq == NULL) return; - spin_lock_irqsave(&info->io_lock, flags); - /* No more blkif_request(). */ blk_mq_stop_hw_queues(info->rq); /* No more gnttab callback work. */ gnttab_cancel_free_callback(&info->callback); - spin_unlock_irqrestore(&info->io_lock, flags); /* Flush gnttab callback work. Must be done with no locks held. */ flush_work(&info->work); @@ -922,21 +921,25 @@ static void xlvbd_release_gendisk(struct blkfront_info *info) info->gd = NULL; } -/* Called with info->io_lock holded */ static void kick_pending_request_queues(struct blkfront_info *info) { - if (!RING_FULL(&info->ring)) + unsigned long flags; + + spin_lock_irqsave(&info->io_lock, flags); + if (!RING_FULL(&info->ring)) { + spin_unlock_irqrestore(&info->io_lock, flags); blk_mq_start_stopped_hw_queues(info->rq, true); + return; + } + spin_unlock_irqrestore(&info->io_lock, flags); } static void blkif_restart_queue(struct work_struct *work) { struct blkfront_info *info = container_of(work, struct blkfront_info, work); - spin_lock_irq(&info->io_lock); if (info->connected == BLKIF_STATE_CONNECTED) kick_pending_request_queues(info); - spin_unlock_irq(&info->io_lock); } static void blkif_free(struct blkfront_info *info, int suspend) @@ -946,13 +949,13 @@ static void blkif_free(struct blkfront_info *info, int suspend) int i, j, segs; /* Prevent new requests being issued until we fix things up. */ - spin_lock_irq(&info->io_lock); info->connected = suspend ? BLKIF_STATE_SUSPENDED : BLKIF_STATE_DISCONNECTED; /* No more blkif_request(). */ if (info->rq) blk_mq_stop_hw_queues(info->rq); + spin_lock_irq(&info->io_lock); /* Remove all persistent grants */ if (!list_empty(&info->grants)) { list_for_each_entry_safe(persistent_gnt, n, @@ -1136,13 +1139,10 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) unsigned long flags; struct blkfront_info *info = (struct blkfront_info *)dev_id; - spin_lock_irqsave(&info->io_lock, flags); - - if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) { - spin_unlock_irqrestore(&info->io_lock, flags); + if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) return IRQ_HANDLED; - } + spin_lock_irqsave(&info->io_lock, flags); again: rp = info->ring.sring->rsp_prod; rmb(); /* Ensure we see queued responses up to 'rp'. */ @@ -1233,9 +1233,8 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) } else info->ring.sring->rsp_event = i + 1; - kick_pending_request_queues(info); - spin_unlock_irqrestore(&info->io_lock, flags); + kick_pending_request_queues(info); return IRQ_HANDLED; } @@ -1518,8 +1517,6 @@ static int blkif_recover(struct blkfront_info *info) xenbus_switch_state(info->xbdev, XenbusStateConnected); - spin_lock_irq(&info->io_lock); - /* Now safe for us to use the shared ring */ info->connected = BLKIF_STATE_CONNECTED; @@ -1533,7 +1530,6 @@ static int blkif_recover(struct blkfront_info *info) blk_mq_requeue_request(req); } blk_mq_kick_requeue_list(info->rq); - spin_unlock_irq(&info->io_lock); while ((bio = bio_list_pop(&bio_list)) != NULL) { /* Traverse the list of pending bios and re-queue them */ @@ -1863,10 +1859,8 @@ static void blkfront_connect(struct blkfront_info *info) xenbus_switch_state(info->xbdev, XenbusStateConnected); /* Kick pending requests. */ - spin_lock_irq(&info->io_lock); info->connected = BLKIF_STATE_CONNECTED; kick_pending_request_queues(info); - spin_unlock_irq(&info->io_lock); add_disk(info->gd); -- 1.8.3.1
WARNING: multiple messages have this Message-ID (diff)
From: Bob Liu <bob.liu@oracle.com> To: xen-devel@lists.xen.org Cc: hch@infradead.org, felipe.franciosi@citrix.com, linux-kernel@vger.kernel.org, axboe@fb.com, Bob Liu <bob.liu@oracle.com>, david.vrabel@citrix.com, avanzini.arianna@gmail.com, roger.pau@citrix.com Subject: [PATCH 03/10] xen/blkfront: reorg info->io_lock after using blk-mq API Date: Sun, 15 Feb 2015 16:18:58 +0800 [thread overview] Message-ID: <1423988345-4005-4-git-send-email-bob.liu@oracle.com> (raw) In-Reply-To: <1423988345-4005-1-git-send-email-bob.liu@oracle.com> Drop unnecessary holding of info->io_lock when calling into blk-mq apis. Signed-off-by: Bob Liu <bob.liu@oracle.com> --- drivers/block/xen-blkfront.c | 38 ++++++++++++++++---------------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 3589436..5a90a51 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -614,25 +614,28 @@ static int blk_mq_queue_rq(struct blk_mq_hw_ctx *hctx, blk_mq_start_request(qd->rq); spin_lock_irq(&info->io_lock); if (RING_FULL(&info->ring)) { + spin_unlock_irq(&info->io_lock); blk_mq_stop_hw_queue(hctx); ret = BLK_MQ_RQ_QUEUE_BUSY; goto out; } if (blkif_request_flush_invalid(qd->rq, info)) { + spin_unlock_irq(&info->io_lock); ret = BLK_MQ_RQ_QUEUE_ERROR; goto out; } if (blkif_queue_request(qd->rq)) { + spin_unlock_irq(&info->io_lock); blk_mq_stop_hw_queue(hctx); ret = BLK_MQ_RQ_QUEUE_BUSY; goto out; } flush_requests(info); -out: spin_unlock_irq(&info->io_lock); +out: return ret; } @@ -891,19 +894,15 @@ static int xlvbd_alloc_gendisk(blkif_sector_t capacity, static void xlvbd_release_gendisk(struct blkfront_info *info) { unsigned int minor, nr_minors; - unsigned long flags; if (info->rq == NULL) return; - spin_lock_irqsave(&info->io_lock, flags); - /* No more blkif_request(). */ blk_mq_stop_hw_queues(info->rq); /* No more gnttab callback work. */ gnttab_cancel_free_callback(&info->callback); - spin_unlock_irqrestore(&info->io_lock, flags); /* Flush gnttab callback work. Must be done with no locks held. */ flush_work(&info->work); @@ -922,21 +921,25 @@ static void xlvbd_release_gendisk(struct blkfront_info *info) info->gd = NULL; } -/* Called with info->io_lock holded */ static void kick_pending_request_queues(struct blkfront_info *info) { - if (!RING_FULL(&info->ring)) + unsigned long flags; + + spin_lock_irqsave(&info->io_lock, flags); + if (!RING_FULL(&info->ring)) { + spin_unlock_irqrestore(&info->io_lock, flags); blk_mq_start_stopped_hw_queues(info->rq, true); + return; + } + spin_unlock_irqrestore(&info->io_lock, flags); } static void blkif_restart_queue(struct work_struct *work) { struct blkfront_info *info = container_of(work, struct blkfront_info, work); - spin_lock_irq(&info->io_lock); if (info->connected == BLKIF_STATE_CONNECTED) kick_pending_request_queues(info); - spin_unlock_irq(&info->io_lock); } static void blkif_free(struct blkfront_info *info, int suspend) @@ -946,13 +949,13 @@ static void blkif_free(struct blkfront_info *info, int suspend) int i, j, segs; /* Prevent new requests being issued until we fix things up. */ - spin_lock_irq(&info->io_lock); info->connected = suspend ? BLKIF_STATE_SUSPENDED : BLKIF_STATE_DISCONNECTED; /* No more blkif_request(). */ if (info->rq) blk_mq_stop_hw_queues(info->rq); + spin_lock_irq(&info->io_lock); /* Remove all persistent grants */ if (!list_empty(&info->grants)) { list_for_each_entry_safe(persistent_gnt, n, @@ -1136,13 +1139,10 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) unsigned long flags; struct blkfront_info *info = (struct blkfront_info *)dev_id; - spin_lock_irqsave(&info->io_lock, flags); - - if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) { - spin_unlock_irqrestore(&info->io_lock, flags); + if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) return IRQ_HANDLED; - } + spin_lock_irqsave(&info->io_lock, flags); again: rp = info->ring.sring->rsp_prod; rmb(); /* Ensure we see queued responses up to 'rp'. */ @@ -1233,9 +1233,8 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) } else info->ring.sring->rsp_event = i + 1; - kick_pending_request_queues(info); - spin_unlock_irqrestore(&info->io_lock, flags); + kick_pending_request_queues(info); return IRQ_HANDLED; } @@ -1518,8 +1517,6 @@ static int blkif_recover(struct blkfront_info *info) xenbus_switch_state(info->xbdev, XenbusStateConnected); - spin_lock_irq(&info->io_lock); - /* Now safe for us to use the shared ring */ info->connected = BLKIF_STATE_CONNECTED; @@ -1533,7 +1530,6 @@ static int blkif_recover(struct blkfront_info *info) blk_mq_requeue_request(req); } blk_mq_kick_requeue_list(info->rq); - spin_unlock_irq(&info->io_lock); while ((bio = bio_list_pop(&bio_list)) != NULL) { /* Traverse the list of pending bios and re-queue them */ @@ -1863,10 +1859,8 @@ static void blkfront_connect(struct blkfront_info *info) xenbus_switch_state(info->xbdev, XenbusStateConnected); /* Kick pending requests. */ - spin_lock_irq(&info->io_lock); info->connected = BLKIF_STATE_CONNECTED; kick_pending_request_queues(info); - spin_unlock_irq(&info->io_lock); add_disk(info->gd); -- 1.8.3.1
next prev parent reply other threads:[~2015-02-15 8:22 UTC|newest] Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-02-15 8:18 [RFC PATCH 00/10] Multi-queue support for xen-block driver Bob Liu 2015-02-15 8:18 ` Bob Liu 2015-02-15 8:18 ` [PATCH 01/10] xen/blkfront: convert to blk-mq API Bob Liu 2015-02-15 8:18 ` Bob Liu 2015-02-15 8:18 ` [PATCH 02/10] xen/blkfront: drop legacy block layer support Bob Liu 2015-02-18 17:02 ` Christoph Hellwig 2015-02-18 17:02 ` Christoph Hellwig 2015-02-15 8:18 ` Bob Liu 2015-02-15 8:18 ` Bob Liu [this message] 2015-02-15 8:18 ` [PATCH 03/10] xen/blkfront: reorg info->io_lock after using blk-mq API Bob Liu 2015-02-18 17:05 ` Christoph Hellwig 2015-02-19 2:07 ` Bob Liu 2015-02-19 2:07 ` Bob Liu 2015-02-18 17:05 ` Christoph Hellwig 2015-02-15 8:18 ` [PATCH 04/10] xen/blkfront: separate ring information to an new struct Bob Liu 2015-02-15 8:18 ` Bob Liu 2015-02-18 17:28 ` Roger Pau Monné 2015-02-18 17:37 ` Konrad Rzeszutek Wilk 2015-02-18 17:37 ` Konrad Rzeszutek Wilk 2015-02-18 18:08 ` Felipe Franciosi 2015-02-18 18:29 ` Konrad Rzeszutek Wilk 2015-02-18 18:29 ` Konrad Rzeszutek Wilk 2015-02-19 2:05 ` Bob Liu 2015-02-19 2:05 ` Bob Liu 2015-02-19 11:08 ` Roger Pau Monné 2015-02-19 11:08 ` Roger Pau Monné 2015-02-19 11:14 ` David Vrabel 2015-02-19 11:14 ` David Vrabel 2015-02-19 12:06 ` Felipe Franciosi 2015-02-19 13:12 ` Roger Pau Monné 2015-02-19 13:12 ` Roger Pau Monné 2015-02-20 18:59 ` Konrad Rzeszutek Wilk 2015-02-20 18:59 ` Konrad Rzeszutek Wilk 2015-02-27 12:52 ` Bob Liu 2015-02-27 12:52 ` Bob Liu 2015-03-04 21:21 ` Konrad Rzeszutek Wilk 2015-03-04 21:21 ` Konrad Rzeszutek Wilk 2015-03-05 0:47 ` Bob Liu 2015-03-05 0:47 ` Bob Liu 2015-03-06 10:30 ` Felipe Franciosi 2015-03-06 10:30 ` Felipe Franciosi 2015-03-17 7:00 ` Bob Liu 2015-03-17 7:00 ` Bob Liu 2015-03-17 14:52 ` Felipe Franciosi 2015-03-17 14:52 ` Felipe Franciosi 2015-03-18 0:52 ` Bob Liu 2015-03-18 0:52 ` Bob Liu 2015-02-19 12:06 ` Felipe Franciosi 2015-02-19 11:30 ` Malcolm Crossley 2015-02-18 18:08 ` Felipe Franciosi 2015-02-18 17:28 ` Roger Pau Monné 2015-02-15 8:19 ` [PATCH 05/10] xen/blkback: separate ring information out of struct xen_blkif Bob Liu 2015-02-15 8:19 ` Bob Liu 2015-02-15 8:19 ` [PATCH 06/10] xen/blkfront: pseudo support for multi hardware queues Bob Liu 2015-02-15 8:19 ` Bob Liu 2015-02-15 8:19 ` [PATCH 07/10] xen/blkback: " Bob Liu 2015-02-15 8:19 ` Bob Liu 2015-02-19 16:57 ` David Vrabel 2015-02-19 16:57 ` [Xen-devel] " David Vrabel 2015-02-15 8:19 ` [PATCH 08/10] xen/blkfront: negotiate hardware queue number with backend Bob Liu 2015-02-15 8:19 ` Bob Liu 2015-02-15 8:19 ` [PATCH 09/10] xen/blkback: get hardware queue number from blkfront Bob Liu 2015-02-15 8:19 ` Bob Liu 2015-02-15 8:19 ` [PATCH 10/10] xen/blkfront: use work queue to fast blkif interrupt return Bob Liu 2015-02-19 16:51 ` [Xen-devel] " David Vrabel 2015-02-19 16:51 ` David Vrabel 2015-02-15 8:19 ` Bob Liu 2015-02-18 17:01 ` [RFC PATCH 00/10] Multi-queue support for xen-block driver Christoph Hellwig 2015-02-18 17:01 ` Christoph Hellwig 2015-02-18 18:22 ` Felipe Franciosi 2015-02-18 18:22 ` Felipe Franciosi 2015-02-19 2:04 ` Bob Liu 2015-02-19 2:04 ` Bob Liu
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=1423988345-4005-4-git-send-email-bob.liu@oracle.com \ --to=bob.liu@oracle.com \ --cc=avanzini.arianna@gmail.com \ --cc=axboe@fb.com \ --cc=david.vrabel@citrix.com \ --cc=felipe.franciosi@citrix.com \ --cc=hch@infradead.org \ --cc=konrad.wilk@oracle.com \ --cc=linux-kernel@vger.kernel.org \ --cc=roger.pau@citrix.com \ --cc=xen-devel@lists.xen.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: linkBe 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.