forked from AUR/linux-vfio
		
	4.0.7-2
This commit is contained in:
		
							
								
								
									
										133
									
								
								0001-block-loop-convert-to-per-device-workqueue.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								0001-block-loop-convert-to-per-device-workqueue.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,133 @@
 | 
			
		||||
From ebcacf05168d9791d39c5434164c64b9ef937171 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Ming Lei <ming.lei@canonical.com>
 | 
			
		||||
Date: Tue, 5 May 2015 19:49:54 +0800
 | 
			
		||||
Subject: [PATCH 1/2] block: loop: convert to per-device workqueue
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
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>
 | 
			
		||||
Acked-by: Tejun Heo <tj@kernel.org>
 | 
			
		||||
Signed-off-by: Jens Axboe <axboe@fb.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 d1f168b..fec06d5 100644
 | 
			
		||||
--- a/drivers/block/loop.c
 | 
			
		||||
+++ b/drivers/block/loop.c
 | 
			
		||||
@@ -85,8 +85,6 @@ static DEFINE_MUTEX(loop_index_mutex);
 | 
			
		||||
 static int max_part;
 | 
			
		||||
 static int part_shift;
 | 
			
		||||
 
 | 
			
		||||
-static struct workqueue_struct *loop_wq;
 | 
			
		||||
-
 | 
			
		||||
 /*
 | 
			
		||||
  * Transfer functions
 | 
			
		||||
  */
 | 
			
		||||
@@ -777,6 +775,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;
 | 
			
		||||
 
 | 
			
		||||
@@ -924,6 +928,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.
 | 
			
		||||
@@ -1477,9 +1483,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;
 | 
			
		||||
 		bool need_sched = true;
 | 
			
		||||
@@ -1493,9 +1503,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;
 | 
			
		||||
@@ -1507,9 +1517,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;
 | 
			
		||||
 
 | 
			
		||||
@@ -1858,13 +1865,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);
 | 
			
		||||
 
 | 
			
		||||
@@ -1902,8 +1902,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;
 | 
			
		||||
-- 
 | 
			
		||||
2.4.5
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										52
									
								
								0002-block-loop-avoiding-too-many-pending-per-work-I-O.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								0002-block-loop-avoiding-too-many-pending-per-work-I-O.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
From 02a6b08b2706501fb0fe6ff2df2f7d8377f2f69b Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Ming Lei <ming.lei@canonical.com>
 | 
			
		||||
Date: Tue, 5 May 2015 19:49:55 +0800
 | 
			
		||||
Subject: [PATCH 2/2] block: loop: avoiding too many pending per work I/O
 | 
			
		||||
 | 
			
		||||
If there are too many pending per work I/O, too many
 | 
			
		||||
high priority work thread can be generated so that
 | 
			
		||||
system performance can be effected.
 | 
			
		||||
 | 
			
		||||
This patch limits the max_active parameter of workqueue as 16.
 | 
			
		||||
 | 
			
		||||
This patch fixes Fedora 22 live booting performance
 | 
			
		||||
regression when it is booted from squashfs over dm
 | 
			
		||||
based on loop, and looks the following reasons are
 | 
			
		||||
related with the problem:
 | 
			
		||||
 | 
			
		||||
- not like other filesyststems(such as ext4), squashfs
 | 
			
		||||
is a bit special, and I observed that increasing I/O jobs
 | 
			
		||||
to access file in squashfs only improve I/O performance a
 | 
			
		||||
little, but it can make big difference for ext4
 | 
			
		||||
 | 
			
		||||
- nested loop: both squashfs.img and ext3fs.img are mounted
 | 
			
		||||
as loop block, and ext3fs.img is inside the squashfs
 | 
			
		||||
 | 
			
		||||
- during booting, lots of tasks may run concurrently
 | 
			
		||||
 | 
			
		||||
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>
 | 
			
		||||
Acked-by: Tejun Heo <tj@kernel.org>
 | 
			
		||||
Signed-off-by: Jens Axboe <axboe@fb.com>
 | 
			
		||||
