annotate poll(2) guts

struct pollfd contains two 16bit fields (mask and result) that encode
the POLL... bitmaps.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2017-07-16 23:51:03 -04:00
parent 7594bf37ae
commit fb3679372b
1 changed files with 10 additions and 6 deletions

View File

@ -803,9 +803,9 @@ struct poll_list {
* pwait poll_table will be used by the fd-provided poll handler for waiting, * pwait poll_table will be used by the fd-provided poll handler for waiting,
* if pwait->_qproc is non-NULL. * if pwait->_qproc is non-NULL.
*/ */
static inline unsigned int do_pollfd(struct pollfd *pollfd, poll_table *pwait, static inline __poll_t do_pollfd(struct pollfd *pollfd, poll_table *pwait,
bool *can_busy_poll, bool *can_busy_poll,
unsigned int busy_flag) __poll_t busy_flag)
{ {
__poll_t mask; __poll_t mask;
int fd; int fd;
@ -816,20 +816,24 @@ static inline unsigned int do_pollfd(struct pollfd *pollfd, poll_table *pwait,
struct fd f = fdget(fd); struct fd f = fdget(fd);
mask = POLLNVAL; mask = POLLNVAL;
if (f.file) { if (f.file) {
/* userland u16 ->events contains POLL... bitmap */
__poll_t filter = (__force __poll_t)pollfd->events |
POLLERR | POLLHUP;
mask = DEFAULT_POLLMASK; mask = DEFAULT_POLLMASK;
if (f.file->f_op->poll) { if (f.file->f_op->poll) {
pwait->_key = pollfd->events|POLLERR|POLLHUP; pwait->_key = filter;
pwait->_key |= busy_flag; pwait->_key |= busy_flag;
mask = f.file->f_op->poll(f.file, pwait); mask = f.file->f_op->poll(f.file, pwait);
if (mask & busy_flag) if (mask & busy_flag)
*can_busy_poll = true; *can_busy_poll = true;
} }
/* Mask out unneeded events. */ /* Mask out unneeded events. */
mask &= pollfd->events | POLLERR | POLLHUP; mask &= filter;
fdput(f); fdput(f);
} }
} }
pollfd->revents = mask; /* ... and so does ->revents */
pollfd->revents = (__force u16)mask;
return mask; return mask;
} }
@ -841,7 +845,7 @@ static int do_poll(struct poll_list *list, struct poll_wqueues *wait,
ktime_t expire, *to = NULL; ktime_t expire, *to = NULL;
int timed_out = 0, count = 0; int timed_out = 0, count = 0;
u64 slack = 0; u64 slack = 0;
unsigned int busy_flag = net_busy_loop_on() ? POLL_BUSY_LOOP : 0; __poll_t busy_flag = net_busy_loop_on() ? POLL_BUSY_LOOP : 0;
unsigned long busy_start = 0; unsigned long busy_start = 0;
/* Optimise the no-wait case */ /* Optimise the no-wait case */