Signal mask restore anomaly
Hendricks, Kevin
khendricks at ivey.uwo.ca
Thu Aug 17 23:05:44 EST 2000
Check you kernel source in arch/ppc/kernel/signal.c and in do_signal() make
sure there is a break after the call to handle_signal() as shown in the
code snippet below.
/* Whee! Actually deliver the signal. */
handle_signal(signr, ka, &info, oldset, regs, &newsp, frame);
break;
If the break exists, then the problem is someplace else. If not, add it
and your troubles should go away (he said hopefully!).
Kevin
At 08:43 -0400 8/17/00, Hendricks, Kevin wrote:
>Hi,
>
>This bug was fixed in 2.2.14pre9 and later kernels. Please upgrade or diff
>/arch/ppc/kernel/signal.c to see the fix.
>
>Kevin
>
>
>
>
>At 00:05 -0400 8/17/00, Jeffrey Hawkins wrote:
>>Frank,
>>
>>I am able to reproduce the same failures on a 2.2.13
>>PPC Kernel, with GCC 2.95.3-2c and GLIBC 2.1.3-15d.
>>Ran same test code on Solaris with correct operation.
>>
>>The failure is definitely a MASK restoration problem.
>>Since, one can recover from the problem by UNBLOCKING
>>the SIGINT.
>>
>>I believe the problem may be an interaction between the
>>Terminal I/O related SIGNALS being used (SIGTSTP and
>>SIGINT) and the use of the STDIO Library calls (printf
>>and getch). By replacing the SIGTSTP and SIGINT signals
>>with SIGUSR1 and SIGUSR2, everything worked correctly
>>(tested via "kill" command from a separate terminal
>>window).
>>
>>Looking at the GLIBC Bug Database, I didn't see any bugs
>>which seem to correspond to this failure mechanism. Most
>>of the SIGNALS bugs seem to be related THREADS.
>>
>>Looks like it is time submit a bug report to GNU....
>>
>>Jeff
>>
>>
>>Frank Jas wrote:
>>>
>>> Under certain circumstances, a signal blocked while a
>>> signal handler is executing will not be restored.
>>>
>>> This is my kernel info:
>>>
>>> Linux 2.2.6-15apmac #1 Mon May 31 03:54:09 EDT 1999 ppc unknown
>>>
>>> The behavior does not occur under Intel versions (2.2.5-15smp).
>>>
>>> Below is a program that tests out the use of signal masks
>>> with sigaction(). It sets up a handler for SIGINT and
>>> SIGTSTP. The handler for SIGTSTP adds SIGINT to
>>> the signal mask for that handler. So while the SIGTSTP
>>> handler is executing, occurences of SIGINT will be
>>> blocked until the handler returns. SIGTSTP will also
>>> be blocked.
>>>
>>> #define _POSIX_SOURCE 1
>>> #define _GNU_SOURCE 1
>>>
>>> #include <signal.h>
>>> #include <errno.h>
>>> #include <stdio.h>
>>>
>>> void on_intr (signum)
>>> int signum ;
>>> {
>>> printf("\n Interrupted with signal %d. \n", signum) ;
>>> }
>>>
>>> void on_tstp (signum)
>>> int signum;
>>> {
>>> printf ("\n Handler for SIGTSTP wants text or ^C or ^Z: ") ;
>>> getchar () ;
>>> }
>>>
>>> void main ()
>>> {
>>> struct sigaction new_intr_action;
>>> struct sigaction new_tstp_action;
>>> int c ;
>>>
>>> sigemptyset (&new_intr_action.sa_mask);
>>> new_intr_action.sa_handler = on_intr;
>>> new_intr_action.sa_flags = SA_RESTART;
>>>
>>> sigaction (SIGINT, &new_intr_action, 0);
>>>
>>> sigemptyset (&new_tstp_action.sa_mask);
>>> sigaddset (&new_tstp_action.sa_mask, SIGINT);
>>> new_tstp_action.sa_handler = on_tstp;
>>> new_tstp_action.sa_flags = SA_RESTART;
>>>
>>> sigaction (SIGTSTP, &new_tstp_action, 0);
>>>
>>> printf("Starting main input loop enter text or ^Z or ^C:\n") ;
>>>
>>> while ((c = getchar ()) != EOF) {
>>> putchar (c);
>>> }
>>> }
>>>
>>> The following execution sequence leads to the anomalous behavior.
>>>
>>> Trigger the SIGTSTP handler with a ^Z
>>> While executing the handler, deliver a ^Z and ^C
>>> Hit return to return from the handler.
>>> Another instance of the SIGTSTP handler should execute.
>>> Hit return to return from that instance of the handler.
>>> Notice that the SIGINT handler does not execute and should have.
>>> Any subsequent SIGINT are apparently blocked.
>>>
>>> Apparently the nested occurence of SIGTSTP effected the restore
>>> of the SIGINT mask, and the handling of the pending SIGINT.
>>>
>>> The same behavior will result using 'kill' from another window
>>> to send the signals.
>>>
>>> Please let me know if this is not the appropriate venue for this
>>> post.
>>>
>>> Frank Jas
>>>
>>
>>--
>>********************************************************
>>
>>Jeffrey Hawkins
>>
>>Senior Staff Software Engineer
>>Motorola Wireless Data Solutions Engineering
>>
>>Address: DEPT: DQ525
>> MS: IL-02-1055A
>> 1301 East Algonquin Road
>> Schaumburg, IL 60196
>>
>>Phone: (847)576-7463
>>FAX: (847)576-7737
>>
>>********************************************************
>>
>
>
>--
>Kevin B. Hendricks, Associate Professor of Operations and Information
>Technology
>Richard Ivey School of Business, University of Western Ontario
>London, Ontario N6A-3K7 CANADA
>khendricks at ivey.uwo.ca, (519) 661-3874, fax: 519-661-3959
>
>
--
Kevin B. Hendricks, Associate Professor of Operations and Information
Technology
Richard Ivey School of Business, University of Western Ontario
London, Ontario N6A-3K7 CANADA
khendricks at ivey.uwo.ca, (519) 661-3874, fax: 519-661-3959
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
More information about the Linuxppc-dev
mailing list