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

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Mar 04, 2008 at 06:35:29PM +0100, Alexander Leidinger wrote:
> >@@ -57,7 +57,9 @@
> >
> >	if (args->size <= 0)
> >		return (EINVAL);
> >-	/* args->size is unused. Linux ignores it as well. */
> >+	/* +	 * args->size is unused. Linux just tests it +	 * 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

> >static int
> >linux_kev_copyin(void *arg, struct kevent *kevp, int count)
> >@@ -193,7 +197,8 @@
> >		break;
> >	case LINUX_EPOLL_CTL_MOD:
> >			/* TODO: DELETE && ADD maybe? */
> >-			return (EINVAL);
> >+			printf("linux_epoll_ctl: CTL_MOD not yet 
> >>implemented.\n");
> >+			return (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

> >		break;
> >	case LINUX_EPOLL_CTL_DEL:
> >			kev.flags = EV_DELETE | EV_DISABLE;
> >@@ -241,6 +246,9 @@
> >
> >	error = kern_kevent(td, args->epfd, 0, args->maxevents, &k_ops, &ts);
> >
> >-	/* translation? */
> >+	/* +	 * kern_keven might return ENOMEM which is not expected from 
> >epoll_wait.
> >+	 * Maybe we should translate that but I don't think it matters at 
> >all.
> >+	 */
> >	return (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 <= 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).

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

can someone test this using java/apache/something? I dont have time/energy
for that :(

roman



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