Lines Matching refs:ctrl
23 inline bool nvme_ctrl_use_ana(struct nvme_ctrl *ctrl) in nvme_ctrl_use_ana() argument
25 return multipath && ctrl->subsys && (ctrl->subsys->cmic & (1 << 3)); in nvme_ctrl_use_ana()
36 struct nvme_ctrl *ctrl, int *flags) in nvme_set_disk_name() argument
39 sprintf(disk_name, "nvme%dn%d", ctrl->instance, ns->head->instance); in nvme_set_disk_name()
41 sprintf(disk_name, "nvme%dc%dn%d", ctrl->subsys->instance, in nvme_set_disk_name()
42 ctrl->cntlid, ns->head->instance); in nvme_set_disk_name()
45 sprintf(disk_name, "nvme%dn%d", ctrl->subsys->instance, in nvme_set_disk_name()
75 if (ns->ctrl->ana_log_buf) { in nvme_failover_req()
77 queue_work(nvme_wq, &ns->ctrl->ana_work); in nvme_failover_req()
85 nvme_reset_ctrl(ns->ctrl); in nvme_failover_req()
92 void nvme_kick_requeue_lists(struct nvme_ctrl *ctrl) in nvme_kick_requeue_lists() argument
96 down_read(&ctrl->namespaces_rwsem); in nvme_kick_requeue_lists()
97 list_for_each_entry(ns, &ctrl->namespaces, list) { in nvme_kick_requeue_lists()
101 up_read(&ctrl->namespaces_rwsem); in nvme_kick_requeue_lists()
118 if (ns->ctrl->state != NVME_CTRL_LIVE || in __nvme_find_path()
140 return ns->ctrl->state == NVME_CTRL_LIVE && in nvme_path_is_optimized()
226 int nvme_mpath_alloc_disk(struct nvme_ctrl *ctrl, struct nvme_ns_head *head) in nvme_mpath_alloc_disk() argument
241 if (!(ctrl->subsys->cmic & (1 << 1)) || !multipath) in nvme_mpath_alloc_disk()
255 if (ctrl->vwc & NVME_CTRL_VWC_PRESENT) in nvme_mpath_alloc_disk()
267 ctrl->subsys->instance, head->instance); in nvme_mpath_alloc_disk()
296 static int nvme_parse_ana_log(struct nvme_ctrl *ctrl, void *data, in nvme_parse_ana_log() argument
297 int (*cb)(struct nvme_ctrl *ctrl, struct nvme_ana_group_desc *, in nvme_parse_ana_log() argument
300 void *base = ctrl->ana_log_buf; in nvme_parse_ana_log()
304 lockdep_assert_held(&ctrl->ana_lock); in nvme_parse_ana_log()
306 for (i = 0; i < le16_to_cpu(ctrl->ana_log_buf->ngrps); i++) { in nvme_parse_ana_log()
313 if (WARN_ON_ONCE(le32_to_cpu(desc->grpid) > ctrl->anagrpmax)) in nvme_parse_ana_log()
321 if (WARN_ON_ONCE(offset > ctrl->ana_log_size - nsid_buf_size)) in nvme_parse_ana_log()
324 error = cb(ctrl, desc, data); in nvme_parse_ana_log()
329 if (WARN_ON_ONCE(offset > ctrl->ana_log_size - sizeof(*desc))) in nvme_parse_ana_log()
357 static int nvme_update_ana_state(struct nvme_ctrl *ctrl, in nvme_update_ana_state() argument
364 dev_info(ctrl->device, "ANA group %d: %s.\n", in nvme_update_ana_state()
374 down_write(&ctrl->namespaces_rwsem); in nvme_update_ana_state()
375 list_for_each_entry(ns, &ctrl->namespaces, list) { in nvme_update_ana_state()
382 up_write(&ctrl->namespaces_rwsem); in nvme_update_ana_state()
387 static int nvme_read_ana_log(struct nvme_ctrl *ctrl, bool groups_only) in nvme_read_ana_log() argument
392 mutex_lock(&ctrl->ana_lock); in nvme_read_ana_log()
393 error = nvme_get_log(ctrl, NVME_NSID_ALL, NVME_LOG_ANA, in nvme_read_ana_log()
395 ctrl->ana_log_buf, ctrl->ana_log_size, 0); in nvme_read_ana_log()
397 dev_warn(ctrl->device, "Failed to get ANA log: %d\n", error); in nvme_read_ana_log()
401 error = nvme_parse_ana_log(ctrl, &nr_change_groups, in nvme_read_ana_log()
418 mod_timer(&ctrl->anatt_timer, ctrl->anatt * HZ * 2 + jiffies); in nvme_read_ana_log()
420 del_timer_sync(&ctrl->anatt_timer); in nvme_read_ana_log()
422 mutex_unlock(&ctrl->ana_lock); in nvme_read_ana_log()
428 struct nvme_ctrl *ctrl = container_of(work, struct nvme_ctrl, ana_work); in nvme_ana_work() local
430 nvme_read_ana_log(ctrl, false); in nvme_ana_work()
435 struct nvme_ctrl *ctrl = from_timer(ctrl, t, anatt_timer); in nvme_anatt_timeout() local
437 dev_info(ctrl->device, "ANATT timeout, resetting controller.\n"); in nvme_anatt_timeout()
438 nvme_reset_ctrl(ctrl); in nvme_anatt_timeout()
441 void nvme_mpath_stop(struct nvme_ctrl *ctrl) in nvme_mpath_stop() argument
443 if (!nvme_ctrl_use_ana(ctrl)) in nvme_mpath_stop()
445 del_timer_sync(&ctrl->anatt_timer); in nvme_mpath_stop()
446 cancel_work_sync(&ctrl->ana_work); in nvme_mpath_stop()
465 static int nvme_set_ns_ana_state(struct nvme_ctrl *ctrl, in nvme_set_ns_ana_state() argument
480 if (nvme_ctrl_use_ana(ns->ctrl)) { in nvme_mpath_add_disk()
481 mutex_lock(&ns->ctrl->ana_lock); in nvme_mpath_add_disk()
483 nvme_parse_ana_log(ns->ctrl, ns, nvme_set_ns_ana_state); in nvme_mpath_add_disk()
484 mutex_unlock(&ns->ctrl->ana_lock); in nvme_mpath_add_disk()
510 int nvme_mpath_init(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id) in nvme_mpath_init() argument
514 if (!nvme_ctrl_use_ana(ctrl)) in nvme_mpath_init()
517 ctrl->anacap = id->anacap; in nvme_mpath_init()
518 ctrl->anatt = id->anatt; in nvme_mpath_init()
519 ctrl->nanagrpid = le32_to_cpu(id->nanagrpid); in nvme_mpath_init()
520 ctrl->anagrpmax = le32_to_cpu(id->anagrpmax); in nvme_mpath_init()
522 mutex_init(&ctrl->ana_lock); in nvme_mpath_init()
523 timer_setup(&ctrl->anatt_timer, nvme_anatt_timeout, 0); in nvme_mpath_init()
524 ctrl->ana_log_size = sizeof(struct nvme_ana_rsp_hdr) + in nvme_mpath_init()
525 ctrl->nanagrpid * sizeof(struct nvme_ana_group_desc); in nvme_mpath_init()
526 if (!(ctrl->anacap & (1 << 6))) in nvme_mpath_init()
527 ctrl->ana_log_size += ctrl->max_namespaces * sizeof(__le32); in nvme_mpath_init()
529 if (ctrl->ana_log_size > ctrl->max_hw_sectors << SECTOR_SHIFT) { in nvme_mpath_init()
530 dev_err(ctrl->device, in nvme_mpath_init()
532 ctrl->ana_log_size, in nvme_mpath_init()
533 ctrl->max_hw_sectors << SECTOR_SHIFT); in nvme_mpath_init()
534 dev_err(ctrl->device, "disabling ANA support.\n"); in nvme_mpath_init()
538 INIT_WORK(&ctrl->ana_work, nvme_ana_work); in nvme_mpath_init()
539 ctrl->ana_log_buf = kmalloc(ctrl->ana_log_size, GFP_KERNEL); in nvme_mpath_init()
540 if (!ctrl->ana_log_buf) { in nvme_mpath_init()
545 error = nvme_read_ana_log(ctrl, true); in nvme_mpath_init()
550 kfree(ctrl->ana_log_buf); in nvme_mpath_init()
555 void nvme_mpath_uninit(struct nvme_ctrl *ctrl) in nvme_mpath_uninit() argument
557 kfree(ctrl->ana_log_buf); in nvme_mpath_uninit()