<?xml version="1.0" encoding="UTF-8"?>

<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://purl.org/rss/1.0/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
>

  <channel rdf:about="http://lwn.net/headlines/14168/">
    <title>LWN: Comments on "sys_epoll - making poll fast"</title>
    <link>http://lwn.net/Articles/14168/</link>
    <description>
This is a special feed containing comments posted
to the individual LWN article titled &quot;sys_epoll - making poll fast&quot;.

    </description>

    <syn:updatePeriod>hourly</syn:updatePeriod>
    <syn:updateFrequency>2</syn:updateFrequency>
    <items>
      <rdf:Seq>
	<rdf:li resource="http://lwn.net/Articles/14456/rss" />
	<rdf:li resource="http://lwn.net/Articles/14342/rss" />
	<rdf:li resource="http://lwn.net/Articles/14275/rss" />
	<rdf:li resource="http://lwn.net/Articles/14248/rss" />
	<rdf:li resource="http://lwn.net/Articles/14241/rss" />
	<rdf:li resource="http://lwn.net/Articles/14239/rss" />
	<rdf:li resource="http://lwn.net/Articles/14224/rss" />
	<rdf:li resource="http://lwn.net/Articles/14200/rss" />
      
      </rdf:Seq>
    </items>

  </channel>
    <item rdf:about="http://lwn.net/Articles/14456/rss">
      <title>I want some of them callbacks!</title>
      <link>http://lwn.net/Articles/14456/rss</link>
      <dc:date>2002-11-02T21:15:33+00:00</dc:date>
      <dc:creator>bronson</dc:creator>
      <description>
      Maybe IkeTo gave too comprehensive an answer...
