* [patch] Threads performance - allow signal handler to not call handler
@ 2002-03-27 21:46 Corey Minyard
2002-03-27 22:02 ` Jeff Dike
0 siblings, 1 reply; 2+ messages in thread
From: Corey Minyard @ 2002-03-27 21:46 UTC (permalink / raw)
To: linux-kernel
[-- Attachment #1: Type: text/plain, Size: 643 bytes --]
This patch modfies i386 to add a flag to sa_flags in sigaction that will
cause the signal handler to not be called (but all other side effects to
occur). This may seem unusual, but signals are often used between
threads to wake each other up, the signal handler is just a dummy and is
pure overhead. With this patch, if the flag is set, the signal handler
won't get called (thus saving the overhead of going in and out of
userland for the handler), but it will still wake up sigsuspend() and
select(). The beauty of this is the flag will be ignored on kernels
without it, so it will still work, with just lower performance.
-Corey
[-- Attachment #2: linux-nocallhndlr.patch --]
[-- Type: text/plain, Size: 1533 bytes --]
--- ./arch/i386/kernel/signal.c.nocallhndlr Wed Mar 27 10:56:29 2002
+++ ./arch/i386/kernel/signal.c Wed Mar 27 11:04:45 2002
@@ -558,21 +558,24 @@
}
}
- /* Set up the stack frame */
- if (ka->sa.sa_flags & SA_SIGINFO)
- setup_rt_frame(sig, ka, info, oldset, regs);
- else
- setup_frame(sig, ka, oldset, regs);
-
if (ka->sa.sa_flags & SA_ONESHOT)
ka->sa.sa_handler = SIG_DFL;
- if (!(ka->sa.sa_flags & SA_NODEFER)) {
- spin_lock_irq(¤t->sigmask_lock);
- sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
- sigaddset(¤t->blocked,sig);
- recalc_sigpending(current);
- spin_unlock_irq(¤t->sigmask_lock);
+ /* Set up the stack frame */
+ if (! (ka->sa.sa_flags & SA_NOCALLHNDLR)) {
+ if (ka->sa.sa_flags & SA_SIGINFO)
+ setup_rt_frame(sig, ka, info, oldset, regs);
+ else
+ setup_frame(sig, ka, oldset, regs);
+
+ if (!(ka->sa.sa_flags & SA_NODEFER)) {
+ spin_lock_irq(¤t->sigmask_lock);
+ sigorsets(¤t->blocked,¤t->blocked,
+ &ka->sa.sa_mask);
+ sigaddset(¤t->blocked,sig);
+ recalc_sigpending(current);
+ spin_unlock_irq(¤t->sigmask_lock);
+ }
}
}
--- ./include/asm-i386/signal.h.nocallhndlr Wed Mar 27 10:56:12 2002
+++ ./include/asm-i386/signal.h Wed Mar 27 11:17:38 2002
@@ -91,6 +91,7 @@
#define SA_RESTART 0x10000000
#define SA_NODEFER 0x40000000
#define SA_RESETHAND 0x80000000
+#define SA_NOCALLHNDLR 0x00800000 /* Don't really call the handler. */
#define SA_NOMASK SA_NODEFER
#define SA_ONESHOT SA_RESETHAND
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [patch] Threads performance - allow signal handler to not call handler
2002-03-27 21:46 [patch] Threads performance - allow signal handler to not call handler Corey Minyard
@ 2002-03-27 22:02 ` Jeff Dike
0 siblings, 0 replies; 2+ messages in thread
From: Jeff Dike @ 2002-03-27 22:02 UTC (permalink / raw)
To: Corey Minyard; +Cc: linux-kernel
minyard@acm.org said:
> With this patch, if the flag is set, the signal handler won't get
> called (thus saving the overhead of going in and out of userland for
> the handler), but it will still wake up sigsuspend() and select().
I've wanted this for UML as well. I have some empty signal handlers which
exist for no reason other than to wake up pause/sigsuspend/et al.
Jeff
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2002-03-27 22:00 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-03-27 21:46 [patch] Threads performance - allow signal handler to not call handler Corey Minyard
2002-03-27 22:02 ` Jeff Dike
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox