diff options
author | Jason Gunthorpe <jgg@mellanox.com> | 2020-04-06 21:44:26 -0300 |
---|---|---|
committer | Jason Gunthorpe <jgg@mellanox.com> | 2020-04-14 15:56:34 -0300 |
commit | eb356e6dc15a30af604f052cd0e170450193c254 (patch) | |
tree | 6eaff8f7bbf704c6a0e6f4b034a9c86b95077459 /drivers/infiniband/core/uverbs_main.c | |
parent | cf26deff9036cd3270af562dbec545239e5c7f07 (diff) | |
download | linux-stable-eb356e6dc15a30af604f052cd0e170450193c254.tar.gz linux-stable-eb356e6dc15a30af604f052cd0e170450193c254.tar.bz2 linux-stable-eb356e6dc15a30af604f052cd0e170450193c254.zip |
RDMA/uverbs: Make the event_queue fds return POLLERR when disassociated
If is_closed is set, and the event list is empty, then read() will return
-EIO without blocking. After setting is_closed in
ib_uverbs_free_event_queue(), we do trigger a wake_up on the poll_wait,
but the fops->poll() function does not check it, so poll will continue to
sleep on an empty list.
Fixes: 14e23bd6d221 ("RDMA/core: Fix locking in ib_uverbs_event_read")
Link: https://lore.kernel.org/r/0-v1-ace813388969+48859-uverbs_poll_fix%25jgg@mellanox.com
Reviewed-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Diffstat (limited to 'drivers/infiniband/core/uverbs_main.c')
-rw-r--r-- | drivers/infiniband/core/uverbs_main.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c index 2d4083bf4a04..8710a3427146 100644 --- a/drivers/infiniband/core/uverbs_main.c +++ b/drivers/infiniband/core/uverbs_main.c @@ -296,6 +296,8 @@ static __poll_t ib_uverbs_event_poll(struct ib_uverbs_event_queue *ev_queue, spin_lock_irq(&ev_queue->lock); if (!list_empty(&ev_queue->event_list)) pollflags = EPOLLIN | EPOLLRDNORM; + else if (ev_queue->is_closed) + pollflags = EPOLLERR; spin_unlock_irq(&ev_queue->lock); return pollflags; |