block: by default, limit maximum discard size to 64MB discard-rw
authorJens Axboe <axboe@fb.com>
Tue, 14 Jul 2015 18:42:35 +0000 (12:42 -0600)
committerJens Axboe <axboe@fb.com>
Wed, 15 Jul 2015 16:17:15 +0000 (10:17 -0600)
Lots of devices exhibit very high latencies for big discards, hurting
reads and writes. By default, limit the max discard we will build to
64MB. This value has shown good results across a number of devices.

This will potentially hurt discard throughput, from a provisioning
point of view (when the user does mkfs.xfs, for instance, and mkfs
issues a full device discard). If that becomes an issue, we could
have different behavior for provisioning vs runtime discards.

Signed-off-by: Jens Axboe <axboe@fb.com>
block/blk-settings.c
include/linux/blkdev.h

index b38d8d723276254dcb4bb2d582f7ae35ec672cfc..b98d26fcbf819f377447649d942240d419558826 100644 (file)
@@ -306,6 +306,8 @@ void blk_queue_max_discard_sectors(struct request_queue *q,
 {
        q->limits.max_hw_discard_sectors = max_discard_sectors;
        q->limits.max_discard_sectors = max_discard_sectors;
+       if (q->limits.max_discard_sectors > BLK_DISCARD_MAX_SECTORS)
+               q->limits.max_discard_sectors = BLK_DISCARD_MAX_SECTORS;
 }
 EXPORT_SYMBOL(blk_queue_max_discard_sectors);
 
index 243f29e779ec5890d40ccdad1752444ca620a098..3a01b16397c491ed57043b7e9c0d9407138a8a25 100644 (file)
@@ -1141,6 +1141,11 @@ enum blk_default_limits {
        BLK_SAFE_MAX_SECTORS    = 255,
        BLK_MAX_SEGMENT_SIZE    = 65536,
        BLK_SEG_BOUNDARY_MASK   = 0xFFFFFFFFUL,
+
+       /*
+        * Default to max 64MB of discards, to keep latencies in check
+        */
+       BLK_DISCARD_MAX_SECTORS = (64 * 1024 * 1024UL) >> 9,
 };
 
 #define blkdev_entry_to_request(entry) list_entry((entry), struct request, queuelist)