From: "Charles 'Buck' Krasic" <krasic@acm.org>
To: John Gardiner Myers <jgmyers@netscape.com>
Cc: Davide Libenzi <davidel@xmailserver.org>,
Benjamin LaHaise <bcrl@redhat.com>, Dan Kegel <dank@kegel.com>,
Shailabh Nagar <nagar@watson.ibm.com>,
linux-kernel <linux-kernel@vger.kernel.org>,
linux-aio <linux-aio@kvack.org>, Andrew Morton <akpm@digeo.com>,
David Miller <davem@redhat.com>,
Linus Torvalds <torvalds@transmeta.com>,
Stephen Tweedie <sct@redhat.com>
Subject: Re: epoll (was Re: [PATCH] async poll for 2.5)
Date: 18 Oct 2002 14:01:08 -0700 [thread overview]
Message-ID: <xu465vzo417.fsf@brittany.cse.ogi.edu> (raw)
In-Reply-To: <3DB05AB2.3010907@netscape.com>
> >[N-1] for (;;) {
> >[N ] fd = event_wait(...);
> >[N+1] while (do_io(fd) != EAGAIN);
> >[N+2} }
I'm getting confused over what minute details are being disputed here.
This debate might get clearer, to me anyway, if the example code
fragments were more concrete.
So if anybody still cares at this point, here is my stab at clarifying
some things.
PART I: THE RACE
Suppose we have the following:
1 for(;;) {
2 fd = event_wait(...);
3 if(fd == my_listen_fd) {
4 /* new connections */
5 while((new_fd = my_accept(my_listen_fd, ...) != EAGAIN))
6 epoll_addf(new_fd, ...);
7 } else {
8 /* established connections */
9 while(do_io(fd) != EAGAIN)
10 }
11 }
With the current epoll/rtsig semantics, there is a race condition
above. I think this essentially the same race condition as the
snippet at the top of this message.
Just to be clear, I walk completely through the steps in the race
scenario, as follows.
We start with our application blocked in line 2.
A new connection is initiated by the application on other side.
The kernels exchange SYNs, causing the connection to be established.
The kernel on our side queues the new connection, waiting for the
application on this side to call accept(). In the process it fires an
edge POLLIN on the listen_fd, which wakes up the kernel side of line
2. However, some time may pass before we actually wake up.
Meanwhile, the other side immediately sends some application level
data. The other side is going to wait for us to read the application
level data and respond. So it is now blocked.
All of this happens before our application runs line 5 to pick up the
new connection from the kernel.
Here comes the race:
Before we reach line 6, new_fd is not in epoll mode, so packet
arrivals do not trigger a POLLIN edge notfication on new_fd.
After line 6, there will be no data from the other side, so there will
still be no POLLIN edge notification for new_fd.
Therefore, line 2 will never yield a POLLIN event for new_fd, and the
new connection is now deadlocked.
Is this the kind of race we're talking about?
If so, we proceed as follows.
PART 2: SOLUTIONS
A race free alternative to write the code above is as follows. Only
one new line (marked with *) is added.
1 for(;;) {
2 fd = event_wait(...);
3 if(fd == my_listen_fd) {
4 /* new connections */
5 while((new_fd = my_accept(my_listen_fd, ...) != EAGAIN)) {
6 epoll_addf(new_fd, ...);
7* while(do_io(new_fd) != EAGAIN);
8 }
9 } else {
10 /* established connections */
11 while(do_io(fd) != EAGAIN)
12 }
13 }
The example above works with current epoll and rtsig semantics. This
is just rephrasing what Davide has been saying: "Never call event_wait
without first ensuring that IO space is definitively exhausted".
Or we could have (to make John happier?):
1 for(;;) {
2 fd = event_wait(...);
3 if(fd == my_listen_fd) {
4 /* new connections */
5 while((new_fd = my_accept(my_listen_fd, ...) != EAGAIN)) {
6* epoll_addf(new_fd, &pfd, ...);
7* if(pfd.revents & POLLIN) {
7* while(do_io(new_fd) != EAGAIN);
8* }
8 }
9 } else {
10 /* established connections */
11 while(do_io(fd) != EAGAIN)
12 }
13 }
Here, epoll_addf primitive has been modified to return the initial
status. Presumably so we avoid the first call to do_io if there is
nothing to do yet.
If it's easy to do (change add primitive that is), why not?
The first solution works either way.
-- Buck
next prev parent reply other threads:[~2002-10-18 21:00 UTC|newest]
Thread overview: 138+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-10-14 22:36 [PATCH] async poll for 2.5 Shailabh Nagar
2002-10-14 22:54 ` John Myers
2002-10-15 15:05 ` Benjamin LaHaise
2002-10-15 17:06 ` Dan Kegel
2002-10-15 17:03 ` Benjamin LaHaise
2002-10-15 17:18 ` Dan Kegel
2002-10-16 2:11 ` Lincoln Dale
2002-10-15 18:09 ` Shailabh Nagar
2002-10-15 18:53 ` Dan Kegel
2002-10-15 18:57 ` Benjamin LaHaise
2002-10-15 20:25 ` John Gardiner Myers
2002-10-15 21:09 ` Dan Kegel
2002-10-15 21:50 ` John Myers
2002-10-15 22:33 ` Davide Libenzi
2002-10-15 22:56 ` John Gardiner Myers
2002-10-15 23:23 ` Davide Libenzi
2002-10-16 19:16 ` John Myers
2002-10-15 21:11 ` Davide Libenzi
2002-10-15 22:01 ` John Gardiner Myers
2002-10-15 22:27 ` Davide Libenzi
2002-10-15 22:36 ` John Gardiner Myers
2002-10-15 22:41 ` Benjamin LaHaise
2002-10-15 23:26 ` John Gardiner Myers
2002-10-15 23:05 ` Davide Libenzi
2002-10-15 23:33 ` John Gardiner Myers
2002-10-16 0:05 ` Davide Libenzi
2002-10-16 0:15 ` John Myers
2002-10-16 14:25 ` Davide Libenzi
2002-10-16 18:15 ` John Gardiner Myers
2002-10-16 19:20 ` Davide Libenzi
2002-10-16 23:31 ` epoll (was Re: [PATCH] async poll for 2.5) John Gardiner Myers
2002-10-16 23:51 ` Davide Libenzi
2002-10-17 18:06 ` John Gardiner Myers
2002-10-17 18:33 ` Davide Libenzi
2002-10-18 19:02 ` John Gardiner Myers
2002-10-18 19:52 ` Davide Libenzi
2002-10-19 0:55 ` John Myers
2002-10-19 5:40 ` Davide Libenzi
2002-10-19 6:59 ` Mark Mielke
2002-10-19 17:26 ` Davide Libenzi
2002-10-19 17:48 ` Dan Kegel
2002-10-19 18:52 ` Charles 'Buck' Krasic
2002-10-19 20:18 ` Charles 'Buck' Krasic
2002-10-19 21:08 ` Dan Kegel
2002-10-22 19:35 ` John Gardiner Myers
2002-10-22 20:06 ` Davide Libenzi
2002-10-22 21:54 ` Erich Nahum
2002-10-22 22:17 ` Dan Kegel
2002-10-22 22:25 ` Davide Libenzi
2002-10-18 21:01 ` Charles 'Buck' Krasic [this message]
2002-10-18 21:33 ` Davide Libenzi
2002-10-19 1:05 ` John Myers
2002-10-19 1:27 ` Tervel Atanassov
2002-10-19 18:52 ` John G. Myers
2002-10-19 4:07 ` Charles 'Buck' Krasic
2002-10-16 20:06 ` [PATCH] async poll for 2.5 Mark Mielke
2002-10-16 23:48 ` epoll (was Re: [PATCH] async poll for 2.5) John Gardiner Myers
2002-10-17 0:23 ` Davide Libenzi
2002-10-17 17:45 ` John Myers
2002-10-16 2:45 ` [PATCH] async poll for 2.5 Charles 'Buck' Krasic
2002-10-16 14:28 ` Davide Libenzi
2002-10-17 18:47 ` Charles 'Buck' Krasic
2002-10-17 19:20 ` Davide Libenzi
2002-10-18 3:30 ` Dan Kegel
2002-10-16 18:29 ` John Gardiner Myers
2002-10-16 20:39 ` Charles 'Buck' Krasic
2002-10-17 17:59 ` epoll (was Re: [PATCH] async poll for 2.5) John Gardiner Myers
2002-10-21 16:58 ` [PATCH] async poll for 2.5 Alan Cox
2002-10-21 16:50 ` Benjamin LaHaise
2002-10-16 19:59 ` Dan Kegel
2002-10-16 20:03 ` Dan Kegel
2002-10-17 17:43 ` epoll (was Re: [PATCH] async poll for 2.5) John Myers
2002-10-18 17:00 ` Mark Mielke
2002-10-18 17:28 ` Dan Kegel
2002-10-18 17:41 ` Davide Libenzi
2002-10-18 18:55 ` Mark Mielke
2002-10-18 19:16 ` Davide Libenzi
2002-10-19 6:56 ` Mark Mielke
2002-10-19 16:10 ` Charles 'Buck' Krasic
2002-10-22 17:22 ` Mark Mielke
2002-10-22 17:46 ` Dan Kegel
2002-10-22 17:47 ` Davide Libenzi
2002-10-22 18:13 ` Alan Cox
2002-10-22 18:18 ` Davide Libenzi
2002-10-22 18:37 ` Benjamin LaHaise
2002-10-22 19:22 ` John Gardiner Myers
2002-10-22 19:28 ` Benjamin LaHaise
2002-10-22 19:50 ` John Gardiner Myers
2002-10-22 20:00 ` Benjamin LaHaise
2002-10-22 20:23 ` async poll John Myers
2002-10-23 11:10 ` Latest aio code (was Re: [PATCH] async poll for 2.5) Suparna Bhattacharya
2002-10-22 19:49 ` epoll " Davide Libenzi
2002-10-22 18:42 ` Charles 'Buck' Krasic
2002-10-22 19:35 ` Davide Libenzi
2002-10-23 16:49 ` Dan Kegel
2002-10-23 17:39 ` Benjamin LaHaise
2002-10-23 18:47 ` Davide Libenzi
2002-10-23 21:18 ` Benjamin LaHaise
2002-10-23 21:35 ` Davide Libenzi
2002-10-23 21:39 ` John Gardiner Myers
2002-10-23 21:54 ` Davide Libenzi
2002-10-23 17:49 ` Charles 'Buck' Krasic
2002-10-23 18:14 ` Davide Libenzi
2002-10-23 18:32 ` Charles 'Buck' Krasic
2002-10-23 20:36 ` async poll John Myers
2002-10-23 20:57 ` Dan Kegel
2002-10-23 21:23 ` John Gardiner Myers
2002-10-23 21:51 ` Davide Libenzi
2002-10-23 21:51 ` bert hubert
2002-10-23 22:10 ` Davide Libenzi
2002-10-23 21:54 ` John Gardiner Myers
2002-10-23 22:22 ` Davide Libenzi
2002-10-23 22:29 ` John Gardiner Myers
2002-10-23 22:50 ` Davide Libenzi
2002-10-24 7:32 ` Eduardo Pérez
2002-10-24 15:05 ` Charles 'Buck' Krasic
2002-10-23 22:24 ` Dan Kegel
2002-10-23 22:30 ` Davide Libenzi
2002-10-23 22:53 ` Davide Libenzi
2002-10-23 21:13 ` Charles 'Buck' Krasic
2002-10-19 17:19 ` epoll (was Re: [PATCH] async poll for 2.5) Davide Libenzi
2002-10-18 18:55 ` Chris Friesen
2002-10-18 19:00 ` Mark Mielke
2002-10-15 17:38 ` [PATCH] async poll for 2.5 Shailabh Nagar
2002-10-15 17:50 ` Benjamin LaHaise
2002-10-15 18:16 ` Davide Libenzi
2002-10-15 18:18 ` Shailabh Nagar
2002-10-15 19:00 ` Davide Libenzi
2002-10-15 19:02 ` Benjamin LaHaise
2002-10-15 18:59 ` Shailabh Nagar
2002-10-15 19:16 ` Davide Libenzi
2002-10-15 19:12 ` Benjamin LaHaise
2002-10-15 19:31 ` Davide Libenzi
2002-10-15 19:38 ` Dan Kegel
2002-10-15 19:55 ` Davide Libenzi
2002-10-15 20:36 ` John Gardiner Myers
2002-10-15 20:39 ` Benjamin LaHaise
2002-10-15 19:02 ` Davide Libenzi
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=xu465vzo417.fsf@brittany.cse.ogi.edu \
--to=krasic@acm.org \
--cc=akpm@digeo.com \
--cc=bcrl@redhat.com \
--cc=dank@kegel.com \
--cc=davem@redhat.com \
--cc=davidel@xmailserver.org \
--cc=jgmyers@netscape.com \
--cc=linux-aio@kvack.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nagar@watson.ibm.com \
--cc=sct@redhat.com \
--cc=torvalds@transmeta.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
all inboxes | Powered by JetHome®