[dm-devel] [PATCH 1/3] dm: a basic support for using the select or poll function

Andy Grover agrover at redhat.com
Thu May 11 21:46:21 UTC 2017


On 05/11/2017 12:30 PM, Martin Wilck wrote:
> 
> I see - but I don't see yet how the ioctl approach (or the
> close()/open() based one, for that matter) would avoid this race.
> 
>   1) application processes event N
>   2) event N+1 arrives in the kernel
>   3) user space issues ioctl or close()/open() sequence, N+1 is recorded
>      in priv->global_event_nr
>   4) user space runs poll()
>   5) event N+2 arrives 4 weeks later and poll returns
> 
> ... meaning that event N+1 has been left unprocessed for 4 weeks.
> Or what I am missing?
> 
> AFAICS, the only way for user space to make sure it misses no events
> would be passing the number of the last processed event down the kernel
> in the ioctl call (and the kernel would use that value, rather than its
> internal counter, for initializing priv->global_event_nr).

a) Application notes initial event_nrs for all relevant devices
while (1)
     b) Application calls ARM_POLL
     c) Application gets updated event_nrs from LIST_DEVICES and handles
     d) Application calls poll()

If events arrive between b and c, app sees them.
If events arrive between c and d, dm_global_event_nr is greater than 
priv->global_event_nr and poll() will indicate fd is ready immediately 
w/o sleeping.
If events arrive after d, app sleeps in poll() until fd is ready.

The difference is that you have to ARM_POLL and *then* process events 
before calling poll(). The only small negative consequence is that if an 
event arrives between b and c, it will be handled by c but poll() will 
still see readiness and pop out of the poll() and loop again when it 
strictly didn't have to. But events won't be lost.

Regards -- Andy




More information about the dm-devel mailing list