Skip to content

Commit

Permalink
net/tap: fix unexpected link handler
Browse files Browse the repository at this point in the history
[ upstream commit dc1a4d8 ]

The nic's interrupt source has some active handler, which maybe call
tap_dev_intr_handler() to set link handler. We should cancel the link
handler before close fd to prevent executing the link handler. It
triggers segfault.

Call Trace:
   0x00007f15e08dad99 in __rte_panic (Error adding fd %d epoll_ctl, %s\n")
   0x00007f15e08e9b87 in eal_intr_thread_main ()
   0x00007f15e249be15 in start_thread ()
   0x00007f15d5322f9d in clone ()

Fixes: c0bddd3 ("net/tap: add link status notification")

Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
  • Loading branch information
wyjwang authored and kevintraynor committed May 27, 2020
1 parent 78d8e91 commit 6b0addc
Showing 1 changed file with 22 additions and 5 deletions.
27 changes: 22 additions & 5 deletions drivers/net/tap/rte_eth_tap.c
Expand Up @@ -18,6 +18,7 @@
#include <rte_string_fns.h>
#include <rte_ethdev.h>
#include <rte_errno.h>
#include <rte_cycles.h>

#include <sys/types.h>
#include <sys/stat.h>
Expand Down Expand Up @@ -1520,13 +1521,12 @@ static int
tap_lsc_intr_handle_set(struct rte_eth_dev *dev, int set)
{
struct pmd_internals *pmd = dev->data->dev_private;
int ret;

/* In any case, disable interrupt if the conf is no longer there. */
if (!dev->data->dev_conf.intr_conf.lsc) {
if (pmd->intr_handle.fd != -1) {
tap_nl_final(pmd->intr_handle.fd);
rte_intr_callback_unregister(&pmd->intr_handle,
tap_dev_intr_handler, dev);
goto clean;
}
return 0;
}
Expand All @@ -1537,9 +1537,26 @@ tap_lsc_intr_handle_set(struct rte_eth_dev *dev, int set)
return rte_intr_callback_register(
&pmd->intr_handle, tap_dev_intr_handler, dev);
}

clean:
do {
ret = rte_intr_callback_unregister(&pmd->intr_handle,
tap_dev_intr_handler, dev);
if (ret >= 0) {
break;
} else if (ret == -EAGAIN) {
rte_delay_ms(100);
} else {
TAP_LOG(ERR, "intr callback unregister failed: %d",
ret);
break;
}
} while (true);

tap_nl_final(pmd->intr_handle.fd);
return rte_intr_callback_unregister(&pmd->intr_handle,
tap_dev_intr_handler, dev);
pmd->intr_handle.fd = -1;

return 0;
}

static int
Expand Down

0 comments on commit 6b0addc

Please sign in to comment.