RDMA/erdma: Introduce dma pool for hardware responses of CMDQ requests
Hardware response, such as the result of query statistics, may be too long to be directly accommodated within the CQE structure. To address this, we introduce a DMA pool to hold the hardware's responses of CMDQ requests. Signed-off-by: Cheng Xu <chengyou@linux.alibaba.com> Link: https://lore.kernel.org/r/20231227084800.99091-2-chengyou@linux.alibaba.com Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
parent
d42fafb895
commit
68cf9d82f7
@ -212,6 +212,8 @@ struct erdma_dev {
|
||||
|
||||
atomic_t num_ctx;
|
||||
struct list_head cep_list;
|
||||
|
||||
struct dma_pool *resp_pool;
|
||||
};
|
||||
|
||||
static inline void *get_queue_entry(void *qbuf, u32 idx, u32 depth, u32 shift)
|
||||
|
@ -357,6 +357,8 @@ struct erdma_cmdq_reflush_req {
|
||||
u32 rq_pi;
|
||||
};
|
||||
|
||||
#define ERDMA_HW_RESP_SIZE 256
|
||||
|
||||
/* cap qword 0 definition */
|
||||
#define ERDMA_CMD_DEV_CAP_MAX_CQE_MASK GENMASK_ULL(47, 40)
|
||||
#define ERDMA_CMD_DEV_CAP_FLAGS_MASK GENMASK_ULL(31, 24)
|
||||
|
@ -172,14 +172,30 @@ static int erdma_device_init(struct erdma_dev *dev, struct pci_dev *pdev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
dev->resp_pool = dma_pool_create("erdma_resp_pool", &pdev->dev,
|
||||
ERDMA_HW_RESP_SIZE, ERDMA_HW_RESP_SIZE,
|
||||
0);
|
||||
if (!dev->resp_pool)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = dma_set_mask_and_coherent(&pdev->dev,
|
||||
DMA_BIT_MASK(ERDMA_PCI_WIDTH));
|
||||
if (ret)
|
||||
return ret;
|
||||
goto destroy_pool;
|
||||
|
||||
dma_set_max_seg_size(&pdev->dev, UINT_MAX);
|
||||
|
||||
return 0;
|
||||
|
||||
destroy_pool:
|
||||
dma_pool_destroy(dev->resp_pool);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void erdma_device_uninit(struct erdma_dev *dev)
|
||||
{
|
||||
dma_pool_destroy(dev->resp_pool);
|
||||
}
|
||||
|
||||
static void erdma_hw_reset(struct erdma_dev *dev)
|
||||
@ -273,7 +289,7 @@ static int erdma_probe_dev(struct pci_dev *pdev)
|
||||
|
||||
err = erdma_request_vectors(dev);
|
||||
if (err)
|
||||
goto err_iounmap_func_bar;
|
||||
goto err_uninit_device;
|
||||
|
||||
err = erdma_comm_irq_init(dev);
|
||||
if (err)
|
||||
@ -314,6 +330,9 @@ err_uninit_comm_irq:
|
||||
err_free_vectors:
|
||||
pci_free_irq_vectors(dev->pdev);
|
||||
|
||||
err_uninit_device:
|
||||
erdma_device_uninit(dev);
|
||||
|
||||
err_iounmap_func_bar:
|
||||
devm_iounmap(&pdev->dev, dev->func_bar);
|
||||
|
||||
@ -339,6 +358,7 @@ static void erdma_remove_dev(struct pci_dev *pdev)
|
||||
erdma_aeq_destroy(dev);
|
||||
erdma_comm_irq_uninit(dev);
|
||||
pci_free_irq_vectors(dev->pdev);
|
||||
erdma_device_uninit(dev);
|
||||
|
||||
devm_iounmap(&pdev->dev, dev->func_bar);
|
||||
pci_release_selected_regions(pdev, ERDMA_BAR_MASK);
|
||||
|
Loading…
Reference in New Issue
Block a user