Skip to content

Commit

Permalink
dma/hisilicon: enhance CQ scan robustness
Browse files Browse the repository at this point in the history
[ upstream commit e03c601 ]

The CQ (completion queue) descriptors were updated by hardware, and then
scanned by driver to retrieve hardware completion status.

This patch enhances robustness by following:
1. replace while (true) with a finite loop to avoid potential dead loop.
2. check the csq_head field in CQ descriptor to avoid status array
overflows.

Fixes: 2db4f0b ("dma/hisilicon: add data path")

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
  • Loading branch information
fengchengwen authored and kevintraynor committed Jun 8, 2022
1 parent 2f31401 commit 216108a
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion drivers/dma/hisilicon/hisi_dmadev.c
Expand Up @@ -581,14 +581,24 @@ hisi_dma_scan_cq(struct hisi_dma_dev *hw)
uint16_t count = 0;
uint64_t misc;

while (true) {
while (count < hw->cq_depth) {
cqe = &hw->cqe[cq_head];
misc = cqe->misc;
misc = rte_le_to_cpu_64(misc);
if (FIELD_GET(CQE_VALID_B, misc) != hw->cqe_vld)
break;

csq_head = FIELD_GET(CQE_SQ_HEAD_MASK, misc);
if (unlikely(csq_head > hw->sq_depth_mask)) {
/**
* Defensive programming to prevent overflow of the
* status array indexed by csq_head. Only error logs
* are used for prompting.
*/
HISI_DMA_ERR(hw, "invalid csq_head:%u!\n", csq_head);
count = 0;
break;
}
if (unlikely(misc & CQE_STATUS_MASK))
hw->status[csq_head] = FIELD_GET(CQE_STATUS_MASK,
misc);
Expand Down

0 comments on commit 216108a

Please sign in to comment.