Patch "block: loop: convert to per-device workqueue" has been added to the 4.1-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
block: loop: convert to per-device workqueue
to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
block-loop-convert-to-per-device-workqueue.patch
and it can be found in the queue-4.1 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
f4aa4c7bbac6c4afdd4adccf90898c1a3685396dMon Sep 17 00:00:00 2001
From: Ming Lei <[email protected]>
Date: Tue, 5 May 2015 19:49:54 +0800
Subject: block: loop: convert to per-device workqueue
From: Ming Lei <[email protected]>
commit f4aa4c7bbac6c4afdd4adccf90898c1a3685396d upstream.
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.
--- drivers/block/loop.c | 30 ++++++++++++++---------------- drivers/block/loop.h | 1 + 2 files changed, 15 insertions(+), 16 deletions(-)
drivers/block/loop.c +14 -16
@@ -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_devic 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_devic 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_h 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;bool need_sched = true;
@@ -1441,9 +1451,9 @@ static int loop_queue_rq(struct blk_mq_hspin_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_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); }
drivers/block/loop.h +1 -0
@@ -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;
Patches currently in stable-queue which might be from [email protected] are
queue-4.1/block-loop-avoiding-too-many-pending-per-work-i-o.patch queue-4.1/block-loop-convert-to-per-device-workqueue.patch