linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* PROBLEM: struct siginfo member si_fd not properly filled in handler after SIGIO (2.4.x) - offending POSIX specs?
@ 2003-07-11 14:26 Peter Asemann
  2003-07-12 20:23 ` Jamie Lokier
  0 siblings, 1 reply; 2+ messages in thread
From: Peter Asemann @ 2003-07-11 14:26 UTC (permalink / raw)
  To: linux-kernel

[-- Attachment #1: Type: text/plain, Size: 8175 bytes --]

Be greeted!

Problem: After a SIGIO/SIOPOLL signal was delivered to a process, the siginfo 
structure provided by the kernel (if you use the three-parameter sa_sigaction 
(not sa_handler) and set the SA_SIGINFO flag in sa_flags) is not 
properly set. It's si_fd member is always zero. It should be the fd number of 
the fd responsible for the SIGIO/SIGPOLL (say sigaction(2) and the POSIX 
specs, I suppose).

Keywords: kernel, signal, SIGIO, SIGPOLL, siginfo, sigaction

Reproducible: Always

Kernel versions: 2.4.x (several, including 2.4.10 (SuSE) 2.4.18 (Debian 3.0))

Severity:
So so. I wanted to use the feature.

Plattform/Version/Hardware/Software:
 I've tested this with the program mentioned below on a SuSE 7.3 system on HP 
Vectra VL 2 Series 100 Pentium 100 and on a Debian Woody system with 
home-grown kernel on a P4 1.6GHz processor, both having completely different 
hard- and software.

Test/Demonstration program:

I've written a C program (attached) to demonstrate what I mean.
In order to provoke some SIGIO event it opens a tcp socket at port 9753 and 
sets O_ASYNC and O_NONBLOCKING flags and enables SIGIO signal delivery with 
fcntl.
If you connect to the port with "telnet localhost 9753" each time you send 
something a SIGIO is raised. The signal handler set up catches the signal and 
prints signal number, errno and si_fd from the siginfo structure.

The number given is (on my systems) always 0 and not the number of the file 
descriptor that actually is responsible for the SIGIO.

ver_linux output (Woody/P4 system):

Linux faui31x 2.4.18-686 #1 Sun Apr 14 11:32:47 EST 2002 i686 unknown

Gnu C                  2.95.4
Gnu make               3.79.1
util-linux             2.11n
mount                  2.11n
modutils               2.4.15
e2fsprogs              1.27
Linux C Library        2.2.5
Dynamic linker (ldd)   2.2.5
Procps                 2.0.7
Net-tools              1.60
Console-tools          0.2.3
Sh-utils               2.0.11
Modules Loaded         lp parport_pc ppdev parport isofs loop ide-cd cdrom 
nfs nfsd lockd sunrpc autofs i810_audio soundcore ac97_codec eepro100 
af_packet rtc ext2 ide-disk ide-probe-mod ide-mod ext3 jbd unix

/proc/cpu:

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 15
model           : 2
model name      : Intel(R) Pentium(R) 4 CPU 1.60GHz
stepping        : 4
cpu MHz         : 1595.208
cache size      : 512 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 2
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca 
cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss
ht tm
bogomips        : 3185.04

/proc/ioports:

0000-001f : dma1
0020-003f : pic1
0040-005f : timer
0060-006f : keyboard
0070-007f : rtc
0080-008f : dma page reg
00a0-00bf : pic2
00c0-00df : dma2
00f0-00ff : fpu
0170-0177 : ide1
01f0-01f7 : ide0
02f8-02ff : serial(set)
0376-0376 : ide1
0378-037a : parport0
03c0-03df : vga+
03f6-03f6 : ide0
03f8-03ff : serial(set)
0cf8-0cff : PCI conf1
d000-dfff : PCI Bus #02
  df00-df3f : Intel Corp. 82557 [Ethernet Pro 100]
    df00-df3f : eepro100
e800-e8ff : Intel Corp. 82820 820 (Camino 2) Chipset AC'97 Audio Controller
  e800-e8ff : Intel ICH2
ef00-ef3f : Intel Corp. 82820 820 (Camino 2) Chipset AC'97 Audio Controller
  ef00-ef3f : Intel ICH2
ef80-ef9f : Intel Corp. 82820 820 (Camino 2) Chipset USB (Hub A)
efa0-efaf : Intel Corp. 82820 820 (Camino 2) Chipset SMBus
ffa0-ffaf : Intel Corp. 82820 820 (Camino 2) Chipset IDE U100
  ffa0-ffa7 : ide0
  ffa8-ffaf : ide1

/proc/iomem:

00000000-00097bff : System RAM
00097c00-00097fff : reserved
000a0000-000bffff : Video RAM area
000c0000-000c7fff : Video ROM
000c8800-000c9fff : Extension ROM
000f0000-000fffff : System ROM
00100000-1ffbffff : System RAM
  00100000-001cade2 : Kernel code
  001cade3-00204b2b : Kernel data
1ffc0000-1fff7fff : ACPI Tables
1fff8000-1fffffff : ACPI Non-volatile Storage
f1600000-f56fffff : PCI Bus #01
  f2000000-f3ffffff : Matrox Graphics, Inc. MGA G400 AGP
f5700000-f57fffff : PCI Bus #02
f8000000-fbffffff : Intel Corp. 82850 850 (Tehama) Chipset Host Bridge (MCH)
fd900000-fe9fffff : PCI Bus #01
  fe000000-fe7fffff : Matrox Graphics, Inc. MGA G400 AGP
  fe9fc000-fe9fffff : Matrox Graphics, Inc. MGA G400 AGP
fea00000-feafffff : PCI Bus #02
  feac0000-feadffff : Intel Corp. 82557 [Ethernet Pro 100]
  feafb000-feafbfff : Intel Corp. 82557 [Ethernet Pro 100]
    feafb000-feafbfff : eepro100
  feafd000-feafdfff : NEC Corporation USB
  feafe000-feafefff : NEC Corporation USB (#2)
  feaffc00-feaffcff : PCI device 1033:00e0 (NEC Corporation)
fec00000-fec00fff : reserved
fee00000-fee00fff : reserved
ffb80000-ffbfffff : reserved
fff00000-ffffffff : reserved

The system has no SCSI, unfortunately I'm no actually root, so there's no PCI 
info except this:

PCI devices found:
  Bus  0, device   0, function  0:
    Host bridge: Intel Corp. 82850 850 (Tehama) Chipset Host Bridge (MCH) 
(rev 4).
      Prefetchable 32 bit memory at 0xf8000000 [0xfbffffff].
  Bus  0, device   1, function  0:
    PCI bridge: Intel Corp. 82850 850 (Tehama) Chipset AGP Bridge (rev 4).
      Master Capable.  Latency=32.  Min Gnt=10.
  Bus  0, device  30, function  0:
    PCI bridge: Intel Corp. 82820 820 (Camino 2) Chipset PCI (rev 4).
      Master Capable.  No bursts.  Min Gnt=6.
  Bus  0, device  31, function  0:
    ISA bridge: Intel Corp. 82820 820 (Camino 2) Chipset ISA Bridge (ICH2) 
(rev 4).
  Bus  0, device  31, function  1:
    IDE interface: Intel Corp. 82820 820 (Camino 2) Chipset IDE U100 (rev 4).
      I/O at 0xffa0 [0xffaf].
  Bus  0, device  31, function  2:
    USB Controller: Intel Corp. 82820 820 (Camino 2) Chipset USB (Hub A) (rev 
4).
      IRQ 10.
      I/O at 0xef80 [0xef9f].
  Bus  0, device  31, function  3:
    SMBus: Intel Corp. 82820 820 (Camino 2) Chipset SMBus (rev 4).
      IRQ 9.
      I/O at 0xefa0 [0xefaf].
  Bus  0, device  31, function  5:
    Multimedia audio controller: Intel Corp. 82820 820 (Camino 2) Chipset 
AC'97 Audio Controller (rev 4).
      IRQ 9.
      I/O at 0xe800 [0xe8ff].
      I/O at 0xef00 [0xef3f].
  Bus  1, device   0, function  0:
    VGA compatible controller: Matrox Graphics, Inc. MGA G400 AGP (rev 133).
      IRQ 11.
      Master Capable.  Latency=32.  Min Gnt=16.Max Lat=32.
      Prefetchable 32 bit memory at 0xf2000000 [0xf3ffffff].
      Non-prefetchable 32 bit memory at 0xfe9fc000 [0xfe9fffff].
      Non-prefetchable 32 bit memory at 0xfe000000 [0xfe7fffff].
  Bus  2, device   1, function  1:
    USB Controller: NEC Corporation USB (#2) (rev 65).
      IRQ 11.
      Master Capable.  Latency=32.  Min Gnt=1.Max Lat=42.
      Non-prefetchable 32 bit memory at 0xfeafe000 [0xfeafefff].
  Bus  2, device   1, function  0:
    USB Controller: NEC Corporation USB (rev 65).
      IRQ 10.
      Master Capable.  Latency=32.  Min Gnt=1.Max Lat=42.
      Non-prefetchable 32 bit memory at 0xfeafd000 [0xfeafdfff].
  Bus  2, device   1, function  2:
    USB Controller: PCI device 1033:00e0 (NEC Corporation) (rev 2).
      IRQ 5.
      Master Capable.  Latency=32.  Min Gnt=16.Max Lat=34.
      Non-prefetchable 32 bit memory at 0xfeaffc00 [0xfeaffcff].
  Bus  2, device  10, function  0:
    Ethernet controller: Intel Corp. 82557 [Ethernet Pro 100] (rev 12).
      IRQ 11.
      Master Capable.  Latency=32.  Min Gnt=8.Max Lat=56.
      Non-prefetchable 32 bit memory at 0xfeafb000 [0xfeafbfff].
      I/O at 0xdf00 [0xdf3f].
      Non-prefetchable 32 bit memory at 0xfeac0000 [0xfeadffff].

In case I'm wrong and/or have made several newbie mistakes and spammed this 
mailinglist I'm awfully sorry in advance. In case you're ever going to react 
on this eMail I'd like being cc'ed as I'm not subscribed to the mailinglist.

A friend of mine claims to have encountered this possible bug before. He says 
he tried to debug the kernel and found that the in_fd member is filled in 
correctly in the first place, but overwritten again later. He lost the 
interest then and didn't pin-point the exact location where things go wrong. 
Anyway - have a nice day.

Peter Asemann

[-- Attachment #2: test program to point out what's buggy --]
[-- Type: text/x-c, Size: 1292 bytes --]

#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>

#include <signal.h>

void handler(int sig, siginfo_t *extra, void *cruft) {
	if (sig == SIGIO) {
		fprintf(stderr,"signal: %d errno: %d fd: %d\n",extra->si_signo,extra->si_errno,extra->si_fd);
	} 
}

int main(void)
{
int fd;
int insock;
int on = 1;
socklen_t addrlen;
struct sigaction sa;
struct sockaddr_in addr_in;
struct sockaddr_in addr_other;

sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask, SIGIO);
sa.sa_sigaction = handler; 
sa.sa_flags = SA_SIGINFO;
sigaction(SIGIO, &sa, NULL);

addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(9753);
addr_in.sin_addr.s_addr = htonl(INADDR_ANY);

insock = socket(PF_INET,SOCK_STREAM,0);
setsockopt(insock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
bind(insock, (struct sockaddr *) &addr_in, sizeof(addr_in));
listen(insock, 1);
if ((fd = accept(insock,(struct sockaddr *) &addr_other, &addrlen)) == -1) {perror("fault");} 
fprintf(stderr,"fd is %d\n",fd);
if (fcntl(fd, F_SETFL, fcntl (fd,F_GETFL) | O_NONBLOCK | O_ASYNC) == 1) {perror("fault");}
if (fcntl(fd,F_SETOWN,getpid()) == -1) {perror("fault");}
fprintf(stderr,"accepted connection\n");

do {
} while(1);

}

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2003-07-12 20:10 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-07-11 14:26 PROBLEM: struct siginfo member si_fd not properly filled in handler after SIGIO (2.4.x) - offending POSIX specs? Peter Asemann
2003-07-12 20:23 ` Jamie Lokier

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).