Skip to content

Commit

Permalink
net/hns3: fix crash when secondary process access FW
Browse files Browse the repository at this point in the history
[ upstream commit a8f1f7c ]

Currently, to prevent missing reporting of reset interrupts and quickly
identify reset interrupts, the following logic is designed in the
FW (firmware) command interface hns3_cmd_send: if an unprocessed
interrupt exist (by checking reset registers), related reset task is
scheduled.

The secondary process may invoke the hns3_cmd_send interface (e.g. using
proc-info query some stats). Unfortunately, the secondary process
does not support reset processing, and a segment fault may occur if it
schedules reset task.

Fix it by limit the checking and scheduling of reset under only primary
process.

Fixes: 2790c64 ("net/hns3: support device reset")

Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
  • Loading branch information
fengchengwen authored and kevintraynor committed Oct 20, 2022
1 parent daf6edc commit afa520b
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 3 deletions.
10 changes: 9 additions & 1 deletion drivers/net/hns3/hns3_ethdev.c
Expand Up @@ -5629,7 +5629,15 @@ hns3_is_reset_pending(struct hns3_adapter *hns)
struct hns3_hw *hw = &hns->hw;
enum hns3_reset_level reset;

hns3_check_event_cause(hns, NULL);
/*
* Check the registers to confirm whether there is reset pending.
* Note: This check may lead to schedule reset task, but only primary
* process can process the reset event. Therefore, limit the
* checking under only primary process.
*/
if (rte_eal_process_type() == RTE_PROC_PRIMARY)
hns3_check_event_cause(hns, NULL);

reset = hns3_get_reset_level(hns, &hw->reset.pending);
if (reset != HNS3_NONE_RESET && hw->reset.level != HNS3_NONE_RESET &&
hw->reset.level < reset) {
Expand Down
11 changes: 9 additions & 2 deletions drivers/net/hns3/hns3_ethdev_vf.c
Expand Up @@ -1912,8 +1912,15 @@ hns3vf_is_reset_pending(struct hns3_adapter *hns)
if (hw->reset.level == HNS3_VF_FULL_RESET)
return false;

/* Check the registers to confirm whether there is reset pending */
hns3vf_check_event_cause(hns, NULL);
/*
* Check the registers to confirm whether there is reset pending.
* Note: This check may lead to schedule reset task, but only primary
* process can process the reset event. Therefore, limit the
* checking under only primary process.
*/
if (rte_eal_process_type() == RTE_PROC_PRIMARY)
hns3vf_check_event_cause(hns, NULL);

reset = hns3vf_get_reset_level(hw, &hw->reset.pending);
if (hw->reset.level != HNS3_NONE_RESET && reset != HNS3_NONE_RESET &&
hw->reset.level < reset) {
Expand Down

0 comments on commit afa520b

Please sign in to comment.