nvme-multipath: use vmalloc for ANA log buffer
authorHannes Reinecke <hare@suse.de>
Wed, 9 Mar 2022 13:29:00 +0000 (14:29 +0100)
committerChristoph Hellwig <hch@lst.de>
Mon, 14 Mar 2022 07:43:05 +0000 (08:43 +0100)
The ANA log buffer can get really large, as it depends on the
controller configuration. So to avoid an out-of-memory issue
during scanning use kvmalloc() instead of the kmalloc().

Signed-off-by: Hannes Reinecke <hare@suse.de>
Tested-by: Daniel Wagner <dwagner@suse.de>
Signed-off-by: Daniel Wagner <dwagner@suse.de>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/multipath.c

index f8bf660..3ddc1ba 100644 (file)
@@ -5,6 +5,7 @@
 
 #include <linux/backing-dev.h>
 #include <linux/moduleparam.h>
+#include <linux/vmalloc.h>
 #include <trace/events/block.h>
 #include "nvme.h"
 
@@ -898,7 +899,7 @@ int nvme_mpath_init_identify(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
        if (ana_log_size > ctrl->ana_log_size) {
                nvme_mpath_stop(ctrl);
                nvme_mpath_uninit(ctrl);
-               ctrl->ana_log_buf = kmalloc(ana_log_size, GFP_KERNEL);
+               ctrl->ana_log_buf = kvmalloc(ana_log_size, GFP_KERNEL);
                if (!ctrl->ana_log_buf)
                        return -ENOMEM;
        }
@@ -915,7 +916,7 @@ out_uninit:
 
 void nvme_mpath_uninit(struct nvme_ctrl *ctrl)
 {
-       kfree(ctrl->ana_log_buf);
+       kvfree(ctrl->ana_log_buf);
        ctrl->ana_log_buf = NULL;
        ctrl->ana_log_size = 0;
 }