linux nvme的那些workqueue
目前nvme三个常见的使用的workqueue ,主要有nvme_workq,nvme_rdma_wq ,nvme_fc_wq,下面一一描述一下初始化及使用的场景。分别对应于NVME over PCIE,NVMe over RDMA ,NVMe over Fabrics这三种部署场景。
nvme_workq,workqueue名称为nvme,一个nvme设备会创建一个,由于alloc_workqueue最后一个参数味0,表示不限制个数。
初始化在:
static int __init nvme_init(void) { int result; nvme_workq = alloc_workqueue("nvme", WQ_UNBOUND | WQ_MEM_RECLAIM, 0); if (!nvme_workq)//创建工作队列,参数为0表示不限制个数,弹性 return -ENOMEM; result = pci_register_driver(&nvme_driver);//nvme属于PCI,注册pci 驱动 if (result) destroy_workqueue(nvme_workq); return result; }
主要的使用在:
static int nvme_reset(struct nvme_dev *dev) { if (!dev->ctrl.admin_q || blk_queue_dying(dev->ctrl.admin_q)) return -ENODEV; if (work_busy(&dev->reset_work)) return -ENODEV; if (!queue_work(nvme_workq, &dev->reset_work))-----------主要执行reset_work,也就是nvme_reset_work函数
return -EBUSY; return 0; }
nvme_rdma_wq ,workqueue名称为nvme_rdma_wq,只创建一个。主要完成nvme_rdma_ctrl这类结构的work,如
static int __init nvme_rdma_init_module(void) { int ret; nvme_rdma_wq = create_workqueue("nvme_rdma_wq");----------只创建一个。 if (!nvme_rdma_wq) return -ENOMEM; ret = ib_register_client(&nvme_rdma_ib_client); if (ret) { destroy_workqueue(nvme_rdma_wq); return ret; } nvmf_register_transport(&nvme_rdma_transport); return 0; }
主要的使用在:
static struct nvme_ctrl *nvme_rdma_create_ctrl(struct device *dev,
struct nvmf_ctrl_options *opts)
{
... //这三个work,都是交给nvme_rdma_wq
INIT_WORK(&ctrl->err_work, nvme_rdma_error_recovery_work); INIT_WORK(&ctrl->delete_work, nvme_rdma_del_ctrl_work); INIT_WORK(&ctrl->reset_work, nvme_rdma_reset_ctrl_work);
....
nvme_fc_wq,workqueue名称为nvme_fc_wq,
static int __init nvme_fc_init_module(void) { mark_tech_preview("NVMe over FC", THIS_MODULE); nvme_fc_wq = create_workqueue("nvme_fc_wq");----只创建一个 if (!nvme_fc_wq) return -ENOMEM; nvmf_register_transport(&nvme_fc_transport); return 0; }
主要用在:
static struct nvme_ctrl * __nvme_fc_create_ctrl(struct device *dev, struct nvmf_ctrl_options *opts, struct nvme_fc_lport *lport, struct nvme_fc_rport *rport) { INIT_WORK(&ctrl->delete_work, nvme_fc_del_ctrl_work);-----目前只有nvme_fc_del_ctrl_work 交给这个工作队列完成
}
水平有限,如果有错误,请帮忙提醒我。如果您觉得本文对您有帮助,可以点击下面的 推荐 支持一下我。版权所有,需要转发请带上本文源地址,博客一直在更新,欢迎 关注 。