Date: Tue, 04 Mar 2008 18:35:29 +0100 From: Alexander Leidinger <Alexander@Leidinger.net> To: rdivacky@freebsd.org Cc: emulation@freebsd.org Subject: epoll review continued Message-ID: <20080304183529.kpaf3f76gcg4g0cs@webmail.leidinger.net>
next in thread | raw e-mail | index | archive | help
> @@ -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 =
=20
> 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.
> =09return (kqueue(td, &k_args));
> }
> @@ -140,7 +142,9 @@
>
> /*
> * Copyin callback used by kevent. This copies already
> - * converted filters to the kevent internal memory.
> + * converted filters from kernel memory to the kevent + * internal =20
> kernel memory. Hence the memcpy instead of
> + * copyin.
> */
Thanks.
> 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. =20
When glibc tests this syscall and gets back a ENOSYS, it may switch to =20
a different way of monitoring files. I think the EINVAL was better, as =20
it will result in an application error and notify us that we need to =20
take care about this part of the syscall.
> =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 =
=20
> 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 =20
the man page of epoll_wait).
Bye,
Alexander.
--=20
If you sow your wild oats, hope for a crop failure.
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?20080304183529.kpaf3f76gcg4g0cs>
