lightnvm: limit get chunk meta request size
authorMatias Bjørling <mb@lightnvm.io>
Fri, 13 Jul 2018 08:48:41 +0000 (10:48 +0200)
committerJens Axboe <axboe@kernel.dk>
Fri, 13 Jul 2018 14:14:41 +0000 (08:14 -0600)
For devices that does not specify a limit on its transfer size, the
get_chk_meta command may send down a single I/O retrieving the full
chunk metadata table. Resulting in large 2-4MB I/O requests. Instead,
split up the I/Os to a maximum of 256KB and issue them separately to
reduce memory requirements.

Signed-off-by: Matias Bjørling <mb@lightnvm.io>
Reviewed-by: Javier González <javier@cnexlabs.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/nvme/host/lightnvm.c

index a76db8820f1c99e98b7c4acdb4dffd64c3f0369b..d9e4cccd5b66c0798f24ce08e6e6f80cf7ad9d42 100644 (file)
@@ -583,7 +583,13 @@ static int nvme_nvm_get_chk_meta(struct nvm_dev *ndev,
        struct ppa_addr ppa;
        size_t left = nchks * sizeof(struct nvme_nvm_chk_meta);
        size_t log_pos, offset, len;
-       int ret, i;
+       int ret, i, max_len;
+
+       /*
+        * limit requests to maximum 256K to avoid issuing arbitrary large
+        * requests when the device does not specific a maximum transfer size.
+        */
+       max_len = min_t(unsigned int, ctrl->max_hw_sectors << 9, 256 * 1024);
 
        /* Normalize lba address space to obtain log offset */
        ppa.ppa = slba;
@@ -596,7 +602,7 @@ static int nvme_nvm_get_chk_meta(struct nvm_dev *ndev,
        offset = log_pos * sizeof(struct nvme_nvm_chk_meta);
 
        while (left) {
-               len = min_t(unsigned int, left, ctrl->max_hw_sectors << 9);
+               len = min_t(unsigned int, left, max_len);
 
                ret = nvme_get_log_ext(ctrl, ns, NVME_NVM_LOG_REPORT_CHUNK,
                                dev_meta, len, offset);