Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 06 Mar 2008 07:46:50 +0100
From:      Alexander Leidinger <Alexander@Leidinger.net>
To:        Roman Divacky <rdivacky@freebsd.org>
Cc:        emulation@freebsd.org
Subject:   Re: epoll review continued
Message-ID:  <20080306074650.dmiymxgogok4wok4@webmail.leidinger.net>
In-Reply-To: <20080305181741.GA15620@freebsd.org>
References:  <20080304183529.kpaf3f76gcg4g0cs@webmail.leidinger.net> <20080305181741.GA15620@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Quoting Roman Divacky <rdivacky@freebsd.org> (from Wed, 5 Mar 2008 =20
19:17:41 +0100):

> On Tue, Mar 04, 2008 at 06:35:29PM +0100, Alexander Leidinger wrote:
>> >@@ -57,7 +57,9 @@
>> >
>> >=09if (args->size <=3D 0)
>> >=09=09return (EINVAL);
>> >-=09/* args->size is unused. Linux ignores it as well. */
>> >+=09/* +=09 * args->size is unused. Linux just tests it +=09 * and then
>> >forgets it as well. */
>>
>> My proposal ("Submitted by: netchild" in the log):
>> /*
>>  * The size is documented to be only a hint. We don't need
>>  * it with kevent. The epoll_create man-page tells that the
>>  * size has to be not-negative, but the linux kernel test
>>  * for a value of at least 1, so for error compatibility we
>>  * do the same.
>>  */
>>
>> The above comment should be before the if, not after.
>
> given that man pages and the source of the kernel are totally independent
> I would not trust the man pages... and certainly would not cite
> that as a reliable source

This comment is supposed to show that we are aware of the man page and =20
about what the kernel does. Whoever reads this comment will get the =20
impression, that we did our homework and also gets told why we do the =20
check this way. When anything in linux (either the kernel or the man =20
page) changes, then anyone reading this comment will see, that we are =20
not up-to-date and know why the code is like it is and hopefully =20
notifies us. I agree that it is of no use for us at this moment, but =20
it improve the code quality a lot, as it helps maintaining this code =20
in the future.

Just imagine how fast you would have understood some other parts of =20
the linuxulator, if there would have been similar comments. I'm sure =20
you would have fixed some bugs with more confidence, don't you?

>> >static int
>> >linux_kev_copyin(void *arg, struct kevent *kevp, int count)
>> >@@ -193,7 +197,8 @@
>> >=09=09break;
>> >=09case LINUX_EPOLL_CTL_MOD:
>> >=09=09=09/* TODO: DELETE && ADD maybe? */
>> >-=09=09=09return (EINVAL);
>> >+=09=09=09printf("linux_epoll_ctl: CTL_MOD not yet
>> >>implemented.\n");
>> >+=09=09=09return (ENOSYS);
>>
>> ENOSYS is "syscall not implemented". But we implement the syscall.
>> When glibc tests this syscall and gets back a ENOSYS, it may switch to
>> a different way of monitoring files. I think the EINVAL was better, as
>> it will result in an application error and notify us that we need to
>> take care about this part of the syscall.
>
> #define ENOSYS          78              /* Function not implemented */
>
> its used for this purposes all over the kernel so I think its ok

I've seen only complete syscalls behaving like this. Can you please =20
point out subfeatures in syscalls not written by you which do this?

>> >=09=09break;
>> >=09case LINUX_EPOLL_CTL_DEL:
>> >=09=09=09kev.flags =3D EV_DELETE | EV_DISABLE;
>> >@@ -241,6 +246,9 @@
>> >
>> >=09error =3D kern_kevent(td, args->epfd, 0, args->maxevents, &k_ops, &ts=
);
>> >
>> >-=09/* translation? */
>> >+=09/* +=09 * kern_keven might return ENOMEM which is not expected from
>> >epoll_wait.
>> >+=09 * Maybe we should translate that but I don't think it matters at
>> >all.
>> >+=09 */
>> >=09return (error);
>> >}
>>
>> It is not even ENOMEM. After a quick look I think it should be like:
>>  - ESRCH, ENOENT should map to EINVAL
>>  - EACCESS should map to  EFAULT or EINVAL (don't really know)
>>  - ENOMEM should map to... ?
>>
>> You also need to deliver EINVAL, if maxevents is <=3D 0 (according to
>> the man page of epoll_wait).
>
> I fixed the maxevents bug but...
>
> the ESRCH/ENOENT/EACCESS apply only to epoll_wait (as that does the
> registering).

Yes. The comment which was added by you in the source talks about =20
epoll_wait, so was I. And I thought I checked that this part was =20
really part of epoll_wait. To make it specific: I haven't seen an =20
errno translation in epoll_wait, but epoll_wait needs to do this.

> I'd let it as it is and fix it if problems from real usage arise.

I will not try to get time to commit this without an errno translation.

Bye,
Alexander.

--=20
We may not return the affection of those who like us,
but we always respect their good judgment.

http://www.Leidinger.net    Alexander @ Leidinger.net: PGP ID =3D B0063FE7
http://www.FreeBSD.org       netchild @ FreeBSD.org  : PGP ID =3D 72077137



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20080306074650.dmiymxgogok4wok4>