提交 fa8f9ac4 编写于 作者: C Christoph Hellwig

nvmet: only allocate a single slab for bvecs

There is no need to have a separate slab cache for each namespace,
and having separate ones creates duplicate debugs file names as well.

Fixes: d5eff33e ("nvmet: add simple file backed ns support")
Signed-off-by: NChristoph Hellwig <hch@lst.de>
Reviewed-by: NKeith Busch <kbusch@kernel.org>
Reviewed-by: NSagi Grimberg <sagi@grimberg.me>
Reviewed-by: NChaitanya Kulkarni <kch@nvidia.com>
Reviewed-by: NMartin K. Petersen <martin.petersen@oracle.com>
上级 2be2cd52
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "nvmet.h" #include "nvmet.h"
struct kmem_cache *nvmet_bvec_cache;
struct workqueue_struct *buffered_io_wq; struct workqueue_struct *buffered_io_wq;
struct workqueue_struct *zbd_wq; struct workqueue_struct *zbd_wq;
static const struct nvmet_fabrics_ops *nvmet_transports[NVMF_TRTYPE_MAX]; static const struct nvmet_fabrics_ops *nvmet_transports[NVMF_TRTYPE_MAX];
...@@ -1630,26 +1631,28 @@ void nvmet_subsys_put(struct nvmet_subsys *subsys) ...@@ -1630,26 +1631,28 @@ void nvmet_subsys_put(struct nvmet_subsys *subsys)
static int __init nvmet_init(void) static int __init nvmet_init(void)
{ {
int error; int error = -ENOMEM;
nvmet_ana_group_enabled[NVMET_DEFAULT_ANA_GRPID] = 1; nvmet_ana_group_enabled[NVMET_DEFAULT_ANA_GRPID] = 1;
nvmet_bvec_cache = kmem_cache_create("nvmet-bvec",
NVMET_MAX_MPOOL_BVEC * sizeof(struct bio_vec), 0,
SLAB_HWCACHE_ALIGN, NULL);
if (!nvmet_bvec_cache)
return -ENOMEM;
zbd_wq = alloc_workqueue("nvmet-zbd-wq", WQ_MEM_RECLAIM, 0); zbd_wq = alloc_workqueue("nvmet-zbd-wq", WQ_MEM_RECLAIM, 0);
if (!zbd_wq) if (!zbd_wq)
return -ENOMEM; goto out_destroy_bvec_cache;
buffered_io_wq = alloc_workqueue("nvmet-buffered-io-wq", buffered_io_wq = alloc_workqueue("nvmet-buffered-io-wq",
WQ_MEM_RECLAIM, 0); WQ_MEM_RECLAIM, 0);
if (!buffered_io_wq) { if (!buffered_io_wq)
error = -ENOMEM;
goto out_free_zbd_work_queue; goto out_free_zbd_work_queue;
}
nvmet_wq = alloc_workqueue("nvmet-wq", WQ_MEM_RECLAIM, 0); nvmet_wq = alloc_workqueue("nvmet-wq", WQ_MEM_RECLAIM, 0);
if (!nvmet_wq) { if (!nvmet_wq)
error = -ENOMEM;
goto out_free_buffered_work_queue; goto out_free_buffered_work_queue;
}
error = nvmet_init_discovery(); error = nvmet_init_discovery();
if (error) if (error)
...@@ -1668,6 +1671,8 @@ static int __init nvmet_init(void) ...@@ -1668,6 +1671,8 @@ static int __init nvmet_init(void)
destroy_workqueue(buffered_io_wq); destroy_workqueue(buffered_io_wq);
out_free_zbd_work_queue: out_free_zbd_work_queue:
destroy_workqueue(zbd_wq); destroy_workqueue(zbd_wq);
out_destroy_bvec_cache:
kmem_cache_destroy(nvmet_bvec_cache);
return error; return error;
} }
...@@ -1679,6 +1684,7 @@ static void __exit nvmet_exit(void) ...@@ -1679,6 +1684,7 @@ static void __exit nvmet_exit(void)
destroy_workqueue(nvmet_wq); destroy_workqueue(nvmet_wq);
destroy_workqueue(buffered_io_wq); destroy_workqueue(buffered_io_wq);
destroy_workqueue(zbd_wq); destroy_workqueue(zbd_wq);
kmem_cache_destroy(nvmet_bvec_cache);
BUILD_BUG_ON(sizeof(struct nvmf_disc_rsp_page_entry) != 1024); BUILD_BUG_ON(sizeof(struct nvmf_disc_rsp_page_entry) != 1024);
BUILD_BUG_ON(sizeof(struct nvmf_disc_rsp_page_hdr) != 1024); BUILD_BUG_ON(sizeof(struct nvmf_disc_rsp_page_hdr) != 1024);
......
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
#include <linux/fs.h> #include <linux/fs.h>
#include "nvmet.h" #include "nvmet.h"
#define NVMET_MAX_MPOOL_BVEC 16
#define NVMET_MIN_MPOOL_OBJ 16 #define NVMET_MIN_MPOOL_OBJ 16
void nvmet_file_ns_revalidate(struct nvmet_ns *ns) void nvmet_file_ns_revalidate(struct nvmet_ns *ns)
...@@ -26,8 +25,6 @@ void nvmet_file_ns_disable(struct nvmet_ns *ns) ...@@ -26,8 +25,6 @@ void nvmet_file_ns_disable(struct nvmet_ns *ns)
flush_workqueue(buffered_io_wq); flush_workqueue(buffered_io_wq);
mempool_destroy(ns->bvec_pool); mempool_destroy(ns->bvec_pool);
ns->bvec_pool = NULL; ns->bvec_pool = NULL;
kmem_cache_destroy(ns->bvec_cache);
ns->bvec_cache = NULL;
fput(ns->file); fput(ns->file);
ns->file = NULL; ns->file = NULL;
} }
...@@ -59,16 +56,8 @@ int nvmet_file_ns_enable(struct nvmet_ns *ns) ...@@ -59,16 +56,8 @@ int nvmet_file_ns_enable(struct nvmet_ns *ns)
ns->blksize_shift = min_t(u8, ns->blksize_shift = min_t(u8,
file_inode(ns->file)->i_blkbits, 12); file_inode(ns->file)->i_blkbits, 12);
ns->bvec_cache = kmem_cache_create("nvmet-bvec",
NVMET_MAX_MPOOL_BVEC * sizeof(struct bio_vec),
0, SLAB_HWCACHE_ALIGN, NULL);
if (!ns->bvec_cache) {
ret = -ENOMEM;
goto err;
}
ns->bvec_pool = mempool_create(NVMET_MIN_MPOOL_OBJ, mempool_alloc_slab, ns->bvec_pool = mempool_create(NVMET_MIN_MPOOL_OBJ, mempool_alloc_slab,
mempool_free_slab, ns->bvec_cache); mempool_free_slab, nvmet_bvec_cache);
if (!ns->bvec_pool) { if (!ns->bvec_pool) {
ret = -ENOMEM; ret = -ENOMEM;
...@@ -77,9 +66,10 @@ int nvmet_file_ns_enable(struct nvmet_ns *ns) ...@@ -77,9 +66,10 @@ int nvmet_file_ns_enable(struct nvmet_ns *ns)
return ret; return ret;
err: err:
fput(ns->file);
ns->file = NULL;
ns->size = 0; ns->size = 0;
ns->blksize_shift = 0; ns->blksize_shift = 0;
nvmet_file_ns_disable(ns);
return ret; return ret;
} }
......
...@@ -77,7 +77,6 @@ struct nvmet_ns { ...@@ -77,7 +77,6 @@ struct nvmet_ns {
struct completion disable_done; struct completion disable_done;
mempool_t *bvec_pool; mempool_t *bvec_pool;
struct kmem_cache *bvec_cache;
int use_p2pmem; int use_p2pmem;
struct pci_dev *p2p_dev; struct pci_dev *p2p_dev;
...@@ -393,6 +392,8 @@ struct nvmet_req { ...@@ -393,6 +392,8 @@ struct nvmet_req {
u64 error_slba; u64 error_slba;
}; };
#define NVMET_MAX_MPOOL_BVEC 16
extern struct kmem_cache *nvmet_bvec_cache;
extern struct workqueue_struct *buffered_io_wq; extern struct workqueue_struct *buffered_io_wq;
extern struct workqueue_struct *zbd_wq; extern struct workqueue_struct *zbd_wq;
extern struct workqueue_struct *nvmet_wq; extern struct workqueue_struct *nvmet_wq;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册