---
 | 
			
		||||
 drivers/block/loop.c | 2 +-
 | 
			
		||||
 1 file changed, 1 insertion(+), 1 deletion(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
 | 
			
		||||
index fec06d5..daaaf70 100644
 | 
			
		||||
--- a/drivers/block/loop.c
 | 
			
		||||
+++ b/drivers/block/loop.c
 | 
			
		||||
@@ -777,7 +777,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
 | 
			
		||||
 		goto out_putf;
 | 
			
		||||
 	error = -ENOMEM;
 | 
			
		||||
 	lo->wq = alloc_workqueue("kloopd%d",
 | 
			
		||||
-			WQ_MEM_RECLAIM | WQ_HIGHPRI | WQ_UNBOUND, 0,
 | 
			
		||||
+			WQ_MEM_RECLAIM | WQ_HIGHPRI | WQ_UNBOUND, 16,
 | 
			
		||||
 			lo->lo_number);
 | 
			
		||||
 	if (!lo->wq)
 | 
			
		||||
 		goto out_putf;
 | 
			
		||||
-- 
 | 
			
		||||
2.4.5
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										11
									
								
								PKGBUILD
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								PKGBUILD
									
									
									
									
									
								
							@@ -3,7 +3,7 @@
 | 
			
		||||
pkgbase=linux-vfio
 | 
			
		||||
_srcname=linux-4.0
 | 
			
		||||
pkgver=4.0.7
 | 
			
		||||
pkgrel=1
 | 
			
		||||
pkgrel=2
 | 
			
		||||
arch=('i686' 'x86_64')
 | 
			
		||||
url="http://www.kernel.org/"
 | 
			
		||||
license=('GPL2')
 | 
			
		||||
@@ -17,6 +17,8 @@ source=("https://www.kernel.org/pub/linux/kernel/v4.x/${_srcname}.tar.xz"
 | 
			
		||||
        'config' 'config.x86_64'
 | 
			
		||||
        # standard config files for mkinitcpio ramdisk
 | 
			
		||||
        'linux.preset'
 | 
			
		||||
        '0001-block-loop-convert-to-per-device-workqueue.patch'
 | 
			
		||||
        '0002-block-loop-avoiding-too-many-pending-per-work-I-O.patch'
 | 
			
		||||
        'change-default-console-loglevel.patch'
 | 
			
		||||
        'override_for_missing_acs_capabilities.patch'
 | 
			
		||||
        'i915_317.patch'
 | 
			
		||||
@@ -28,6 +30,8 @@ sha256sums=('0f2f7d44979bc8f71c4fc5d3308c03499c26a824dd311fdf6eef4dee0d7d5991'
 | 
			
		||||
            'e8d639582697f22333a96aa1614bcf5d9bcf2e6683a3d5296f9cfc64843606f1'
 | 
			
		||||
            '5dadd75693e512b77f87f5620e470405b943373613eaf4df561037e9296453be'
 | 
			
		||||
            'f0d90e756f14533ee67afda280500511a62465b4f76adcc5effa95a40045179c'
 | 
			
		||||
            '0682df710e8d23f0d420b3b01fbfe409b3911940b1a379b78d9f4a5ac8590386'
 | 
			
		||||
            'af42b1456caee0b0db8f3cc770c78083b40159260b99db4930e503ac7824eacc'
 | 
			
		||||
            '1256b241cd477b265a3c2d64bdc19ffe3c9bbcee82ea3994c590c2c76e767d99'
 | 
			
		||||
            '975f79348119bfba8dd972a9fbfe6b38484c45bfd228f2f6d48a0c02426ba149'
 | 
			
		||||
            'f86ce528b63f198b84c4d8d92d35329aa4000d462217dc2db03bac5eb693cf19')
 | 
			
		||||
@@ -49,6 +53,11 @@ prepare() {
 | 
			
		||||
  # add latest fixes from stable queue, if needed
 | 
			
		||||
  # http://git.kernel.org/?p=linux/kernel/git/stable/stable-queue.git
 | 
			
		||||
 | 
			
		||||
  # Fix deadlock with stacked loop devices (FS#45129)
 | 
			
		||||
  # http://marc.info/?l=linux-kernel&m=143280649731902&w=2
 | 
			
		||||
  patch -Np1 -i ../0001-block-loop-convert-to-per-device-workqueue.patch
 | 
			
		||||
  patch -Np1 -i ../0002-block-loop-avoiding-too-many-pending-per-work-I-O.patch
 | 
			
		||||
 | 
			
		||||
  # set DEFAULT_CONSOLE_LOGLEVEL to 4 (same value as the 'quiet' kernel param)
 | 
			
		||||
  # remove this when a Kconfig knob is made available by upstream
 | 
			
		||||
  # (relevant patch sent upstream: https://lkml.org/lkml/2011/7/26/227)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user