public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: "John Muir" <muirj@nortelnetworks.com>
To: root@chaos.analogic.com
Cc: linux-kernel@vger.kernel.org
Subject: Re: poll() in 2.6 and beyond
Date: Tue, 02 Mar 2004 19:07:14 -0500	[thread overview]
Message-ID: <404521B2.2030504@americasm01.nt.com> (raw)
In-Reply-To: <Pine.LNX.4.53.0403021817050.9351@chaos>

Richard B. Johnson wrote:

> > Could you maybe go back to the initial report, which is that after
> > poll() gets wrong status? It's nice to argue about where the process
> > waits, but the issue is if it gets the same status with 2.4 and 2.6, 
> and
> > if not which one should be fixed.
> >
> > Richard: can you show this with a small demo program? I assume you
> > didn't find this just by reading code ;-)
>
> Yes. The code I attached earlier shows that the poll() in a driver
> gets called (correctly), then it calls poll_wait(). Unfortunately
> the call to poll_wait() returns immediately so that the return
> value from the driver's poll() is whatever it was before some
> event occurred that the driver was going to signal with
> wake_up_interruptible().
>
The documentation referred to earlier 
(http://www.xml.com/ldd/chapter/book/ch05.html#t3) clearly states that 
the poll function implementation for a device should:
"1. Call /poll_wait/ on one or more wait queues that could indicate a 
change in the poll status.
2. Return a bit mask describing operations that could be immediately 
performed without blocking."
What happens is if your device has data ready RIGHT NOW (without any 
waiting), the information regarding that is returned.

Now, if you look closely at the implementation of do_poll(), it will 
loop forever until any device returns that data is available (or the 
timeout occurs). After data is available, do_pollfd() function no longer 
adds the devices to the wait queue.

What this means is that the first time through each device is added to 
the wait queue. After the process is woken up from schedule_timeout (or 
the timeout occurs), then it will loop through each device again to 
either add that device to the wait queue again, or determine that there 
is data ready to be read/written, or an error or whatever. do_pollfd() 
then increases count, and do_poll() exits from it's loop (and wait 
queues are cleaned-up in sys_poll()).

So, yes, the poll_wait() returns immediately, it should not wait, and 
your poll method should return the device's CURRENT status in the poll 
mask. Don't worry, because when your device wakes the waiting process 
when data is ready, the device's poll function is called again and you 
again can return the CURRENT status.

Please let me know if I'm misunderstanding this, but quite frankly, 
poll_wait CANNOT wait, for the very reasons described in previous posts: 
when multiple devices are polled, then poll_wait is called FOR EACH DEVICE.

Cheers,

..John



  reply	other threads:[~2004-03-03  0:07 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1vmPm-4lU-11@gated-at.bofh.it>
     [not found] ` <1vonq-6dr-37@gated-at.bofh.it>
     [not found]   ` <1voGY-6vC-41@gated-at.bofh.it>
     [not found]     ` <1vpjt-7dl-17@gated-at.bofh.it>
     [not found]       ` <1vpCV-7wY-41@gated-at.bofh.it>
     [not found]         ` <1vpWa-7Py-19@gated-at.bofh.it>
2004-03-02 22:53           ` poll() in 2.6 and beyond Bill Davidsen
2004-03-02 22:57             ` Roland Dreier
2004-03-02 23:32             ` Richard B. Johnson
2004-03-03  0:07               ` John Muir [this message]
2004-03-03  1:18                 ` Richard B. Johnson
2004-03-03  4:04                   ` Roland Dreier
2004-03-03 12:38                     ` Richard B. Johnson
2004-03-03 14:29                       ` Davide Libenzi
2004-03-03  3:57               ` David Dillow
2004-03-03 18:23                 ` Richard B. Johnson
2004-03-03 19:29                   ` Dave Dillow
2004-03-03 20:10                     ` Richard B. Johnson
2004-03-03 22:25                   ` Linus Torvalds
2004-03-03 22:42                     ` Richard B. Johnson
2004-03-03 23:14                       ` Linus Torvalds
2004-03-03 22:52                     ` Linus Torvalds
2004-03-03 23:07                       ` Richard B. Johnson
2004-03-03  3:06 linux
  -- strict thread matches above, loose matches on Subject: below --
2004-03-02 18:21 Richard B. Johnson
2004-03-02 20:04 ` Roland Dreier
2004-03-02 20:24   ` Richard B. Johnson
2004-03-02 21:00     ` Roland Dreier
2004-03-02 21:26       ` Richard B. Johnson
2004-03-02 21:39         ` Roland Dreier
2004-03-02 21:59           ` Richard B. Johnson
2004-03-02 22:41             ` Dave Dillow
2004-03-02 22:56             ` Roland Dreier
2004-03-02 23:16               ` Richard B. Johnson
2004-03-02 23:21                 ` Roland Dreier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=404521B2.2030504@americasm01.nt.com \
    --to=muirj@nortelnetworks.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=root@chaos.analogic.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox