NVMe: Do not over allocate for discard requests
authorKeith Busch <keith.busch@intel.com>
Mon, 6 Oct 2014 21:23:06 +0000 (15:23 -0600)
committerJens Axboe <axboe@fb.com>
Tue, 4 Nov 2014 20:18:37 +0000 (13:18 -0700)
Discard requests are often for very large ranges. The discard size is not
representative of the data transfer size so we don't need to allocate
for such a large prp list. This patch requests allocating only enough
for the memory needed for the data transfer and saves a little over 8k
of memory per max discard request.

Signed-off-by: Keith Busch <keith.busch@intel.com>
Reported-by: Paul Grabinar <paul.grabinar@ranbarg.com>
Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
drivers/block/nvme-core.c

index fb21d365efb5f3d11240060eb91230a408ba50ed..c70eff3673d02d0ff05af2d05abc5709fff6b63e 100644 (file)
@@ -763,11 +763,13 @@ static int nvme_submit_bio_queue(struct nvme_queue *nvmeq, struct nvme_ns *ns,
        struct nvme_iod *iod;
        int psegs = bio_phys_segments(ns->queue, bio);
        int result;
+       unsigned size = !(bio->bi_rw & REQ_DISCARD) ? bio->bi_iter.bi_size :
+                                               sizeof(struct nvme_dsm_range);
 
        if ((bio->bi_rw & REQ_FLUSH) && psegs)
                return nvme_split_flush_data(nvmeq, bio);
 
-       iod = nvme_alloc_iod(psegs, bio->bi_iter.bi_size, ns->dev, GFP_ATOMIC);
+       iod = nvme_alloc_iod(psegs, size, ns->dev, GFP_ATOMIC);
        if (!iod)
                return -ENOMEM;