diff options
author | Matias Bjørling <m@bjorling.me> | 2015-12-06 05:25:48 -0500 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2015-12-07 11:14:19 -0500 |
commit | 16f26c3aa9b9c36a9d1092ae3258461d1008481e (patch) | |
tree | fdfb366092d3727b6867aac782a6a09a042f85a3 | |
parent | 57b4bd06ff0372fe1e3617889c4b37fbd500364a (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.c | 9 | ||||
-rw-r--r-- | drivers/lightnvm/core.c | 7 | ||||
-rw-r--r-- | drivers/lightnvm/gennvm.c | 8 | ||||
-rw-r--r-- | drivers/lightnvm/rrpc.c | 2 | ||||
-rw-r--r-- | drivers/nvme/host/lightnvm.c | 24 | ||||
-rw-r--r-- | include/linux/lightnvm.h | 14 |
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 | ||
447 | static int null_lnvm_submit_io(struct request_queue *q, struct nvm_rq *rqd) | 447 | static 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 | ||
473 | static int null_lnvm_id(struct request_queue *q, struct nvm_id *id) | 474 | static 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 | ||
526 | static void *null_lnvm_create_dma_pool(struct request_queue *q, char *name) | 527 | static 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 | ||
544 | static void *null_lnvm_dev_dma_alloc(struct request_queue *q, void *pool, | 545 | static 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); | |||
74 | void *nvm_dev_dma_alloc(struct nvm_dev *dev, gfp_t mem_flags, | 74 | void *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 | } |
80 | EXPORT_SYMBOL(nvm_dev_dma_alloc); | 80 | EXPORT_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 | ||
352 | static void gennvm_blk_set_type(struct nvm_dev *dev, struct ppa_addr *ppa, | 352 | static 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 | ||
274 | static int nvme_nvm_identity(struct request_queue *q, struct nvm_id *nvm_id) | 274 | static 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 | ||
311 | static int nvme_nvm_get_l2p_tbl(struct request_queue *q, u64 slba, u32 nlb, | 311 | static 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 | ||
418 | static int nvme_nvm_set_bb_tbl(struct request_queue *q, struct nvm_rq *rqd, | 418 | static 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 | ||
466 | static int nvme_nvm_submit_io(struct request_queue *q, struct nvm_rq *rqd) | 466 | static 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 | ||
505 | static int nvme_nvm_erase_block(struct request_queue *q, struct nvm_rq *rqd) | 506 | static 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 | ||
518 | static void *nvme_nvm_create_dma_pool(struct request_queue *q, char *name) | 520 | static 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 | ||
533 | static void *nvme_nvm_dev_dma_alloc(struct request_queue *q, void *pool, | 535 | static 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 | ||
184 | typedef int (nvm_l2p_update_fn)(u64, u32, __le64 *, void *); | 184 | typedef int (nvm_l2p_update_fn)(u64, u32, __le64 *, void *); |
185 | typedef int (nvm_bb_update_fn)(struct ppa_addr, int, u8 *, void *); | 185 | typedef int (nvm_bb_update_fn)(struct ppa_addr, int, u8 *, void *); |
186 | typedef int (nvm_id_fn)(struct request_queue *, struct nvm_id *); | 186 | typedef int (nvm_id_fn)(struct nvm_dev *, struct nvm_id *); |
187 | typedef int (nvm_get_l2p_tbl_fn)(struct request_queue *, u64, u32, | 187 | typedef int (nvm_get_l2p_tbl_fn)(struct nvm_dev *, u64, u32, |
188 | nvm_l2p_update_fn *, void *); | 188 | nvm_l2p_update_fn *, void *); |
189 | typedef int (nvm_op_bb_tbl_fn)(struct nvm_dev *, struct ppa_addr, int, | 189 | typedef 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 *); |
191 | typedef int (nvm_op_set_bb_fn)(struct request_queue *, struct nvm_rq *, int); | 191 | typedef int (nvm_op_set_bb_fn)(struct nvm_dev *, struct nvm_rq *, int); |
192 | typedef int (nvm_submit_io_fn)(struct request_queue *, struct nvm_rq *); | 192 | typedef int (nvm_submit_io_fn)(struct nvm_dev *, struct nvm_rq *); |
193 | typedef int (nvm_erase_blk_fn)(struct request_queue *, struct nvm_rq *); | 193 | typedef int (nvm_erase_blk_fn)(struct nvm_dev *, struct nvm_rq *); |
194 | typedef void *(nvm_create_dma_pool_fn)(struct request_queue *, char *); | 194 | typedef void *(nvm_create_dma_pool_fn)(struct nvm_dev *, char *); |
195 | typedef void (nvm_destroy_dma_pool_fn)(void *); | 195 | typedef void (nvm_destroy_dma_pool_fn)(void *); |
196 | typedef void *(nvm_dev_dma_alloc_fn)(struct request_queue *, void *, gfp_t, | 196 | typedef void *(nvm_dev_dma_alloc_fn)(struct nvm_dev *, void *, gfp_t, |
197 | dma_addr_t *); | 197 | dma_addr_t *); |
198 | typedef void (nvm_dev_dma_free_fn)(void *, void*, dma_addr_t); | 198 | typedef void (nvm_dev_dma_free_fn)(void *, void*, dma_addr_t); |
199 | 199 | ||