Re: poll() in 2.6 and beyond

From: Richard B. Johnson
Date: Wed Mar 03 2004 - 18:05:08 EST


On Wed, 3 Mar 2004, Linus Torvalds wrote:

>
>
> On Wed, 3 Mar 2004, Linus Torvalds wrote:
> >
> > You should clear the "events pending" flag only when you literally remove
> > the event (ie at "read()" time, not at "poll()" time). Because the
> > select() code _will_ call down to the "poll()" functions multiple times if
> > it gets woken up for any bogus reason.
>
> Hmm.. The above is all still true and your poll() implementation is bad,
> but looking at your test program, the problematic case really shouldn't
> trigger (we should call poll() multiple times only when it returns zero).
>
> To trigger that bug, you'd have to occasionally call poll() with the
> POLLIN bit clear in the incoming events, which your test program doesn't
> ever do.
>

Well, when I removed the local poll_flag, using only the global one,
and cleared it to zero after the long long was fetched under the lock
(in the read routine), my observed problems go away.

static size_t poll(struct file *fp, struct poll_table_struct *wait)
{
DEB(printk(KERN_INFO"%s : poll() called\n", devname));
poll_wait(fp, &pwait, wait);
DEB(printk(KERN_INFO"%s : poll() returned\n", devname));
return global_poll_flag;
}

static int read(struct file *fp, char *buf, size_t count, loff_t *ppos)
{
long long tmp;
size_t flags;
spin_lock_irqsave(&rtc_lock, flags);
tmp = rtc_tick;
global_poll_flag = 0;
spin_unlock_irqrestore(&rtc_lock, flags);
if(copy_to_user(buf, &tmp, sizeof(tmp)))
return -EFAULT;
return sizeof(tmp);
}

> Anyway, you should move the clearing to read(), but there may well be
> something else going on too.
>
> What's the frequency you are programming the thing to send interrupts at?
>

2048 ticks/second, trivial to handle.

> Linus
> -


Cheers,
Dick Johnson
Penguin : Linux version 2.4.24 on an i686 machine (797.90 BogoMips).
Note 96.31% of all statistics are fiction.


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/