All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michael Kerrisk <mtk.manpages@googlemail.com>
To: Davide Libenzi <davidel@xmailserver.org>
Cc: Pierre Habouzit <madcoder@debian.org>,
	lkml <linux-kernel@vger.kernel.org>,
	Eric Dumazet <dada1@cosmosbay.com>,
	Marc Lehmann <schmorp@schmorp.de>,
	David Schwartz <davids@webmaster.com>
Subject: Re: epoll and shared fd's
Date: Tue, 26 Feb 2008 16:13:55 +0100	[thread overview]
Message-ID: <47C42CB3.8040500@gmail.com> (raw)
In-Reply-To: <Pine.LNX.4.64.0801261308270.10472@alien.or.mcafeemobile.com>

Following up after quite some time:

Davide Libenzi wrote:
> On Sat, 26 Jan 2008, Michael Kerrisk wrote:
> 
>> On Jan 25, 2008 12:57 AM, Davide Libenzi <davidel@xmailserver.org> wrote:
>>> On Thu, 24 Jan 2008, Pierre Habouzit wrote:
>>>
>>>> On Fri, Jan 18, 2008 at 09:10:18PM +0000, Davide Libenzi wrote:
>>>>> On Fri, 18 Jan 2008, Pierre Habouzit wrote:
>>>>>
>>>>>>   Hi,
>>>>>>
>>>>>>   I just came across a strange behavior of epoll that seems to
>>>>>> contradict the documentation. Here is what happens:
>>>>>>
>>>>>> * I have two processes P1 and P2, P1 accept()s connections, and send the
>>>>>>   resulting file descriptors to P2 through a unix socket.
>>>>>>
>>>>>> * P2 registers the received socket in his epollfd.
>>>>>>
>>>>>>   [time passes]
>>>>>>
>>>>>> * P2 is done with the socket and closes it
>>>>>>
>>>>>> * P2 gets events for the socket again !
>>>>>>
>>>>>>
>>>>>>   Though the documentation says that if a process closes a file
>>>>>> descriptor, it gets unregistered. And yes I'm sure that P2 doens't dup()
>>>>>> the file descriptor. Though (because of a bug) it was still open in
>>>>>> P1[0], hence the referenced socket still live at the kernel level.
>>>>>>
>>>>>>   Of course the userland workaround is to force the EPOLL_CTL_DEL before
>>>>>> the close, which I now do, but costs me a syscall where I wanted to
>>>>>> spare one :|
>>>>> For epoll, a close is when the kernel file* is released (that is, when all
>>>>> its instances are gone).
>>>>> We could put a special handling in filp_close(), but I don't think is a
>>>>> good idea, and we're better live with the current behaviour.
>>>>   Okay, maybe updating the linux manpages to be more clear about that is
>>>> the way to go then. Thanks
>>> Sure. I'll send Michael Kerrisk and updated statement for the A6 answer in
>>> the epoll man page.
>> Thanks Davide -- yes please send me a patch.
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>> Please read the FAQ at  http://www.tux.org/lkml/
>>
> 
> Something like the one below ...
> 
> 
> - Davide
> 
> 
> 
> --- epoll.4	2008-01-26 12:58:21.000000000 -0800
> +++ epoll.4.new	2008-01-26 13:06:36.000000000 -0800
> @@ -285,7 +285,19 @@
>  sets automatically?
>  .TP
>  .B A6
> -Yes.
> +A file descriptor is the userspace counterpart of an internal kernel handle.
> +Every time a process calls functions liks
> +.BR dup (2),
> +.BR dup2 (2)
> +or
> +.BR fork (2),
> +a new file descriptor referring to the same internal kernel handle is
> +created. The internal kernel handle remains alive until all the userspace
> +file descriptors have been closed.
> +The
> +.BR epoll (4)
> +interface automatically removes the internal kernel handle from the set,
> +once all the file descriptor instances have been closed.
>  .TP
>  .B Q7
>  If more than one event occurs between

Davide,

Two points.

a) I did a

s/internal kernel handle/open file description/

since that is the POSIX term for the internal handle.

b) It seems to me that you text doesn't quite make the point explicit
enough.  I've tried to rewrite it; could you please check:

       A6     Yes, but be aware of the following point.  A  file
              descriptor is a reference to an open file descrip-
              tion (see  open(2)).   Whenever  a  descriptor  is
              duplicated  via dup(2), dup2(2), fcntl(2) F_DUPFD,
              or fork(2), a new file descriptor referring to the
              same  open  file  description is created.  An open
              file description continues to exist until all file
              descriptors referring to it have been closed.  The
              epoll  interface  automatically  removes  a   file
              descriptor  from  an  epoll set only after all the
              file descriptors referring to the underlying  open
              file  handle  have  been  closed.  This means that
              even after a file descriptor that is  part  of  an
              epoll  set has been closed, events may be reported
              for that file descriptor if other file descriptors
              referring  to the same underlying file description
              remain open.

Does that seem okay?  I plan to include the text in man-pages-2.79.

Was there some reason why removing a file descriptor couldn't have been
made to do the "expected" thing (i.e., remove notifications for that file
descriptor, regardless of whether the underlying file description remains
open)?

Cheers,

Michael

-- 
Michael Kerrisk
Maintainer of the Linux man-pages project
http://www.kernel.org/doc/man-pages/
Want to report a man-pages bug?  Look here:
http://www.kernel.org/doc/man-pages/reporting_bugs.html



  parent reply	other threads:[~2008-02-26 15:15 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-18 13:43 epoll and shared fd's Pierre Habouzit
2008-01-18 21:10 ` Davide Libenzi
2008-01-24  8:40   ` Pierre Habouzit
2008-01-24 23:57     ` Davide Libenzi
2008-01-26  7:37       ` Michael Kerrisk
     [not found]         ` <Pine.LNX.4.64.0801261308270.10472@alien.or.mcafeemobile.com>
2008-02-26 15:13           ` Michael Kerrisk [this message]
2008-02-26 19:04             ` Davide Libenzi
2008-02-26 19:14               ` Michael Kerrisk
2008-02-26 19:31                 ` Davide Libenzi
     [not found] <9MZLT-1YO-33@gated-at.bofh.it>
     [not found] ` <9N6Ng-5tn-21@gated-at.bofh.it>
     [not found]   ` <9P5WE-33i-11@gated-at.bofh.it>
     [not found]     ` <9Pk9l-1KA-1@gated-at.bofh.it>
     [not found]       ` <9PNNZ-b0-5@gated-at.bofh.it>
     [not found]         ` <a19Lb-1F0-13@gated-at.bofh.it>
     [not found]           ` <a19Lb-1F0-11@gated-at.bofh.it>
2008-02-26 18:16             ` Bodo Eggert
2008-02-28 12:10               ` Michael Kerrisk
2008-02-28 19:17                 ` Bodo Eggert
2008-02-28 19:30                   ` Davide Libenzi
2008-02-28 13:53               ` Valdis.Kletnieks
2008-02-28 15:08                 ` Michael Kerrisk
2008-02-28 19:27                 ` 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=47C42CB3.8040500@gmail.com \
    --to=mtk.manpages@googlemail.com \
    --cc=dada1@cosmosbay.com \
    --cc=davidel@xmailserver.org \
    --cc=davids@webmaster.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=madcoder@debian.org \
    --cc=schmorp@schmorp.de \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.