&lt;p&gt;
&lt;i&gt;Is it too tricky to have the kernel change to user context and invoke a function pointer that I have given it?&lt;/i&gt;
&lt;p&gt;
Yes.
&lt;p&gt;
Whenever the kernel calls user code directly, non-obvious and non-trivial race conditions result.  It's a very difficult problem.  Much easier to just have the system call return, and then the user can deal with the callbacks however she/he wants.

      
      </description>
    </item>
    <item rdf:about="http://lwn.net/Articles/14342/rss">
      <title>I want some of them callbacks!</title>
      <link>http://lwn.net/Articles/14342/rss</link>
      <dc:date>2002-10-31T20:56:08+00:00</dc:date>
      <dc:creator>zooko</dc:creator>
      <description>
      &lt;p&gt;I think there is an interesting disconnect between the low-level hackers and the higher level network/application level hackers here.  A lot of the  interesting projects that I know of (not to mention the ones that I lead myself: Mnet), use select()/poll() interfaces exactly as I've described above -- as nothing more than a way to get at the callbacks which they then immediately de-multiplex back into callbacks.  The projects I'm thinking of here are things like Twisted, and E (although the current E implementation doesn't use kernel calls, as it is in Java...).&lt;/p&gt;
&lt;p&gt;Regards,&lt;/p&gt;
&lt;p&gt;Zooko&lt;/p&gt;
      
      </description>
    </item>
    <item rdf:about="http://lwn.net/Articles/14275/rss">
      <title>I want some of them callbacks!</title>
      <link>http://lwn.net/Articles/14275/rss</link>
      <dc:date>2002-10-31T13:24:18+00:00</dc:date>
      <dc:creator>IkeTo</dc:creator>
      <description>
      Hmm... that seems to be as difficult to use as signals.  The function that you want to use is never in the list of async signal-safe functions, and you application will always have race condition using signals unless your application uses the call in a very limited way: your main application must do basically nothing, and your application must block basically every signal (and wait for signals using sigwait() or sigsuspend()).  That means... you'll have to create system calls similar to those to deal with signals, and then to setup a huge size set for suspending file descriptor callbacks.  Not to mention that pushing some code to the user is not something that a kernel developers would like to do unless absolutely needed.  Doesn't seem to be exactly exciting for this type of optimization which is constant-time anyway.
      
      </description>
    </item>
    <item rdf:about="http://lwn.net/Articles/14248/rss">
      <title>I want some of them callbacks!</title>
      <link>http://lwn.net/Articles/14248/rss</link>
      <dc:date>2002-10-31T11:01:49+00:00</dc:date>
      <dc:creator>zooko</dc:creator>
      <description>
      &lt;p&gt;I don't understand why the callbacks aren't propagated to userland.  All of my code which uses select() or poll() style interfaces immediately invokes callbacks based on which fds have changed, so if my code ran on top of epoll(), then the sequence of events would look like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the socket activity would cause callbacks
&lt;li&gt;which would be intercepted by the epoll() system
&lt;li&gt;which would update the data structure and then return from epoll_wait(),
&lt;li&gt;where my userland code would crawl the data structure and invoke callbacks for each changed thing,
&lt;li&gt;where higher-level application code would then receive the callbacks.&lt;/ul&gt;
&lt;p&gt;Doesn't this seem unnecessarily complicated, not to mention less efficient?  Is it too tricky to have the kernel change to user context and invoke a function pointer that I have given it?&lt;/p&gt;
&lt;p&gt;Regards,&lt;/p&gt;
&lt;p&gt;Zooko&lt;/p&gt;
      
      </description>
    </item>
    <item rdf:about="http://lwn.net/Articles/14241/rss">
      <title>sys_epoll - making poll fast</title>
      <link>http://lwn.net/Articles/14241/rss</link>
      <dc:date>2002-10-31T08:08:30+00:00</dc:date>
      <dc:creator>johnchx</dc:creator>
      <description>
      I'd like to hear more about how this approach compares with asynchronous reads and writes from/to sockets.  Doesn't the ability to do async i/o reduce the need for a scalable select()-style mechanism?
      
      </description>
    </item>
    <item rdf:about="http://lwn.net/Articles/14239/rss">
      <title>sys_epoll - making poll fast</title>
      <link>http://lwn.net/Articles/14239/rss</link>
      <dc:date>2002-10-31T07:22:13+00:00</dc:date>
      <dc:creator>dododge</dc:creator>
      <description>
      &lt;p&gt;
LKML has had a bunch of messages this week about the API
documentation, and it's clear there are some subtle issues
with how you go about using sys_epoll correctly.
If you try to use it as a drop-in replacement for existing
select and poll code, you can end up with races. The setup
and waiting has to be done with an understanding of what
actually causes epoll_wait to report an event. A good/quick
explanation of how to use it:
&lt;/p&gt;

&lt;a href=&quot;http://www.uwsg.indiana.edu/hypermail/linux/kernel/0210.3/1520.html&quot;&gt;http://www.uwsg.indiana.edu/hypermail/linux/kernel/0210.3/1520.html&lt;/a&gt;



      
      </description>
    </item>
    <item rdf:about="http://lwn.net/Articles/14224/rss">
      <title>sys_epoll - making poll fast</title>
      <link>http://lwn.net/Articles/14224/rss</link>
      <dc:date>2002-10-31T04:02:35+00:00</dc:date>
      <dc:creator>cpeterso</dc:creator>
      <description>
      &lt;br&gt;This sounds a lot like NT's IO Completion Ports, but without NT's automatic thread pool management. IO Completion Ports are nice because the thread pool balances the work items (IO callbacks) to threads pinned to each CPU. There is usually one one thread per CPU servicing IO callbacks. This avoids extra context switches overhead and avoids trashing the CPU cache with multiple threads. I'm sure thread pooling could be added with userland libraries on top of the sys_epoll system call.&lt;br&gt;
      
      </description>
    </item>
    <item rdf:about="http://lwn.net/Articles/14200/rss">
      <title>sys_epoll - making poll fast</title>
      <link>http://lwn.net/Articles/14200/rss</link>
      <dc:date>2002-10-31T02:09:16+00:00</dc:date>
      <dc:creator>yanfali</dc:creator>
      <description>
      I've personally used the old version /dev/epoll and it scales beautifully,&lt;br&gt;especially when combined with NAPIfied network drivers.  In an internal&lt;br&gt;test application I was able to handle 60K sockets opened and over&lt;br&gt;12K active per second on a 1Ghz pentium III.  This API is going to rocket&lt;br&gt;the performance of linux based TCP/IP servers through the ceiling.&lt;p&gt;Congrats to Davide for a job well done.
      
      </description>
    </item>
</rdf:RDF>

