Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757949AbbEVSXU (ORCPT ); Fri, 22 May 2015 14:23:20 -0400 Received: from mailout4.samsung.com ([203.254.224.34]:16176 "EHLO mailout4.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757396AbbEVSTZ (ORCPT ); Fri, 22 May 2015 14:19:25 -0400 X-AuditID: cbfee61b-f79416d0000014c0-f1-555f732b1179 From: Ming Lin To: linux-kernel@vger.kernel.org Cc: Christoph Hellwig , Kent Overstreet , Jens Axboe , Dongsu Park , Ming Lin Subject: [PATCH v4 05/11] block: remove split code in blkdev_issue_discard Date: Fri, 22 May 2015 11:18:37 -0700 Message-id: <1432318723-18829-6-git-send-email-mlin@kernel.org> X-Mailer: git-send-email 1.9.1 In-reply-to: <1432318723-18829-1-git-send-email-mlin@kernel.org> References: <1432318723-18829-1-git-send-email-mlin@kernel.org> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprILMWRmVeSWpSXmKPExsVy+t9jAV2d4vhQg50L2CxW3+1ns9gx4ymT xcrVR5ksjjRVWVzeNYfN4vy2k6wObB47Z91l97h8ttRj06pONo/dNxvYPB4fPsnu8XmTXABb FJdNSmpOZllqkb5dAlfG5qvn2QsWSVV0fehmbmB8JNLFyMkhIWAi8Xn7VGYIW0ziwr31bF2M XBxCAosYJZpW9LNAOD8ZJV6vOsoKUsUmoCBxcN0GJhBbBMje3PsMLM4ssJZRouODJogtLOAl sWzNVLAaFgFViZVbm9hBbF4Be4nHu84xQmyTkzh5bDJQLwcHp4CDxO5dHiBhIaCSdevmMk5g 5F3AyLCKUTS1ILmgOCk910ivODG3uDQvXS85P3cTIzignknvYFzVYHGIUYCDUYmH1+BgXKgQ a2JZcWXuIUYJDmYlEV5dv/hQId6UxMqq1KL8+KLSnNTiQ4zSHCxK4rwn831ChQTSE0tSs1NT C1KLYLJMHJxSDYxObPPmJnIvZfyh+azpyws/v3kKrF+2G8zecW9JMN8Zp/Un1vGd9uouvnMy atUH9gSZHOmN1XmKMl/ifgh4MSuv7fV0YuDf/j3k/f3V62rvKXv0R0ywMOVMsmzlYNJQ8dD1 Tvywj6f0VPaHlWGLdv95f9wrNqLOtuZ3qEPCtke8/DP4laP3PlZiKc5INNRiLipOBAAmg3X0 JAIAAA== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3490 Lines: 122 The split code in blkdev_issue_discard() can go away now that any driver that cares does the split. Signed-off-by: Ming Lin --- block/blk-lib.c | 73 +++++++++++---------------------------------------------- 1 file changed, 14 insertions(+), 59 deletions(-) diff --git a/block/blk-lib.c b/block/blk-lib.c index 7688ee3..3bf3c4a 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -43,34 +43,17 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, DECLARE_COMPLETION_ONSTACK(wait); struct request_queue *q = bdev_get_queue(bdev); int type = REQ_WRITE | REQ_DISCARD; - unsigned int max_discard_sectors, granularity; - int alignment; struct bio_batch bb; struct bio *bio; int ret = 0; struct blk_plug plug; - if (!q) + if (!q || !nr_sects) return -ENXIO; if (!blk_queue_discard(q)) return -EOPNOTSUPP; - /* Zero-sector (unknown) and one-sector granularities are the same. */ - granularity = max(q->limits.discard_granularity >> 9, 1U); - alignment = (bdev_discard_alignment(bdev) >> 9) % granularity; - - /* - * Ensure that max_discard_sectors is of the proper - * granularity, so that requests stay aligned after a split. - */ - max_discard_sectors = min(q->limits.max_discard_sectors, UINT_MAX >> 9); - max_discard_sectors -= max_discard_sectors % granularity; - if (unlikely(!max_discard_sectors)) { - /* Avoid infinite loop below. Being cautious never hurts. */ - return -EOPNOTSUPP; - } - if (flags & BLKDEV_DISCARD_SECURE) { if (!blk_queue_secdiscard(q)) return -EOPNOTSUPP; @@ -82,52 +65,24 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, bb.wait = &wait; blk_start_plug(&plug); - while (nr_sects) { - unsigned int req_sects; - sector_t end_sect, tmp; - bio = bio_alloc(gfp_mask, 1); - if (!bio) { - ret = -ENOMEM; - break; - } + bio = bio_alloc(gfp_mask, 1); + if (!bio) { + ret = -ENOMEM; + goto out; + } - req_sects = min_t(sector_t, nr_sects, max_discard_sectors); - - /* - * If splitting a request, and the next starting sector would be - * misaligned, stop the discard at the previous aligned sector. - */ - end_sect = sector + req_sects; - tmp = end_sect; - if (req_sects < nr_sects && - sector_div(tmp, granularity) != alignment) { - end_sect = end_sect - alignment; - sector_div(end_sect, granularity); - end_sect = end_sect * granularity + alignment; - req_sects = end_sect - sector; - } + bio->bi_iter.bi_sector = sector; + bio->bi_end_io = bio_batch_end_io; + bio->bi_bdev = bdev; + bio->bi_private = &bb; - bio->bi_iter.bi_sector = sector; - bio->bi_end_io = bio_batch_end_io; - bio->bi_bdev = bdev; - bio->bi_private = &bb; + bio->bi_iter.bi_size = nr_sects << 9; - bio->bi_iter.bi_size = req_sects << 9; - nr_sects -= req_sects; - sector = end_sect; + atomic_inc(&bb.done); + submit_bio(type, bio); - atomic_inc(&bb.done); - submit_bio(type, bio); - - /* - * We can loop for a long time in here, if someone does - * full device discards (like mkfs). Be nice and allow - * us to schedule out to avoid softlocking if preempt - * is disabled. - */ - cond_resched(); - } +out: blk_finish_plug(&plug); /* Wait for bios in-flight */ -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/