more - trouble with signals and skb_rec_datagram()

William Reich reich at ulticom.com
Mon Dec 14 22:12:27 UTC 2009



>Hello List...
>
>I am working on trying to port a LINUX kernel
>driver from RedHat AS 4/5 to Fedora 11 & 12.
>
>Within this driver, I create some threads.
>The threads call skb_rec_datagram().
>
>When it is time to shut down the system,
>my main kernel code ( in RH 4 & 5 ) called kill_proc( pid, SIGTERM, 0 )
>to terminate the threads created above.
>The skb_rec_datagram() would return with an error,
>and the threads would then exit cleanly.
>
>Now for Fedora 11 & 12, I understand that kill_proc() is no
>longer available to use. So, I have performed experiments that
>replace the kill_proc() with kill_pid()
>or with send_sig_info().
>Neither of these routines are terminating my threads.
>
>I have added extra debug to the code. The return codes from
>kill_pid() and send_sig_info() are zero, implying that 
>what I asked for was accomplished.
>
>Yet, my threads did not terminate. I added code
>after the skb_rec_datagram() call to print out the error value.
>This printk statement does not execute when the SIGTERM
>is genereated.
>
>Using "crash" on a live Fedora 12 system, I see that my threads
>are, as expected, sitting inside skb_rec_datagram().
>
>So, I am left with two choices. Either the 
>replacements for kill_proc() are not functioning, or
>skb_rec_datagram() has changed its behavior that ignores
>SIGTERM.

>Interestingly, I can "kill -9 " my threads as ROOT from the command
>line on a RH 4/5 system. But
>I can not do so on a Fedora 11/12 system. This would seem to imply that
>my signals are not masked correctly. However, inspection via
>'crash' on a live system seems to indicate that my signal mask is ok.
>
>
>Does anyone know if the behavior of skb_rec_datagram() has changed
>in the newer kernels ?
>
>thanks
>
>wr


In Fedora 11 code for net/core/datagram.c, the skb_rec_datagram() and
wait_for_packet() functions seem to have changed such that there is a
new ( to me anyway ) function named receiver_wake_function(). This function,
based on the comments, appears to be filtering signals.

Can anyone tell me if this receiver_wake_function() is filtering out
SIGTERM and SIGKILL signals ?
( I have not been able to determine how these SIG signals convert to the poll bits in the code... )

wr




More information about the fedora-devel-list mailing list