alistair23-linux/drivers/block
NeilBrown b2ee7d46be loop: Add PF_LESS_THROTTLE to block/loop device thread.
When a filesystem is mounted from a loop device, writes are
throttled by balance_dirty_pages() twice: once when writing
to the filesystem and once when the loop_handle_cmd() writes
to the backing file.  This double-throttling can trigger
positive feedback loops that create significant delays.  The
throttling at the lower level is seen by the upper level as
a slow device, so it throttles extra hard.

The PF_LESS_THROTTLE flag was created to handle exactly this
circumstance, though with an NFS filesystem mounted from a
local NFS server.  It reduces the throttling on the lower
layer so that it can proceed largely unthrottled.

To demonstrate this, create a filesystem on a loop device
and write (e.g. with dd) several large files which combine
to consume significantly more than the limit set by
/proc/sys/vm/dirty_ratio or dirty_bytes.  Measure the total
time taken.

When I do this directly on a device (no loop device) the
total time for several runs (mkfs, mount, write 200 files,
umount) is fairly stable: 28-35 seconds.
When I do this over a loop device the times are much worse
and less stable.  52-460 seconds.  Half below 100seconds,
half above.
When I apply this patch, the times become stable again,
though not as fast as the no-loop-back case: 53-72 seconds.

There may be room for further improvement as the total overhead still
seems too high, but this is a big improvement.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Ming Lei <tom.leiming@gmail.com>
Suggested-by: Michal Hocko <mhocko@suse.com>
Acked-by: Michal Hocko <mhocko@suse.com>
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
2017-06-18 09:07:42 -06:00
..
aoe block: switch bios to blk_status_t 2017-06-09 09:27:32 -06:00
drbd block: switch bios to blk_status_t 2017-06-09 09:27:32 -06:00
mtip32xx blk-mq: switch ->queue_rq return value to blk_status_t 2017-06-09 09:27:32 -06:00
paride block: introduce new block status code type 2017-06-09 09:27:32 -06:00
rsxx block: switch bios to blk_status_t 2017-06-09 09:27:32 -06:00
xen-blkback block: switch bios to blk_status_t 2017-06-09 09:27:32 -06:00
zram zram: reduce load operation in page_same_filled 2017-05-03 15:52:11 -07:00
amiflop.c block: introduce new block status code type 2017-06-09 09:27:32 -06:00
ataflop.c block: introduce new block status code type 2017-06-09 09:27:32 -06:00
brd.c libnvdimm for 4.12 2017-05-05 18:49:20 -07:00
cciss.c block: introduce new block status code type 2017-06-09 09:27:32 -06:00
cciss.h SCSI misc on 20170220 2017-02-21 11:51:42 -08:00
cciss_cmd.h cciss: use new doorbell-bit-5 reset method 2011-05-06 08:23:55 -06:00
cciss_scsi.c cciss: Remove kmalloc cast 2017-02-22 11:54:49 -07:00
cciss_scsi.h cciss: add cciss_tape_cmds module paramter 2011-05-06 08:23:59 -06:00
cryptoloop.c Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
DAC960.c block: introduce new block status code type 2017-06-09 09:27:32 -06:00
DAC960.h
floppy.c block: switch bios to blk_status_t 2017-06-09 09:27:32 -06:00
Kconfig libnvdimm for 4.12 2017-05-05 18:49:20 -07:00
loop.c loop: Add PF_LESS_THROTTLE to block/loop device thread. 2017-06-18 09:07:42 -06:00
loop.h loop: support 4k physical blocksize 2017-06-08 08:40:00 -06:00
Makefile block: remove the osdblk driver 2017-04-19 09:10:51 -06:00
nbd.c Linux 4.12-rc5 2017-06-12 08:30:13 -06:00
null_blk.c blk-mq: switch ->queue_rq return value to blk_status_t 2017-06-09 09:27:32 -06:00
pktcdvd.c block: switch bios to blk_status_t 2017-06-09 09:27:32 -06:00
ps3disk.c block: introduce new block status code type 2017-06-09 09:27:32 -06:00
ps3vram.c block: switch bios to blk_status_t 2017-06-09 09:27:32 -06:00
rbd.c Linux 4.12-rc5 2017-06-12 08:30:13 -06:00
rbd_types.h rbd: RBD_V{1,2}_DATA_FORMAT macros 2017-02-20 12:16:15 +01:00
skd_main.c block: introduce new block status code type 2017-06-09 09:27:32 -06:00
skd_s1120.h skd: fix formatting in skd_s1120.h 2013-11-08 09:10:30 -07:00
smart1,2.h fix typos 'comamnd' -> 'command' in comments 2011-02-02 11:31:21 +01:00
sunvdc.c block: introduce new block status code type 2017-06-09 09:27:32 -06:00
swim.c block: introduce new block status code type 2017-06-09 09:27:32 -06:00
swim3.c block: swim3: make of_device_ids const. 2017-06-16 09:49:13 -06:00
swim_asm.S
sx8.c block: introduce new block status code type 2017-06-09 09:27:32 -06:00
umem.c block: switch bios to blk_status_t 2017-06-09 09:27:32 -06:00
umem.h
virtio_blk.c blk-mq: switch ->queue_rq return value to blk_status_t 2017-06-09 09:27:32 -06:00
xen-blkfront.c block: switch bios to blk_status_t 2017-06-09 09:27:32 -06:00
xsysace.c block: introduce new block status code type 2017-06-09 09:27:32 -06:00
z2ram.c block: introduce new block status code type 2017-06-09 09:27:32 -06:00