From: Dave Kleikamp <dave.kleikamp@oracle.com>
To: Ming Lei <ming.lei@canonical.com>, Jens Axboe <axboe@kernel.dk>,
linux-kernel@vger.kernel.org
Cc: "Justin M. Forbes" <jforbes@fedoraproject.org>,
Jeff Moyer <jmoyer@redhat.com>, Tejun Heo <tj@kernel.org>,
Christoph Hellwig <hch@infradead.org>,
"v4.0" <stable@vger.kernel.org>
Subject: Re: [PATCH 1/2] block: loop: convert to per-device workqueue
Date: Tue, 26 May 2015 17:29:29 -0500 [thread overview]
Message-ID: <5564F3C9.70707@oracle.com> (raw)
In-Reply-To: <1430826595-5888-2-git-send-email-ming.lei@canonical.com>
On 05/05/2015 06:49 AM, Ming Lei wrote:
> Documentation/workqueue.txt:
> If there is dependency among multiple work items used
> during memory reclaim, they should be queued to separate
> wq each with WQ_MEM_RECLAIM.
>
> Loop devices can be stacked, so we have to convert to per-device
> workqueue. One example is Fedora live CD.
I'm just now looking at this, but I found a minor nit. I'm not sure if
it's worth replacing the patch or just fixing it with a trivial cleanup
patch.
>
> Fixes: b5dd2f6047ca108001328aac0e8588edd15f1778
> Cc: stable@vger.kernel.org (v4.0)
> Cc: Justin M. Forbes <jforbes@fedoraproject.org>
> Signed-off-by: Ming Lei <ming.lei@canonical.com>
> ---
> drivers/block/loop.c | 30 ++++++++++++++----------------
> drivers/block/loop.h | 1 +
> 2 files changed, 15 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/block/loop.c b/drivers/block/loop.c
> index ae3fcb4..3dc1598 100644
> --- a/drivers/block/loop.c
> +++ b/drivers/block/loop.c
> @@ -86,8 +86,6 @@ static DEFINE_MUTEX(loop_index_mutex);
> static int max_part;
> static int part_shift;
>
> -static struct workqueue_struct *loop_wq;
> -
> static int transfer_xor(struct loop_device *lo, int cmd,
> struct page *raw_page, unsigned raw_off,
> struct page *loop_page, unsigned loop_off,
> @@ -725,6 +723,12 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
> size = get_loop_size(lo, file);
> if ((loff_t)(sector_t)size != size)
> goto out_putf;
> + error = -ENOMEM;
> + lo->wq = alloc_workqueue("kloopd%d",
> + WQ_MEM_RECLAIM | WQ_HIGHPRI | WQ_UNBOUND, 0,
> + lo->lo_number);
> + if (!lo->wq)
> + goto out_putf;
>
> error = 0;
>
> @@ -872,6 +876,8 @@ static int loop_clr_fd(struct loop_device *lo)
> lo->lo_flags = 0;
> if (!part_shift)
> lo->lo_disk->flags |= GENHD_FL_NO_PART_SCAN;
> + destroy_workqueue(lo->wq);
> + lo->wq = NULL;
> mutex_unlock(&lo->lo_ctl_mutex);
> /*
> * Need not hold lo_ctl_mutex to fput backing file.
> @@ -1425,9 +1431,13 @@ static int loop_queue_rq(struct blk_mq_hw_ctx *hctx,
> const struct blk_mq_queue_data *bd)
> {
> struct loop_cmd *cmd = blk_mq_rq_to_pdu(bd->rq);
> + struct loop_device *lo = cmd->rq->q->queuedata;
>
> blk_mq_start_request(bd->rq);
>
> + if (lo->lo_state != Lo_bound)
> + return -EIO;
> +
> if (cmd->rq->cmd_flags & REQ_WRITE) {
> struct loop_device *lo = cmd->rq->q->queuedata;
The above definition of lo becomes redundant now.
> bool need_sched = true;
> @@ -1441,9 +1451,9 @@ static int loop_queue_rq(struct blk_mq_hw_ctx *hctx,
> spin_unlock_irq(&lo->lo_lock);
>
> if (need_sched)
> - queue_work(loop_wq, &lo->write_work);
> + queue_work(lo->wq, &lo->write_work);
> } else {
> - queue_work(loop_wq, &cmd->read_work);
> + queue_work(lo->wq, &cmd->read_work);
> }
>
> return BLK_MQ_RQ_QUEUE_OK;
> @@ -1455,9 +1465,6 @@ static void loop_handle_cmd(struct loop_cmd *cmd)
> struct loop_device *lo = cmd->rq->q->queuedata;
> int ret = -EIO;
>
> - if (lo->lo_state != Lo_bound)
> - goto failed;
> -
> if (write && (lo->lo_flags & LO_FLAGS_READ_ONLY))
> goto failed;
>
> @@ -1806,13 +1813,6 @@ static int __init loop_init(void)
> goto misc_out;
> }
>
> - loop_wq = alloc_workqueue("kloopd",
> - WQ_MEM_RECLAIM | WQ_HIGHPRI | WQ_UNBOUND, 0);
> - if (!loop_wq) {
> - err = -ENOMEM;
> - goto misc_out;
> - }
> -
> blk_register_region(MKDEV(LOOP_MAJOR, 0), range,
> THIS_MODULE, loop_probe, NULL, NULL);
>
> @@ -1850,8 +1850,6 @@ static void __exit loop_exit(void)
> blk_unregister_region(MKDEV(LOOP_MAJOR, 0), range);
> unregister_blkdev(LOOP_MAJOR, "loop");
>
> - destroy_workqueue(loop_wq);
> -
> misc_deregister(&loop_misc);
> }
>
> diff --git a/drivers/block/loop.h b/drivers/block/loop.h
> index 301c27f..49564ed 100644
> --- a/drivers/block/loop.h
> +++ b/drivers/block/loop.h
> @@ -54,6 +54,7 @@ struct loop_device {
> gfp_t old_gfp_mask;
>
> spinlock_t lo_lock;
> + struct workqueue_struct *wq;
> struct list_head write_cmd_head;
> struct work_struct write_work;
> bool write_started;
>
next prev parent reply other threads:[~2015-05-26 22:30 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-05 11:49 [PATCH 0/2] block: loop: fix stacked loop and performance regression Ming Lei
2015-05-05 11:49 ` [PATCH 1/2] block: loop: convert to per-device workqueue Ming Lei
2015-05-05 14:00 ` Tejun Heo
2015-05-26 22:29 ` Dave Kleikamp [this message]
2015-05-05 11:49 ` [PATCH 2/2] block: loop: avoiding too many pending per work I/O Ming Lei
2015-05-05 13:59 ` Tejun Heo
2015-05-05 14:46 ` Ming Lei
2015-05-05 16:55 ` Tejun Heo
2015-05-06 3:14 ` Ming Lei
2015-05-06 5:17 ` Ming Lei
2015-05-06 7:36 ` Christoph Hellwig
2015-05-06 11:43 ` Ming Lei
2015-05-22 12:36 ` Josh Boyer
2015-05-22 13:32 ` Ming Lei
2015-05-05 19:01 ` [PATCH 0/2] block: loop: fix stacked loop and performance regression Justin M. Forbes
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=5564F3C9.70707@oracle.com \
--to=dave.kleikamp@oracle.com \
--cc=axboe@kernel.dk \
--cc=hch@infradead.org \
--cc=jforbes@fedoraproject.org \
--cc=jmoyer@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=ming.lei@canonical.com \
--cc=stable@vger.kernel.org \
--cc=tj@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.