With vhost, the USER_POLL flags isn't passed to ioeventfd__add_event, the function returns early and doesn't add the new event to the used_ioevents list. As a result ioeventfd__del_event doesn't remove the KVM event or free the structure. Always add the event to the list. Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@xxxxxxx> --- ioeventfd.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/ioeventfd.c b/ioeventfd.c index bce68619bd17..186ac703e365 100644 --- a/ioeventfd.c +++ b/ioeventfd.c @@ -154,18 +154,17 @@ int ioeventfd__add_event(struct ioevent *ioevent, int flags) goto cleanup; } - if (!(flags & IOEVENTFD_FLAG_USER_POLL)) - return 0; - - epoll_event = (struct epoll_event) { - .events = EPOLLIN, - .data.ptr = new_ioevent, - }; - - r = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, event, &epoll_event); - if (r) { - r = -errno; - goto cleanup; + if (flags & IOEVENTFD_FLAG_USER_POLL) { + epoll_event = (struct epoll_event) { + .events = EPOLLIN, + .data.ptr = new_ioevent, + }; + + r = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, event, &epoll_event); + if (r) { + r = -errno; + goto cleanup; + } } list_add_tail(&new_ioevent->list, &used_ioevents); -- 2.16.2