Re: [PATCH] RDMA/uverbs: Make the event_queue fds return POLLERR when disassociated

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Apr 07, 2020 at 08:16:32AM +0300, Leon Romanovsky wrote:
> On Mon, Apr 06, 2020 at 09:44:26PM -0300, Jason Gunthorpe wrote:
> > From: Jason Gunthorpe <jgg@xxxxxxxxxxxx>
> >
> > 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")
> > Signed-off-by: Jason Gunthorpe <jgg@xxxxxxxxxxxx>
> >  drivers/infiniband/core/uverbs_main.c | 2 ++
> >  1 file changed, 2 insertions(+)
> >
> > diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c
> > index 2d4083bf4a0487..8710a3427146e7 100644
> > +++ 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);
> 
> Don't you need to set EPOLLHUP too? Probably, it won't change anything,
> just for the sake of the correctness.

HUP means read will return 0, in this case read returns -EIO

Jason



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux