aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatias Bjørling <m@bjorling.me>2015-12-06 05:25:48 -0500
committerJens Axboe <axboe@fb.com>2015-12-07 11:14:19 -0500
commit16f26c3aa9b9c36a9d1092ae3258461d1008481e (patch)
treefdfb366092d3727b6867aac782a6a09a042f85a3
parent57b4bd06ff0372fe1e3617889c4b37fbd500364a (diff)
lightnvm: replace req queue with nvmdev for lld
In the case where a request queue is passed to the low lever lightnvm device drive integration, the device driver might pass its admin commands through another queue. Instead pass nvm_dev, and let the low level drive the appropriate queue. Reported-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Matias Bjørling <m@bjorling.me> Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r--drivers/block/null_blk.c9
-rw-r--r--drivers/lightnvm/core.c7
-rw-r--r--drivers/lightnvm/gennvm.c8
-rw-r--r--drivers/lightnvm/rrpc.c2
-rw-r--r--drivers/nvme/host/lightnvm.c24
-rw-r--r--include/linux/lightnvm.h14
6 files changed, 33 insertions, 31 deletions
diff --git a/drivers/block/null_blk.c b/drivers/block/null_blk.c
index 0c3940ec5e62..7981b7407305 100644
--- a/drivers/block/null_blk.c
+++ b/drivers/block/null_blk.c
@@ -444,8 +444,9 @@ static void null_lnvm_end_io(struct request *rq, int error)
444 blk_put_request(rq); 444 blk_put_request(rq);
445} 445}
446 446
447static int null_lnvm_submit_io(struct request_queue *q, struct nvm_rq *rqd) 447static int null_lnvm_submit_io(struct nvm_dev *dev, struct nvm_rq *rqd)
448{ 448{
449 struct request_queue *q = dev->q;
449 struct request *rq; 450 struct request *rq;
450 struct bio *bio = rqd->bio; 451 struct bio *bio = rqd->bio;
451 452
@@ -470,7 +471,7 @@ static int null_lnvm_submit_io(struct request_queue *q, struct nvm_rq *rqd)
470 return 0; 471 return 0;
471} 472}
472 473
473static int null_lnvm_id(struct request_queue *q, struct nvm_id *id) 474static int null_lnvm_id(struct nvm_dev *dev, struct nvm_id *id)
474{ 475{
475 sector_t size = gb * 1024 * 1024 * 1024ULL; 476 sector_t size = gb * 1024 * 1024 * 1024ULL;
476 sector_t blksize; 477 sector_t blksize;
@@ -523,7 +524,7 @@ static int null_lnvm_id(struct request_queue *q, struct nvm_id *id)
523 return 0; 524 return 0;
524} 525}
525 526
526static void *null_lnvm_create_dma_pool(struct request_queue *q, char *name) 527static void *null_lnvm_create_dma_pool(struct nvm_dev *dev, char *name)
527{ 528{
528 mempool_t *virtmem_pool; 529 mempool_t *virtmem_pool;
529 530
@@ -541,7 +542,7 @@ static void null_lnvm_destroy_dma_pool(void *pool)
541 mempool_destroy(pool); 542 mempool_destroy(pool);
542} 543}
543 544
544static void *null_lnvm_dev_dma_alloc(struct request_queue *q, void *pool, 545static void *null_lnvm_dev_dma_alloc(struct nvm_dev *dev, void *pool,
545 gfp_t mem_flags, dma_addr_t *dma_handler) 546 gfp_t mem_flags, dma_addr_t *dma_handler)
546{ 547{
547 return mempool_alloc(pool, mem_flags); 548 return mempool_alloc(pool, mem_flags);
diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
index 86ce887b2ed6..4a8d1fe34c4e 100644
--- a/drivers/lightnvm/core.c
+++ b/drivers/lightnvm/core.c
@@ -74,7 +74,7 @@ EXPORT_SYMBOL(nvm_unregister_target);
74void *nvm_dev_dma_alloc(struct nvm_dev *dev, gfp_t mem_flags, 74void *nvm_dev_dma_alloc(struct nvm_dev *dev, gfp_t mem_flags,
75 dma_addr_t *dma_handler) 75 dma_addr_t *dma_handler)
76{ 76{
77 return dev->ops->dev_dma_alloc(dev->q, dev->ppalist_pool, mem_flags, 77 return dev->ops->dev_dma_alloc(dev, dev->ppalist_pool, mem_flags,
78 dma_handler); 78 dma_handler);
79} 79}
80EXPORT_SYMBOL(nvm_dev_dma_alloc); 80EXPORT_SYMBOL(nvm_dev_dma_alloc);
@@ -246,7 +246,7 @@ static int nvm_init(struct nvm_dev *dev)
246 if (!dev->q || !dev->ops) 246 if (!dev->q || !dev->ops)
247 return ret; 247 return ret;
248 248
249 if (dev->ops->identity(dev->q, &dev->identity)) { 249 if (dev->ops->identity(dev, &dev->identity)) {
250 pr_err("nvm: device could not be identified\n"); 250 pr_err("nvm: device could not be identified\n");
251 goto err; 251 goto err;
252 } 252 }
@@ -326,8 +326,7 @@ int nvm_register(struct request_queue *q, char *disk_name,
326 } 326 }
327 327
328 if (dev->ops->max_phys_sect > 1) { 328 if (dev->ops->max_phys_sect > 1) {
329 dev->ppalist_pool = dev->ops->create_dma_pool(dev->q, 329 dev->ppalist_pool = dev->ops->create_dma_pool(dev, "ppalist");
330 "ppalist");
331 if (!dev->ppalist_pool) { 330 if (!dev->ppalist_pool) {
332 pr_err("nvm: could not create ppa pool\n"); 331 pr_err("nvm: could not create ppa pool\n");
333 ret = -ENOMEM; 332 ret = -ENOMEM;
diff --git a/drivers/lightnvm/gennvm.c b/drivers/lightnvm/gennvm.c
index ce6025487a5c..52b513a65946 100644
--- a/drivers/lightnvm/gennvm.c
+++ b/drivers/lightnvm/gennvm.c
@@ -195,7 +195,7 @@ static int gennvm_blocks_init(struct nvm_dev *dev, struct gen_nvm *gn)
195 } 195 }
196 196
197 if (dev->ops->get_l2p_tbl) { 197 if (dev->ops->get_l2p_tbl) {
198 ret = dev->ops->get_l2p_tbl(dev->q, 0, dev->total_pages, 198 ret = dev->ops->get_l2p_tbl(dev, 0, dev->total_pages,
199 gennvm_block_map, dev); 199 gennvm_block_map, dev);
200 if (ret) { 200 if (ret) {
201 pr_err("gennvm: could not read L2P table.\n"); 201 pr_err("gennvm: could not read L2P table.\n");
@@ -346,7 +346,7 @@ static int gennvm_submit_io(struct nvm_dev *dev, struct nvm_rq *rqd)
346 gennvm_generic_to_addr_mode(dev, rqd); 346 gennvm_generic_to_addr_mode(dev, rqd);
347 347
348 rqd->dev = dev; 348 rqd->dev = dev;
349 return dev->ops->submit_io(dev->q, rqd); 349 return dev->ops->submit_io(dev, rqd);
350} 350}
351 351
352static void gennvm_blk_set_type(struct nvm_dev *dev, struct ppa_addr *ppa, 352static void gennvm_blk_set_type(struct nvm_dev *dev, struct ppa_addr *ppa,
@@ -382,7 +382,7 @@ static void gennvm_mark_blk_bad(struct nvm_dev *dev, struct nvm_rq *rqd)
382 if (!dev->ops->set_bb_tbl) 382 if (!dev->ops->set_bb_tbl)
383 return; 383 return;
384 384
385 if (dev->ops->set_bb_tbl(dev->q, rqd, 1)) 385 if (dev->ops->set_bb_tbl(dev, rqd, 1))
386 return; 386 return;
387 387
388 gennvm_addr_to_generic_mode(dev, rqd); 388 gennvm_addr_to_generic_mode(dev, rqd);
@@ -450,7 +450,7 @@ static int gennvm_erase_blk(struct nvm_dev *dev, struct nvm_block *blk,
450 450
451 gennvm_generic_to_addr_mode(dev, &rqd); 451 gennvm_generic_to_addr_mode(dev, &rqd);
452 452
453 ret = dev->ops->erase_block(dev->q, &rqd); 453 ret = dev->ops->erase_block(dev, &rqd);
454 454
455 if (plane_cnt) 455 if (plane_cnt)
456 nvm_dev_dma_free(dev, rqd.ppa_list, rqd.dma_ppa_list); 456 nvm_dev_dma_free(dev, rqd.ppa_list, rqd.dma_ppa_list);
diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c
index cf1a4a515b76..134e4faba482 100644
--- a/drivers/lightnvm/rrpc.c
+++ b/drivers/lightnvm/rrpc.c
@@ -1016,7 +1016,7 @@ static int rrpc_map_init(struct rrpc *rrpc)
1016 return 0; 1016 return 0;
1017 1017
1018 /* Bring up the mapping table from device */ 1018 /* Bring up the mapping table from device */
1019 ret = dev->ops->get_l2p_tbl(dev->q, 0, dev->total_pages, 1019 ret = dev->ops->get_l2p_tbl(dev, 0, dev->total_pages,
1020 rrpc_l2p_update, rrpc); 1020 rrpc_l2p_update, rrpc);
1021 if (ret) { 1021 if (ret) {
1022 pr_err("nvm: rrpc: could not read L2P table.\n"); 1022 pr_err("nvm: rrpc: could not read L2P table.\n");
diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
index 762c9a7cbfa6..15f2acb4d5cd 100644
--- a/drivers/nvme/host/lightnvm.c
+++ b/drivers/nvme/host/lightnvm.c
@@ -271,9 +271,9 @@ static int init_grps(struct nvm_id *nvm_id, struct nvme_nvm_id *nvme_nvm_id)
271 return 0; 271 return 0;
272} 272}
273 273
274static int nvme_nvm_identity(struct request_queue *q, struct nvm_id *nvm_id) 274static int nvme_nvm_identity(struct nvm_dev *nvmdev, struct nvm_id *nvm_id)
275{ 275{
276 struct nvme_ns *ns = q->queuedata; 276 struct nvme_ns *ns = nvmdev->q->queuedata;
277 struct nvme_dev *dev = ns->dev; 277 struct nvme_dev *dev = ns->dev;
278 struct nvme_nvm_id *nvme_nvm_id; 278 struct nvme_nvm_id *nvme_nvm_id;
279 struct nvme_nvm_command c = {}; 279 struct nvme_nvm_command c = {};
@@ -308,10 +308,10 @@ out:
308 return ret; 308 return ret;
309} 309}
310 310
311static int nvme_nvm_get_l2p_tbl(struct request_queue *q, u64 slba, u32 nlb, 311static int nvme_nvm_get_l2p_tbl(struct nvm_dev *nvmdev, u64 slba, u32 nlb,
312 nvm_l2p_update_fn *update_l2p, void *priv) 312 nvm_l2p_update_fn *update_l2p, void *priv)
313{ 313{
314 struct nvme_ns *ns = q->queuedata; 314 struct nvme_ns *ns = nvmdev->q->queuedata;
315 struct nvme_dev *dev = ns->dev; 315 struct nvme_dev *dev = ns->dev;
316 struct nvme_nvm_command c = {}; 316 struct nvme_nvm_command c = {};
317 u32 len = queue_max_hw_sectors(dev->admin_q) << 9; 317 u32 len = queue_max_hw_sectors(dev->admin_q) << 9;
@@ -415,10 +415,10 @@ out:
415 return ret; 415 return ret;
416} 416}
417 417
418static int nvme_nvm_set_bb_tbl(struct request_queue *q, struct nvm_rq *rqd, 418static int nvme_nvm_set_bb_tbl(struct nvm_dev *nvmdev, struct nvm_rq *rqd,
419 int type) 419 int type)
420{ 420{
421 struct nvme_ns *ns = q->queuedata; 421 struct nvme_ns *ns = nvmdev->q->queuedata;
422 struct nvme_dev *dev = ns->dev; 422 struct nvme_dev *dev = ns->dev;
423 struct nvme_nvm_command c = {}; 423 struct nvme_nvm_command c = {};
424 int ret = 0; 424 int ret = 0;
@@ -463,8 +463,9 @@ static void nvme_nvm_end_io(struct request *rq, int error)
463 blk_mq_free_request(rq); 463 blk_mq_free_request(rq);
464} 464}
465 465
466static int nvme_nvm_submit_io(struct request_queue *q, struct nvm_rq *rqd) 466static int nvme_nvm_submit_io(struct nvm_dev *dev, struct nvm_rq *rqd)
467{ 467{
468 struct request_queue *q = dev->q;
468 struct nvme_ns *ns = q->queuedata; 469 struct nvme_ns *ns = q->queuedata;
469 struct request *rq; 470 struct request *rq;
470 struct bio *bio = rqd->bio; 471 struct bio *bio = rqd->bio;
@@ -502,8 +503,9 @@ static int nvme_nvm_submit_io(struct request_queue *q, struct nvm_rq *rqd)
502 return 0; 503 return 0;
503} 504}
504 505
505static int nvme_nvm_erase_block(struct request_queue *q, struct nvm_rq *rqd) 506static int nvme_nvm_erase_block(struct nvm_dev *dev, struct nvm_rq *rqd)
506{ 507{
508 struct request_queue *q = dev->q;
507 struct nvme_ns *ns = q->queuedata; 509 struct nvme_ns *ns = q->queuedata;
508 struct nvme_nvm_command c = {}; 510 struct nvme_nvm_command c = {};
509 511
@@ -515,9 +517,9 @@ static int nvme_nvm_erase_block(struct request_queue *q, struct nvm_rq *rqd)
515 return nvme_submit_sync_cmd(q, (struct nvme_command *)&c, NULL, 0); 517 return nvme_submit_sync_cmd(q, (struct nvme_command *)&c, NULL, 0);
516} 518}
517 519
518static void *nvme_nvm_create_dma_pool(struct request_queue *q, char *name) 520static void *nvme_nvm_create_dma_pool(struct nvm_dev *nvmdev, char *name)
519{ 521{
520 struct nvme_ns *ns = q->queuedata; 522 struct nvme_ns *ns = nvmdev->q->queuedata;
521 struct nvme_dev *dev = ns->dev; 523 struct nvme_dev *dev = ns->dev;
522 524
523 return dma_pool_create(name, dev->dev, PAGE_SIZE, PAGE_SIZE, 0); 525 return dma_pool_create(name, dev->dev, PAGE_SIZE, PAGE_SIZE, 0);
@@ -530,7 +532,7 @@ static void nvme_nvm_destroy_dma_pool(void *pool)
530 dma_pool_destroy(dma_pool); 532 dma_pool_destroy(dma_pool);
531} 533}
532 534
533static void *nvme_nvm_dev_dma_alloc(struct request_queue *q, void *pool, 535static void *nvme_nvm_dev_dma_alloc(struct nvm_dev *dev, void *pool,
534 gfp_t mem_flags, dma_addr_t *dma_handler) 536 gfp_t mem_flags, dma_addr_t *dma_handler)
535{ 537{
536 return dma_pool_alloc(pool, mem_flags, dma_handler); 538 return dma_pool_alloc(pool, mem_flags, dma_handler);
diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h
index 935ef3844c05..034117b3be5f 100644
--- a/include/linux/lightnvm.h
+++ b/include/linux/lightnvm.h
@@ -183,17 +183,17 @@ struct nvm_block;
183 183
184typedef int (nvm_l2p_update_fn)(u64, u32, __le64 *, void *); 184typedef int (nvm_l2p_update_fn)(u64, u32, __le64 *, void *);
185typedef int (nvm_bb_update_fn)(struct ppa_addr, int, u8 *, void *); 185typedef int (nvm_bb_update_fn)(struct ppa_addr, int, u8 *, void *);
186typedef int (nvm_id_fn)(struct request_queue *, struct nvm_id *); 186typedef int (nvm_id_fn)(struct nvm_dev *, struct nvm_id *);
187typedef int (nvm_get_l2p_tbl_fn)(struct request_queue *, u64, u32, 187typedef int (nvm_get_l2p_tbl_fn)(struct nvm_dev *, u64, u32,
188 nvm_l2p_update_fn *, void *); 188 nvm_l2p_update_fn *, void *);
189typedef int (nvm_op_bb_tbl_fn)(struct nvm_dev *, struct ppa_addr, int, 189typedef int (nvm_op_bb_tbl_fn)(struct nvm_dev *, struct ppa_addr, int,
190 nvm_bb_update_fn *, void *); 190 nvm_bb_update_fn *, void *);
191typedef int (nvm_op_set_bb_fn)(struct request_queue *, struct nvm_rq *, int); 191typedef int (nvm_op_set_bb_fn)(struct nvm_dev *, struct nvm_rq *, int);
192typedef int (nvm_submit_io_fn)(struct request_queue *, struct nvm_rq *); 192typedef int (nvm_submit_io_fn)(struct nvm_dev *, struct nvm_rq *);
193typedef int (nvm_erase_blk_fn)(struct request_queue *, struct nvm_rq *); 193typedef int (nvm_erase_blk_fn)(struct nvm_dev *, struct nvm_rq *);
194typedef void *(nvm_create_dma_pool_fn)(struct request_queue *, char *); 194typedef void *(nvm_create_dma_pool_fn)(struct nvm_dev *, char *);
195typedef void (nvm_destroy_dma_pool_fn)(void *); 195typedef void (nvm_destroy_dma_pool_fn)(void *);
196typedef void *(nvm_dev_dma_alloc_fn)(struct request_queue *, void *, gfp_t, 196typedef void *(nvm_dev_dma_alloc_fn)(struct nvm_dev *, void *, gfp_t,
197 dma_addr_t *); 197 dma_addr_t *);
198typedef void (nvm_dev_dma_free_fn)(void *, void*, dma_addr_t); 198typedef void (nvm_dev_dma_free_fn)(void *, void*, dma_addr_t);
199 199