timerfd incompatibility on mips
Hi!
I've just found a problem with TFD_NONBLOCK flag that can be passed to timerfd_create.
<uclibc>/libc/sysdeps/linux/common/sys/timerfd.h which is installed to /usr/include/sys/timerfd.h defines TFD_NONBLOCK as 04000 ie 0x800. BTW glibc/eglibc headers do the same thing.
<linux>/include/linux/timerfd.h declares it as O_NONBLOCK which is defined in fcntl.h. Usually O_NONBLOCK is 0x800 too but some architectures including MIPS it redefine it:
arch/mips/include/asm/fcntl.h:#define O_NONBLOCK 0x0080
arch/alpha/include/asm/fcntl.h:#define O_NONBLOCK 00004
arch/sparc/include/asm/fcntl.h:#define O_NONBLOCK 0x4000
arch/parisc/include/asm/fcntl.h:#define O_NONBLOCK 000200004
My tests show that kernel thinks that TFD_NONBLOCK is 0x80 on MIPS. I get what I want when I pass 0x80 and EINVAL when I pass 0x800. I don't know why there are such uncertain things in Linux. Probably the problem should be fixed in the kernel.
Right now one cannot use timerfd_create(..., TFD_NONBLOCK) on MIPS but can use timerfd_create(..., O_NONBLOCK) instead.
Signature · 1 line
Alexander
Quoted 18 lines · Alexander Gordeev
Hi!
I've just found a problem with
TFD_NONBLOCKflag that can be passed totimerfd_create.<uclibc>/libc/sysdeps/linux/common/sys/timerfd.h which is installed to
/usr/include/sys/timerfd.hdefinesTFD_NONBLOCKas 04000 ie0x800. BTW glibc/eglibc headers do the same thing.<linux>/include/linux/timerfd.h declares it as
O_NONBLOCKwhich is defined infcntl.h. UsuallyO_NONBLOCKis0x800too but some architectures including MIPS it redefine it:arch/mips/include/asm/fcntl.h:#define
O_NONBLOCK0x0080
arch/alpha/include/asm/fcntl.h:#defineO_NONBLOCK00004
arch/sparc/include/asm/fcntl.h:#defineO_NONBLOCK0x4000
arch/parisc/include/asm/fcntl.h:#defineO_NONBLOCK000200004
Quoted 7 lines
My tests show that kernel thinks that
TFD_NONBLOCKis0x80on MIPS. I get what I want when I pass0x80and EINVAL when I pass0x800. I don't know why there are such uncertain things in Linux. Probably the problem should be fixed in the kernel.Right now one cannot use
timerfd_create(..., TFD_NONBLOCK)on MIPS but can usetimerfd_create(..., O_NONBLOCK)instead.
Ther kernel definition (include/linux/timerfd.h) maps it directly to O_NONBLOCK, but I am noticing that glibc bolt in the value. I don't think this is a kernel fix.
- Davide
В Thu, 27 Jan 2011 16:53:39 -0800 (PST)
Davide Libenzi <[email protected]> пишет:
Quoted 25 lines · Alexander Gordeev
Quoted 24 lines
Hi!
I've just found a problem with
TFD_NONBLOCKflag that can be passed totimerfd_create.<uclibc>/libc/sysdeps/linux/common/sys/timerfd.h which is installed to
/usr/include/sys/timerfd.hdefinesTFD_NONBLOCKas 04000 ie0x800. BTW glibc/eglibc headers do the same thing.<linux>/include/linux/timerfd.h declares it as
O_NONBLOCKwhich is defined infcntl.h. UsuallyO_NONBLOCKis0x800too but some architectures including MIPS it redefine it:arch/mips/include/asm/fcntl.h:#define
O_NONBLOCK0x0080
arch/alpha/include/asm/fcntl.h:#defineO_NONBLOCK00004
arch/sparc/include/asm/fcntl.h:#defineO_NONBLOCK0x4000
arch/parisc/include/asm/fcntl.h:#defineO_NONBLOCK000200004My tests show that kernel thinks that
TFD_NONBLOCKis0x80on MIPS. I get what I want when I pass0x80and EINVAL when I pass0x800. I don't know why there are such uncertain things in Linux. Probably the problem should be fixed in the kernel.
Quoted 6 lines
Quoted 2 lines
Right now one cannot use
timerfd_create(..., TFD_NONBLOCK)on MIPS but can usetimerfd_create(..., O_NONBLOCK)instead.Ther kernel definition (
include/linux/timerfd.h) maps it directly toO_NONBLOCK, but I am noticing that glibc bolt in the value. I don't think this is a kernel fix.
Yes, but linux/timerfd.h is not installed so timerfd.h from *libc cannot include it. So adding it to include/linux/Kbuild would be a first step to make them not hard-code the value. Right?
Signature · 1 line
Alexander
Quoted 31 lines · Alexander Gordeev
В Thu, 27 Jan 2011 16:53:39 -0800 (PST)
Davide Libenzi <[email protected]> пишет:Quoted 28 lines · Alexander Gordeev
Quoted 26 lines
Hi!
I've just found a problem with
TFD_NONBLOCKflag that can be passed totimerfd_create.<uclibc>/libc/sysdeps/linux/common/sys/timerfd.h which is installed to
/usr/include/sys/timerfd.hdefinesTFD_NONBLOCKas 04000 ie0x800. BTW glibc/eglibc headers do the same thing.<linux>/include/linux/timerfd.h declares it as
O_NONBLOCKwhich is defined infcntl.h. UsuallyO_NONBLOCKis0x800too but some architectures including MIPS it redefine it:arch/mips/include/asm/fcntl.h:#define
O_NONBLOCK0x0080
arch/alpha/include/asm/fcntl.h:#defineO_NONBLOCK00004
arch/sparc/include/asm/fcntl.h:#defineO_NONBLOCK0x4000
arch/parisc/include/asm/fcntl.h:#defineO_NONBLOCK000200004My tests show that kernel thinks that
TFD_NONBLOCKis0x80on MIPS. I get what I want when I pass0x80and EINVAL when I pass0x800. I don't know why there are such uncertain things in Linux. Probably the problem should be fixed in the kernel.Right now one cannot use
timerfd_create(..., TFD_NONBLOCK)on MIPS but can usetimerfd_create(..., O_NONBLOCK)instead.
Quoted 7 lines
Quoted 3 lines
Ther kernel definition (
include/linux/timerfd.h) maps it directly toO_NONBLOCK, but I am noticing that glibc bolt in the value. I don't think this is a kernel fix.Yes, but
linux/timerfd.his not installed sotimerfd.hfrom *libc cannot include it. So adding it toinclude/linux/Kbuildwould be a first step to make them not hard-code the value. Right?
Glibc seems to wrap many files with their own definition.
I am not sure why they are actually doing it, but they must have a valid reason.
It probably makes sense to just un-bolt the values from sys/timerfd.h and link them to O_* values from fcntl.h.
- Davide
В Thu, 27 Jan 2011 17:49:39 -0800 (PST)
Davide Libenzi <[email protected]> пишет:
Quoted 41 lines · Alexander Gordeev
Quoted 32 lines
В Thu, 27 Jan 2011 16:53:39 -0800 (PST)
Davide Libenzi <[email protected]> пишет:Quoted 28 lines · Alexander Gordeev
Quoted 26 lines
Hi!
I've just found a problem with
TFD_NONBLOCKflag that can be passed totimerfd_create.<uclibc>/libc/sysdeps/linux/common/sys/timerfd.h which is installed to
/usr/include/sys/timerfd.hdefinesTFD_NONBLOCKas 04000 ie0x800. BTW glibc/eglibc headers do the same thing.<linux>/include/linux/timerfd.h declares it as
O_NONBLOCKwhich is defined infcntl.h. UsuallyO_NONBLOCKis0x800too but some architectures including MIPS it redefine it:arch/mips/include/asm/fcntl.h:#define
O_NONBLOCK0x0080
arch/alpha/include/asm/fcntl.h:#defineO_NONBLOCK00004
arch/sparc/include/asm/fcntl.h:#defineO_NONBLOCK0x4000
arch/parisc/include/asm/fcntl.h:#defineO_NONBLOCK000200004My tests show that kernel thinks that
TFD_NONBLOCKis0x80on MIPS. I get what I want when I pass0x80and EINVAL when I pass0x800. I don't know why there are such uncertain things in Linux. Probably the problem should be fixed in the kernel.Right now one cannot use
timerfd_create(..., TFD_NONBLOCK)on MIPS but can usetimerfd_create(..., O_NONBLOCK)instead.Quoted 7 lines
Quoted 3 lines
Ther kernel definition (
include/linux/timerfd.h) maps it directly toO_NONBLOCK, but I am noticing that glibc bolt in the value. I don't think this is a kernel fix.Yes, but
linux/timerfd.his not installed sotimerfd.hfrom *libc cannot include it. So adding it toinclude/linux/Kbuildwould be a first step to make them not hard-code the value. Right?
Quoted 5 lines
Glibc seems to wrap many files with their own definition.
I am not sure why they are actually doing it, but they must have a valid reason.
It probably makes sense to just un-bolt the values fromsys/timerfd.hand link them to O_* values fromfcntl.h.
Great! This is probably the simplest solution. Hope they'll use it.
However, I'm still curious why the value O_NONBLOCK value is architecture-specific?
Signature · 1 line
Alexander