From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:45997) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QkfRE-0007OT-Tm for qemu-devel@nongnu.org; Sat, 23 Jul 2011 12:52:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QkfRD-0006v7-K6 for qemu-devel@nongnu.org; Sat, 23 Jul 2011 12:52:28 -0400 Received: from e3.ny.us.ibm.com ([32.97.182.143]:54902) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QkfRD-0006v3-FK for qemu-devel@nongnu.org; Sat, 23 Jul 2011 12:52:27 -0400 Received: from d01relay01.pok.ibm.com (d01relay01.pok.ibm.com [9.56.227.233]) by e3.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id p6NGSnx3019746 for ; Sat, 23 Jul 2011 12:28:49 -0400 Received: from d01av03.pok.ibm.com (d01av03.pok.ibm.com [9.56.224.217]) by d01relay01.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p6NGqN5w141130 for ; Sat, 23 Jul 2011 12:52:23 -0400 Received: from d01av03.pok.ibm.com (loopback [127.0.0.1]) by d01av03.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p6NCqBEa002946 for ; Sat, 23 Jul 2011 09:52:11 -0300 Message-ID: <4E2AFC45.1090709@us.ibm.com> Date: Sat, 23 Jul 2011 11:52:21 -0500 From: Anthony Liguori MIME-Version: 1.0 References: <4DF9CD7E.5020509@siemens.com> <4DFB1D9D.7060108@siemens.com> In-Reply-To: <4DFB1D9D.7060108@siemens.com> Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v2] Register Linux dyntick timer as per-thread signal List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jan Kiszka Cc: Paolo Bonzini , Richard Henderson , qemu-devel , kvm , Sasha Levin On 06/17/2011 04:25 AM, Jan Kiszka wrote: > Derived from kvm-tool patch > http://thread.gmane.org/gmane.comp.emulators.kvm.devel/74309 > > Ingo Molnar pointed out that sending the timer signal to the whole > process, just blocking it everywhere, is suboptimal with an increasing > number of threads. QEMU is also using this pattern so far. > > Linux provides a (non-portable) way to restrict the signal to a single > thread: We can use SIGEV_THREAD_ID unless we are forced to emulate > signalfd via an additional thread. That case could theoretically be > optimized as well, but it doesn't look worth bothering. > > Signed-off-by: Jan Kiszka Applied. Thanks. Regards, Anthony Liguori > --- > > Changes in v2: > - refactored dynticks_start_timer changes as suggested by Richard > Henderson > - added reference to original kvm-tool patch > > compatfd.c | 11 +++++++++++ > compatfd.h | 1 + > qemu-timer.c | 8 ++++++++ > 3 files changed, 20 insertions(+), 0 deletions(-) > > diff --git a/compatfd.c b/compatfd.c > index 41586ce..31654c6 100644 > --- a/compatfd.c > +++ b/compatfd.c > @@ -115,3 +115,14 @@ int qemu_signalfd(const sigset_t *mask) > > return qemu_signalfd_compat(mask); > } > + > +bool qemu_signalfd_available(void) > +{ > +#ifdef CONFIG_SIGNALFD > + errno = 0; > + syscall(SYS_signalfd, -1, NULL, _NSIG / 8); > + return errno != ENOSYS; > +#else > + return false; > +#endif > +} > diff --git a/compatfd.h b/compatfd.h > index fc37915..6b04877 100644 > --- a/compatfd.h > +++ b/compatfd.h > @@ -39,5 +39,6 @@ struct qemu_signalfd_siginfo { > }; > > int qemu_signalfd(const sigset_t *mask); > +bool qemu_signalfd_available(void); > > #endif > diff --git a/qemu-timer.c b/qemu-timer.c > index 72066c7..743cf96 100644 > --- a/qemu-timer.c > +++ b/qemu-timer.c > @@ -803,6 +803,8 @@ static int64_t qemu_next_alarm_deadline(void) > > #if defined(__linux__) > > +#include "compatfd.h" > + > static int dynticks_start_timer(struct qemu_alarm_timer *t) > { > struct sigevent ev; > @@ -822,6 +824,12 @@ static int dynticks_start_timer(struct qemu_alarm_timer *t) > memset(&ev, 0, sizeof(ev)); > ev.sigev_value.sival_int = 0; > ev.sigev_notify = SIGEV_SIGNAL; > +#ifdef SIGEV_THREAD_ID > + if (qemu_signalfd_available()) { > + ev.sigev_notify = SIGEV_THREAD_ID; > + ev._sigev_un._tid = qemu_get_thread_id(); > + } > +#endif /* SIGEV_THREAD_ID */ > ev.sigev_signo = SIGALRM; > > if (timer_create(CLOCK_REALTIME,&ev,&host_timer)) {