diff options
author | Cheng Xu <chengyou@linux.alibaba.com> | 2022-11-16 10:31:05 +0800 |
---|---|---|
committer | Jason Gunthorpe <jgg@nvidia.com> | 2022-11-24 14:58:52 -0400 |
commit | 35765dccaf3485575a4420da529c72484c980345 (patch) | |
tree | 0850cc561f33843ba0eaff6e22e4348af38febbc | |
parent | b4d46c57d2fb0fa2611fa2ffbaf715925989f83f (diff) | |
download | linux-stable-35765dccaf3485575a4420da529c72484c980345.tar.gz linux-stable-35765dccaf3485575a4420da529c72484c980345.tar.bz2 linux-stable-35765dccaf3485575a4420da529c72484c980345.zip |
RDMA/erdma: Add a workqueue for WRs reflushing
ERDMA driver use a workqueue for asynchronous reflush command posting.
Implement the lifecycle of this workqueue.
Link: https://lore.kernel.org/r/20221116023107.82835-2-chengyou@linux.alibaba.com
Signed-off-by: Cheng Xu <chengyou@linux.alibaba.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
-rw-r--r-- | drivers/infiniband/hw/erdma/erdma.h | 1 | ||||
-rw-r--r-- | drivers/infiniband/hw/erdma/erdma_main.c | 14 |
2 files changed, 13 insertions, 2 deletions
diff --git a/drivers/infiniband/hw/erdma/erdma.h b/drivers/infiniband/hw/erdma/erdma.h index 35726f25a989..3d8c11aa23a2 100644 --- a/drivers/infiniband/hw/erdma/erdma.h +++ b/drivers/infiniband/hw/erdma/erdma.h @@ -190,6 +190,7 @@ struct erdma_dev { struct net_device *netdev; struct pci_dev *pdev; struct notifier_block netdev_nb; + struct workqueue_struct *reflush_wq; resource_size_t func_bar_addr; resource_size_t func_bar_len; diff --git a/drivers/infiniband/hw/erdma/erdma_main.c b/drivers/infiniband/hw/erdma/erdma_main.c index e44b06fea595..5dc31e5df5cb 100644 --- a/drivers/infiniband/hw/erdma/erdma_main.c +++ b/drivers/infiniband/hw/erdma/erdma_main.c @@ -521,13 +521,22 @@ static int erdma_ib_device_add(struct pci_dev *pdev) u64_to_ether_addr(mac, dev->attrs.peer_addr); + dev->reflush_wq = alloc_workqueue("erdma-reflush-wq", WQ_UNBOUND, + WQ_UNBOUND_MAX_ACTIVE); + if (!dev->reflush_wq) { + ret = -ENOMEM; + goto err_alloc_workqueue; + } + ret = erdma_device_register(dev); if (ret) - goto err_out; + goto err_register; return 0; -err_out: +err_register: + destroy_workqueue(dev->reflush_wq); +err_alloc_workqueue: xa_destroy(&dev->qp_xa); xa_destroy(&dev->cq_xa); @@ -543,6 +552,7 @@ static void erdma_ib_device_remove(struct pci_dev *pdev) unregister_netdevice_notifier(&dev->netdev_nb); ib_unregister_device(&dev->ibdev); + destroy_workqueue(dev->reflush_wq); erdma_res_cb_free(dev); xa_destroy(&dev->qp_xa); xa_destroy(&dev->cq_xa); |