Hello? I've been running with this diff since July without any issues (i386 & amd64).
* Alexander Polakov <p...@sdf.org> [121213 18:34]: > This diff reduces IPI traffic for a case when process A is sending > a lot of signals to process B running on a different CPU. userret() > delivers all process signals at once, so there is no need to send > an interrupt for every signal. > > The problem was noticed by rtorrent 0.9.2 users, which does exactly > this, which led to process/system hangs and slowness. > > Tested and known to help on amd64 by me and dcoppa@. > > Index: amd64/amd64/machdep.c > =================================================================== > RCS file: /cvs/src/sys/arch/amd64/amd64/machdep.c,v > retrieving revision 1.155 > diff -u -r1.155 machdep.c > --- amd64/amd64/machdep.c 4 Jun 2012 15:19:47 -0000 1.155 > +++ amd64/amd64/machdep.c 23 Jul 2012 13:49:40 -0000 > @@ -690,8 +690,10 @@ > void > signotify(struct proc *p) > { > - aston(p); > - cpu_unidle(p->p_cpu); > + if (!isastset(p)) { > + aston(p); > + cpu_unidle(p->p_cpu); > + } > } > > #ifdef MULTIPROCESSOR > Index: amd64/include/cpu.h > =================================================================== > RCS file: /cvs/src/sys/arch/amd64/include/cpu.h,v > retrieving revision 1.73 > diff -u -r1.73 cpu.h > --- amd64/include/cpu.h 17 Apr 2012 16:02:33 -0000 1.73 > +++ amd64/include/cpu.h 23 Jul 2012 13:49:40 -0000 > @@ -213,6 +213,7 @@ > #endif > > #define aston(p) ((p)->p_md.md_astpending = 1) > +#define isastset(p) ((p)->p_md.md_astpending == 1) > > #define curpcb curcpu()->ci_curpcb > > Index: hppa/hppa/machdep.c > =================================================================== > RCS file: /cvs/src/sys/arch/hppa/hppa/machdep.c,v > retrieving revision 1.206 > diff -u -r1.206 machdep.c > --- hppa/hppa/machdep.c 21 Jun 2012 00:56:59 -0000 1.206 > +++ hppa/hppa/machdep.c 23 Jul 2012 13:49:40 -0000 > @@ -1399,8 +1399,10 @@ > void > signotify(struct proc *p) > { > - setsoftast(p); > - cpu_unidle(p->p_cpu); > + if (!isastset(p)) { > + setsoftast(p); > + cpu_unidle(p->p_cpu); > + } > } > > /* > Index: hppa/include/intr.h > =================================================================== > RCS file: /cvs/src/sys/arch/hppa/include/intr.h,v > retrieving revision 1.37 > diff -u -r1.37 intr.h > --- hppa/include/intr.h 14 Jan 2011 13:20:06 -0000 1.37 > +++ hppa/include/intr.h 23 Jul 2012 13:49:40 -0000 > @@ -157,7 +157,8 @@ > int hppa_ipi_broadcast(u_long); > #endif > > -#define setsoftast(p) (p->p_md.md_astpending = 1) > +#define setsoftast(p) ((p)->p_md.md_astpending = 1) > +#define isastset(p) ((p)->p_md.md_astpending == 1) > > void *softintr_establish(int, void (*)(void *), void *); > void softintr_disestablish(void *); > Index: i386/i386/machdep.c > =================================================================== > RCS file: /cvs/src/sys/arch/i386/i386/machdep.c,v > retrieving revision 1.510 > diff -u -r1.510 machdep.c > --- i386/i386/machdep.c 23 May 2012 08:23:43 -0000 1.510 > +++ i386/i386/machdep.c 23 Jul 2012 13:49:40 -0000 > @@ -2420,8 +2420,10 @@ > void > signotify(struct proc *p) > { > - aston(p); > - cpu_unidle(p->p_cpu); > + if (!isastset(p)) { > + aston(p); > + cpu_unidle(p->p_cpu); > + } > } > > #ifdef MULTIPROCESSOR > Index: i386/include/cpu.h > =================================================================== > RCS file: /cvs/src/sys/arch/i386/include/cpu.h,v > retrieving revision 1.122 > diff -u -r1.122 cpu.h > --- i386/include/cpu.h 27 Mar 2012 06:44:01 -0000 1.122 > +++ i386/include/cpu.h 23 Jul 2012 13:49:41 -0000 > @@ -226,6 +226,7 @@ > #endif > > #define aston(p) ((p)->p_md.md_astpending = 1) > +#define isastset(p) ((p)->p_md.md_astpending == 1) > > #define curpcb curcpu()->ci_curpcb > > Index: m88k/include/cpu.h > =================================================================== > RCS file: /cvs/src/sys/arch/m88k/include/cpu.h,v > retrieving revision 1.54 > diff -u -r1.54 cpu.h > --- m88k/include/cpu.h 25 Oct 2011 18:38:06 -0000 1.54 > +++ m88k/include/cpu.h 23 Jul 2012 13:49:41 -0000 > @@ -256,6 +256,7 @@ > (((struct cpu_info *)(framep)->tf.tf_cpu)->ci_intrdepth > 1) > > #define aston(p) ((p)->p_md.md_astpending = 1) > +#define isastset(p) ((p)->p_md.md_astpending == 1) > > /* > * This is used during profiling to integrate system time. > Index: m88k/m88k/m88k_machdep.c > =================================================================== > RCS file: /cvs/src/sys/arch/m88k/m88k/m88k_machdep.c,v > retrieving revision 1.52 > diff -u -r1.52 m88k_machdep.c > --- m88k/m88k/m88k_machdep.c 23 Mar 2012 15:51:26 -0000 1.52 > +++ m88k/m88k/m88k_machdep.c 23 Jul 2012 13:49:41 -0000 > @@ -314,8 +314,10 @@ > void > signotify(struct proc *p) > { > - aston(p); > - cpu_unidle(p->p_cpu); > + if (!isastset(p)) { > + aston(p); > + cpu_unidle(p->p_cpu); > + } > } > > #ifdef MULTIPROCESSOR > Index: macppc/macppc/machdep.c > =================================================================== > RCS file: /cvs/src/sys/arch/macppc/macppc/machdep.c,v > retrieving revision 1.131 > diff -u -r1.131 machdep.c > --- macppc/macppc/machdep.c 29 Aug 2011 20:21:44 -0000 1.131 > +++ macppc/macppc/machdep.c 23 Jul 2012 13:49:41 -0000 > @@ -935,8 +935,10 @@ > void > signotify(struct proc *p) > { > - aston(p); > - cpu_unidle(p->p_cpu); > + if (!isastset(p)) { > + aston(p); > + cpu_unidle(p->p_cpu); > + } > } > > #ifdef MULTIPROCESSOR > Index: mips64/include/cpu.h > =================================================================== > RCS file: /cvs/src/sys/arch/mips64/include/cpu.h,v > retrieving revision 1.83 > diff -u -r1.83 cpu.h > --- mips64/include/cpu.h 14 Jul 2012 19:50:11 -0000 1.83 > +++ mips64/include/cpu.h 23 Jul 2012 13:49:41 -0000 > @@ -511,12 +511,20 @@ > * process as soon as possible. > */ > #ifdef MULTIPROCESSOR > -#define signotify(p) (aston(p), cpu_unidle(p->p_cpu)) > +static __inline void > +signotify(struct proc *p) > +{ > + if (!isastset(p)) { > + aston(p); > + cpu_unidle(p->p_cpu); > + } > +} > #else > #define signotify(p) aston(p) > #endif > > -#define aston(p) p->p_md.md_astpending = 1 > +#define aston(p) ((p)->p_md.md_astpending = 1) > +#define isastset(p) ((p)->p_md.md_astpending == 1) > > #endif /* _KERNEL && !_LOCORE */ > > Index: powerpc/include/cpu.h > =================================================================== > RCS file: /cvs/src/sys/arch/powerpc/include/cpu.h,v > retrieving revision 1.46 > diff -u -r1.46 cpu.h > --- powerpc/include/cpu.h 28 Sep 2010 20:27:55 -0000 1.46 > +++ powerpc/include/cpu.h 23 Jul 2012 13:49:41 -0000 > @@ -155,6 +155,7 @@ > #define DELAY(n) delay(n) > > #define aston(p) ((p)->p_md.md_astpending = 1) > +#define isastset(p) ((p)->p_md.md_astpending == 1) > > /* > * Preempt the current process if in interrupt from user mode, > Index: sparc64/include/cpu.h > =================================================================== > RCS file: /cvs/src/sys/arch/sparc64/include/cpu.h,v > retrieving revision 1.78 > diff -u -r1.78 cpu.h > --- sparc64/include/cpu.h 6 Jul 2011 22:26:44 -0000 1.78 > +++ sparc64/include/cpu.h 23 Jul 2012 13:49:41 -0000 > @@ -226,7 +226,7 @@ > extern void (*cpu_start_clock)(void); > > #define aston(p) ((p)->p_md.md_astpending = 1) > - > +#define isastset(p) ((p)->p_md.md_astpending == 1) > /* > * Preempt the current process if in interrupt from user mode, > * or after the current trap/syscall if in system mode. > Index: sparc64/sparc64/machdep.c > =================================================================== > RCS file: /cvs/src/sys/arch/sparc64/sparc64/machdep.c,v > retrieving revision 1.138 > diff -u -r1.138 machdep.c > --- sparc64/sparc64/machdep.c 9 May 2012 18:34:21 -0000 1.138 > +++ sparc64/sparc64/machdep.c 23 Jul 2012 13:49:42 -0000 > @@ -613,8 +613,10 @@ > void > signotify(struct proc *p) > { > - aston(p); > - cpu_unidle(p->p_cpu); > + if (!isastset(p)) { > + aston(p); > + cpu_unidle(p->p_cpu); > + } > } > > int waittime = -1; > -- Alexander Polakov | plhk.ru