loop.c (2ade82213b7a35c761273fe0c982f4ab8707f30a) | loop.c (ceee1953f9239b699d80c5ef366712c3fd865cc2) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * NVMe over Fabrics loopback device. 4 * Copyright (c) 2015-2016 HGST, a Western Digital Company. 5 */ 6#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 7#include <linux/scatterlist.h> 8#include <linux/blk-mq.h> --- 252 unchanged lines hidden (view full) --- 261 .init_hctx = nvme_loop_init_admin_hctx, 262}; 263 264static void nvme_loop_destroy_admin_queue(struct nvme_loop_ctrl *ctrl) 265{ 266 if (!test_and_clear_bit(NVME_LOOP_Q_LIVE, &ctrl->queues[0].flags)) 267 return; 268 nvmet_sq_destroy(&ctrl->queues[0].nvme_sq); | 1// SPDX-License-Identifier: GPL-2.0 2/* 3 * NVMe over Fabrics loopback device. 4 * Copyright (c) 2015-2016 HGST, a Western Digital Company. 5 */ 6#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 7#include <linux/scatterlist.h> 8#include <linux/blk-mq.h> --- 252 unchanged lines hidden (view full) --- 261 .init_hctx = nvme_loop_init_admin_hctx, 262}; 263 264static void nvme_loop_destroy_admin_queue(struct nvme_loop_ctrl *ctrl) 265{ 266 if (!test_and_clear_bit(NVME_LOOP_Q_LIVE, &ctrl->queues[0].flags)) 267 return; 268 nvmet_sq_destroy(&ctrl->queues[0].nvme_sq); |
269 blk_mq_destroy_queue(ctrl->ctrl.admin_q); 270 blk_mq_destroy_queue(ctrl->ctrl.fabrics_q); 271 blk_mq_free_tag_set(&ctrl->admin_tag_set); | 269 nvme_remove_admin_tag_set(&ctrl->ctrl); |
272} 273 274static void nvme_loop_free_ctrl(struct nvme_ctrl *nctrl) 275{ 276 struct nvme_loop_ctrl *ctrl = to_loop_ctrl(nctrl); 277 278 if (list_empty(&ctrl->list)) 279 goto free_ctrl; 280 281 mutex_lock(&nvme_loop_ctrl_mutex); 282 list_del(&ctrl->list); 283 mutex_unlock(&nvme_loop_ctrl_mutex); 284 | 270} 271 272static void nvme_loop_free_ctrl(struct nvme_ctrl *nctrl) 273{ 274 struct nvme_loop_ctrl *ctrl = to_loop_ctrl(nctrl); 275 276 if (list_empty(&ctrl->list)) 277 goto free_ctrl; 278 279 mutex_lock(&nvme_loop_ctrl_mutex); 280 list_del(&ctrl->list); 281 mutex_unlock(&nvme_loop_ctrl_mutex); 282 |
285 if (nctrl->tagset) { 286 blk_mq_destroy_queue(ctrl->ctrl.connect_q); 287 blk_mq_free_tag_set(&ctrl->tag_set); 288 } | 283 if (nctrl->tagset) 284 nvme_remove_io_tag_set(nctrl); |
289 kfree(ctrl->queues); 290 nvmf_free_options(nctrl->opts); 291free_ctrl: 292 kfree(ctrl); 293} 294 295static void nvme_loop_destroy_io_queues(struct nvme_loop_ctrl *ctrl) 296{ --- 48 unchanged lines hidden (view full) --- 345 346 return 0; 347} 348 349static int nvme_loop_configure_admin_queue(struct nvme_loop_ctrl *ctrl) 350{ 351 int error; 352 | 285 kfree(ctrl->queues); 286 nvmf_free_options(nctrl->opts); 287free_ctrl: 288 kfree(ctrl); 289} 290 291static void nvme_loop_destroy_io_queues(struct nvme_loop_ctrl *ctrl) 292{ --- 48 unchanged lines hidden (view full) --- 341 342 return 0; 343} 344 345static int nvme_loop_configure_admin_queue(struct nvme_loop_ctrl *ctrl) 346{ 347 int error; 348 |
353 memset(&ctrl->admin_tag_set, 0, sizeof(ctrl->admin_tag_set)); 354 ctrl->admin_tag_set.ops = &nvme_loop_admin_mq_ops; 355 ctrl->admin_tag_set.queue_depth = NVME_AQ_MQ_TAG_DEPTH; 356 ctrl->admin_tag_set.reserved_tags = NVMF_RESERVED_TAGS; 357 ctrl->admin_tag_set.numa_node = ctrl->ctrl.numa_node; 358 ctrl->admin_tag_set.cmd_size = sizeof(struct nvme_loop_iod) + 359 NVME_INLINE_SG_CNT * sizeof(struct scatterlist); 360 ctrl->admin_tag_set.driver_data = &ctrl->ctrl; 361 ctrl->admin_tag_set.nr_hw_queues = 1; 362 ctrl->admin_tag_set.timeout = NVME_ADMIN_TIMEOUT; 363 ctrl->admin_tag_set.flags = BLK_MQ_F_NO_SCHED; 364 | |
365 ctrl->queues[0].ctrl = ctrl; 366 error = nvmet_sq_init(&ctrl->queues[0].nvme_sq); 367 if (error) 368 return error; 369 ctrl->ctrl.queue_count = 1; 370 | 349 ctrl->queues[0].ctrl = ctrl; 350 error = nvmet_sq_init(&ctrl->queues[0].nvme_sq); 351 if (error) 352 return error; 353 ctrl->ctrl.queue_count = 1; 354 |
371 error = blk_mq_alloc_tag_set(&ctrl->admin_tag_set); | 355 error = nvme_alloc_admin_tag_set(&ctrl->ctrl, &ctrl->admin_tag_set, 356 &nvme_loop_admin_mq_ops, BLK_MQ_F_NO_SCHED, 357 sizeof(struct nvme_loop_iod) + 358 NVME_INLINE_SG_CNT * sizeof(struct scatterlist)); |
372 if (error) 373 goto out_free_sq; | 359 if (error) 360 goto out_free_sq; |
374 ctrl->ctrl.admin_tagset = &ctrl->admin_tag_set; | |
375 | 361 |
376 ctrl->ctrl.fabrics_q = blk_mq_init_queue(&ctrl->admin_tag_set); 377 if (IS_ERR(ctrl->ctrl.fabrics_q)) { 378 error = PTR_ERR(ctrl->ctrl.fabrics_q); 379 goto out_free_tagset; 380 } 381 382 ctrl->ctrl.admin_q = blk_mq_init_queue(&ctrl->admin_tag_set); 383 if (IS_ERR(ctrl->ctrl.admin_q)) { 384 error = PTR_ERR(ctrl->ctrl.admin_q); 385 goto out_cleanup_fabrics_q; 386 } | |
387 /* reset stopped state for the fresh admin queue */ 388 clear_bit(NVME_CTRL_ADMIN_Q_STOPPED, &ctrl->ctrl.flags); 389 390 error = nvmf_connect_admin_queue(&ctrl->ctrl); 391 if (error) | 362 /* reset stopped state for the fresh admin queue */ 363 clear_bit(NVME_CTRL_ADMIN_Q_STOPPED, &ctrl->ctrl.flags); 364 365 error = nvmf_connect_admin_queue(&ctrl->ctrl); 366 if (error) |
392 goto out_cleanup_queue; | 367 goto out_cleanup_tagset; |
393 394 set_bit(NVME_LOOP_Q_LIVE, &ctrl->queues[0].flags); 395 396 error = nvme_enable_ctrl(&ctrl->ctrl); 397 if (error) | 368 369 set_bit(NVME_LOOP_Q_LIVE, &ctrl->queues[0].flags); 370 371 error = nvme_enable_ctrl(&ctrl->ctrl); 372 if (error) |
398 goto out_cleanup_queue; | 373 goto out_cleanup_tagset; |
399 400 ctrl->ctrl.max_hw_sectors = 401 (NVME_LOOP_MAX_SEGMENTS - 1) << (PAGE_SHIFT - 9); 402 403 nvme_start_admin_queue(&ctrl->ctrl); 404 405 error = nvme_init_ctrl_finish(&ctrl->ctrl); 406 if (error) | 374 375 ctrl->ctrl.max_hw_sectors = 376 (NVME_LOOP_MAX_SEGMENTS - 1) << (PAGE_SHIFT - 9); 377 378 nvme_start_admin_queue(&ctrl->ctrl); 379 380 error = nvme_init_ctrl_finish(&ctrl->ctrl); 381 if (error) |
407 goto out_cleanup_queue; | 382 goto out_cleanup_tagset; |
408 409 return 0; 410 | 383 384 return 0; 385 |
411out_cleanup_queue: | 386out_cleanup_tagset: |
412 clear_bit(NVME_LOOP_Q_LIVE, &ctrl->queues[0].flags); | 387 clear_bit(NVME_LOOP_Q_LIVE, &ctrl->queues[0].flags); |
413 blk_mq_destroy_queue(ctrl->ctrl.admin_q); 414out_cleanup_fabrics_q: 415 blk_mq_destroy_queue(ctrl->ctrl.fabrics_q); 416out_free_tagset: 417 blk_mq_free_tag_set(&ctrl->admin_tag_set); | 388 nvme_remove_admin_tag_set(&ctrl->ctrl); |
418out_free_sq: 419 nvmet_sq_destroy(&ctrl->queues[0].nvme_sq); 420 return error; 421} 422 423static void nvme_loop_shutdown_ctrl(struct nvme_loop_ctrl *ctrl) 424{ 425 if (ctrl->ctrl.queue_count > 1) { --- 91 unchanged lines hidden (view full) --- 517static int nvme_loop_create_io_queues(struct nvme_loop_ctrl *ctrl) 518{ 519 int ret; 520 521 ret = nvme_loop_init_io_queues(ctrl); 522 if (ret) 523 return ret; 524 | 389out_free_sq: 390 nvmet_sq_destroy(&ctrl->queues[0].nvme_sq); 391 return error; 392} 393 394static void nvme_loop_shutdown_ctrl(struct nvme_loop_ctrl *ctrl) 395{ 396 if (ctrl->ctrl.queue_count > 1) { --- 91 unchanged lines hidden (view full) --- 488static int nvme_loop_create_io_queues(struct nvme_loop_ctrl *ctrl) 489{ 490 int ret; 491 492 ret = nvme_loop_init_io_queues(ctrl); 493 if (ret) 494 return ret; 495 |
525 memset(&ctrl->tag_set, 0, sizeof(ctrl->tag_set)); 526 ctrl->tag_set.ops = &nvme_loop_mq_ops; 527 ctrl->tag_set.queue_depth = ctrl->ctrl.opts->queue_size; 528 ctrl->tag_set.reserved_tags = NVMF_RESERVED_TAGS; 529 ctrl->tag_set.numa_node = ctrl->ctrl.numa_node; 530 ctrl->tag_set.flags = BLK_MQ_F_SHOULD_MERGE; 531 ctrl->tag_set.cmd_size = sizeof(struct nvme_loop_iod) + 532 NVME_INLINE_SG_CNT * sizeof(struct scatterlist); 533 ctrl->tag_set.driver_data = &ctrl->ctrl; 534 ctrl->tag_set.nr_hw_queues = ctrl->ctrl.queue_count - 1; 535 ctrl->tag_set.timeout = NVME_IO_TIMEOUT; 536 ctrl->ctrl.tagset = &ctrl->tag_set; 537 538 ret = blk_mq_alloc_tag_set(&ctrl->tag_set); | 496 ret = nvme_alloc_io_tag_set(&ctrl->ctrl, &ctrl->tag_set, 497 &nvme_loop_mq_ops, BLK_MQ_F_SHOULD_MERGE, 498 sizeof(struct nvme_loop_iod) + 499 NVME_INLINE_SG_CNT * sizeof(struct scatterlist)); |
539 if (ret) 540 goto out_destroy_queues; 541 | 500 if (ret) 501 goto out_destroy_queues; 502 |
542 ret = nvme_ctrl_init_connect_q(&(ctrl->ctrl)); 543 if (ret) 544 goto out_free_tagset; 545 | |
546 ret = nvme_loop_connect_io_queues(ctrl); 547 if (ret) | 503 ret = nvme_loop_connect_io_queues(ctrl); 504 if (ret) |
548 goto out_cleanup_connect_q; | 505 goto out_cleanup_tagset; |
549 550 return 0; 551 | 506 507 return 0; 508 |
552out_cleanup_connect_q: 553 blk_mq_destroy_queue(ctrl->ctrl.connect_q); 554out_free_tagset: 555 blk_mq_free_tag_set(&ctrl->tag_set); | 509out_cleanup_tagset: 510 nvme_remove_io_tag_set(&ctrl->ctrl); |
556out_destroy_queues: 557 nvme_loop_destroy_io_queues(ctrl); 558 return ret; 559} 560 561static struct nvmet_port *nvme_loop_find_port(struct nvme_ctrl *ctrl) 562{ 563 struct nvmet_port *p, *found = NULL; --- 170 unchanged lines hidden --- | 511out_destroy_queues: 512 nvme_loop_destroy_io_queues(ctrl); 513 return ret; 514} 515 516static struct nvmet_port *nvme_loop_find_port(struct nvme_ctrl *ctrl) 517{ 518 struct nvmet_port *p, *found = NULL; --- 170 unchanged lines hidden --- |