diff options
author | Luca Boccassi <luca.boccassi@gmail.com> | 2019-03-20 14:50:04 +0000 |
---|---|---|
committer | Luca Boccassi <luca.boccassi@gmail.com> | 2019-03-20 14:50:10 +0000 |
commit | 36e178648f46ea9fb63d89097c59ce45fb8a67fe (patch) | |
tree | e3ee0ea25a45aa28918dc721dd1fe19b27d6849c /lib/librte_eal/linuxapp/eal/eal_interrupts.c | |
parent | 1ab31fb74132eabd45f326413eb6e4f647de48d9 (diff) | |
parent | f7a9461e29147c47ce2bb81bd157ac1833cf5eb1 (diff) |
Merge tag 'upstream/16.11.9' into 16.11.x
Upstream version 16.11.9
Change-Id: I947c2532ec89a9850d135bde544b4d5812b49e4f
Signed-off-by: Luca Boccassi <luca.boccassi@gmail.com>
Diffstat (limited to 'lib/librte_eal/linuxapp/eal/eal_interrupts.c')
-rw-r--r-- | lib/librte_eal/linuxapp/eal/eal_interrupts.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c index 7f739140..cce69285 100644 --- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c +++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c @@ -647,7 +647,7 @@ eal_intr_process_interrupts(struct epoll_event *events, int nfds) { int n, bytes_read; struct rte_intr_source *src; - struct rte_intr_callback *cb; + struct rte_intr_callback *cb, *next; union rte_intr_read_buffer buf; struct rte_intr_callback active_cb; @@ -713,6 +713,23 @@ eal_intr_process_interrupts(struct epoll_event *events, int nfds) "descriptor %d: %s\n", events[n].data.fd, strerror(errno)); + /* + * The device is unplugged or buggy, remove + * it as an interrupt source and return to + * force the wait list to be rebuilt. + */ + rte_spinlock_lock(&intr_lock); + TAILQ_REMOVE(&intr_sources, src, next); + rte_spinlock_unlock(&intr_lock); + + for (cb = TAILQ_FIRST(&src->callbacks); cb; + cb = next) { + next = TAILQ_NEXT(cb, next); + TAILQ_REMOVE(&src->callbacks, cb, next); + free(cb); + } + free(src); + return -1; } else if (bytes_read == 0) RTE_LOG(ERR, EAL, "Read nothing from file " "descriptor %d\n", events[n].data.fd); |