Skip to contentSkip to conversation

timerfd incompatibility on mips

DISCUSSION Alexander Gordeev 2 participants 5 messages Jan 28, 2011

lore
Share & tools
lore
#0 lore raw

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
#1 lore raw
Quoted 18 lines · Alexander Gordeev

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

Quoted 7 lines

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.

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

#2 lore raw

В 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_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.

Quoted 6 lines
Quoted 2 lines

Right now one cannot use timerfd_create(..., TFD_NONBLOCK) on MIPS but can use timerfd_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.

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
#3 lore raw
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_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.

Quoted 7 lines
Quoted 3 lines

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.

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?

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

#4 lore raw

В 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_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.

Quoted 7 lines
Quoted 3 lines

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.

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?

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 from sys/timerfd.h and link them to O_* values from fcntl.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