Re: 2.6.5 & AMD64 epoll weirdness

From: Davide Libenzi
Date: Mon Apr 05 2004 - 10:11:52 EST


On Mon, 5 Apr 2004, Mihai RUSU wrote:

> Hi
>
> I have this little test program:
> #include <sys/epoll.h>
>
> int main(void)
> {
> int efd;
> struct epoll_event event;
> struct epoll_event events[10];
>
> efd = epoll_create(100);
> event.data.fd = 0;
> epoll_ctl(efd, EPOLLIN, 0, &event);
> epoll_wait(efd, events, 10, -1);
> }
>
> This program runs fine on x86/32bit with 2.6.5 kernel. But on AMD64 it
> does this (strace qoute):
>
> epoll_create(0x64) = 3
> epoll_ctl(0x3, 0x1, 0, 0x7fbffff860) = -1 ENOSYS (Function not implemented)
> epoll_wait(0x3, 0x7fbffff7e0, 0xa, 0xffffffff) = -1 ENOSYS (Function not implemented)
>
> This is rather weird because I would expect to have epoll_create() fail
> too (in fact I use this check at runtime, I try epoll_create and if it
> works I presume epoll is functional; I needed this check because glibc
> might have dummy epoll functions which always fail although the program
> compiles fine with it). So do I really need to check all epoll syscalls
> before presuming that epoll works on the current system ? (I would like to
> have epoll_create failing in the case it doesnt supports AMD64).

I belive you have a glibc compiled with an old unistd.h. The epoll_ctl and
epoll_wait functions seem that have been moved:

#define __NR_epoll_ctl_old 214 __SYSCALL(__NR_epoll_ctl_old, sys_ni_syscall)
#define __NR_epoll_wait_old 215 __SYSCALL(__NR_epoll_wait_old, sys_ni_syscall)
...
#define __NR_epoll_wait 232 __SYSCALL(__NR_epoll_wait, sys_epoll_wait)
#define __NR_epoll_ctl 233 __SYSCALL(__NR_epoll_ctl, sys_epoll_ctl)

while epoll_create have not. A asm trace into epoll_ctl or epoll_wait
might confirm this.



- Davide


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/