public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Luca Tettamanti <kronos.it-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: qemu-devel-qX2TKyscuCcdnm+yROfE0A@public.gmane.org
Cc: kvm-devel-TtF/mJH4Jtrk1uMJSBkQmQ@public.gmane.org,
	Luca Tettamanti
	<kronos.it-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Subject: [PATCH 4/4] Add support for dynamic ticks.
Date: Sat, 18 Aug 2007 01:11:53 +0200	[thread overview]
Message-ID: <20070817231406.717137712@gmail.com> (raw)
In-Reply-To: 20070817231149.544849769@gmail.com

[-- Attachment #1: clock-dyn --]
[-- Type: text/plain, Size: 7933 bytes --]

If DYNAMIC_TICKS is defined qemu does not attepmt to generate SIGALRM at a
constant rate. Rather, the system timer is set to generate SIGALRM only
when it is needed. DYNAMIC_TICKS reduces the number of SIGALRMs sent to
idle dynamic-ticked guests.
Original patch from Dan Kenigsberg <dank-atKUWr5tajBWk0Htik3J/w@public.gmane.org>

Signed-off-by: Luca Tettamanti <kronos.it-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

---
 configure |    5 ++
 vl.c      |  149 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 148 insertions(+), 6 deletions(-)

Index: qemu/vl.c
===================================================================
--- qemu.orig/vl.c	2007-08-17 17:45:00.000000000 +0200
+++ qemu/vl.c	2007-08-18 00:38:03.000000000 +0200
@@ -784,12 +784,42 @@
 
 struct qemu_alarm_timer {
     char const *name;
+    unsigned int flags;
 
     int (*start)(struct qemu_alarm_timer *t);
     void (*stop)(struct qemu_alarm_timer *t);
+    void (*rearm)(struct qemu_alarm_timer *t);
     void *priv;
 };
 
+#define ALARM_FLAG_DYNTICKS  0x1
+
+#ifdef DYNAMIC_TICKS
+
+static inline int alarm_has_dynticks(struct qemu_alarm_timer *t)
+{
+    return t->flags & ALARM_FLAG_DYNTICKS;
+}
+
+static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t) {
+    if (!alarm_has_dynticks(t))
+        return;
+
+    t->rearm(t);
+}
+
+#else /* DYNAMIC_TICKS */
+
+static inline int alarm_has_dynticks(struct qemu_alarm_timer *t)
+{
+    return 0;
+}
+
+static void qemu_rearm_alarm_timer(void) {
+}
+
+#endif /* DYNAMIC_TICKS */
+
 static struct qemu_alarm_timer *alarm_timer;
 
 #ifdef _WIN32
@@ -808,6 +838,14 @@
 static int unix_start_timer(struct qemu_alarm_timer *t);
 static void unix_stop_timer(struct qemu_alarm_timer *t);
 
+#ifdef DYNAMIC_TICKS
+
+static int dynticks_start_timer(struct qemu_alarm_timer *t);
+static void dynticks_stop_timer(struct qemu_alarm_timer *t);
+static void dynticks_rearm_timer(struct qemu_alarm_timer *t);
+
+#endif
+
 #ifdef __linux__
 
 static int hpet_start_timer(struct qemu_alarm_timer *t);
@@ -821,16 +859,19 @@
 #endif /* _WIN32 */
 
 static struct qemu_alarm_timer alarm_timers[] = {
+#ifndef _WIN32
+#ifdef DYNAMIC_TICKS
+    {"dynticks", ALARM_FLAG_DYNTICKS, dynticks_start_timer, dynticks_stop_timer, dynticks_rearm_timer, NULL},
+#endif
 #ifdef __linux__
     /* HPET - if available - is preferred */
-    {"hpet", hpet_start_timer, hpet_stop_timer, NULL},
+    {"hpet", 0, hpet_start_timer, hpet_stop_timer, NULL, NULL},
     /* ...otherwise try RTC */
-    {"rtc", rtc_start_timer, rtc_stop_timer, NULL},
+    {"rtc", 0, rtc_start_timer, rtc_stop_timer, NULL, NULL},
 #endif
-#ifndef _WIN32
-    {"unix", unix_start_timer, unix_stop_timer, NULL},
+    {"unix", 0, unix_start_timer, unix_stop_timer, NULL, NULL},
 #else
-    {"win32", win32_start_timer, win32_stop_timer, &alarm_win32_data},
+    {"win32", 0, win32_start_timer, win32_stop_timer, NULL, &alarm_win32_data},
 #endif
     {NULL, }
 };
@@ -949,6 +990,8 @@
         }
         pt = &t->next;
     }
+
+    qemu_rearm_alarm_timer(alarm_timer);
 }
 
 /* modify the current timer so that it will be fired when current_time
@@ -1008,6 +1051,7 @@
         /* run the callback (the timer list can be modified) */
         ts->cb(ts->opaque);
     }
+    qemu_rearm_alarm_timer(alarm_timer);
 }
 
 int64_t qemu_get_clock(QEMUClock *clock)
@@ -1115,7 +1159,8 @@
         last_clock = ti;
     }
 #endif
-    if (qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
+    if (alarm_has_dynticks(alarm_timer) ||
+        qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
                            qemu_get_clock(vm_clock)) ||
         qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME],
                            qemu_get_clock(rt_clock))) {
@@ -1243,6 +1288,97 @@
 
 #endif /* !defined(__linux__) */
 
+#ifdef DYNAMIC_TICKS
+static int dynticks_start_timer(struct qemu_alarm_timer *t)
+{
+    struct sigevent ev;
+    timer_t host_timer;
+    struct sigaction act;
+
+    sigfillset(&act.sa_mask);
+    act.sa_flags = 0;
+#if defined(TARGET_I386) && defined(USE_CODE_COPY)
+    act.sa_flags |= SA_ONSTACK;
+#endif
+    act.sa_handler = host_alarm_handler;
+
+    sigaction(SIGALRM, &act, NULL);
+
+    ev.sigev_value.sival_int = 0;
+    ev.sigev_notify = SIGEV_SIGNAL;
+    ev.sigev_signo = SIGALRM;
+
+    if (timer_create(CLOCK_REALTIME, &ev, &host_timer)) {
+        perror("timer_create");
+
+        /* disable dynticks */
+        fprintf(stderr, "Dynamic Ticks disabled\n");
+
+        return -1;
+    }
+
+    t->priv = (void *)host_timer;
+
+    return 0;
+}
+
+static void dynticks_stop_timer(struct qemu_alarm_timer *t)
+{
+    timer_t host_timer = (timer_t)t->priv;
+
+    timer_delete(host_timer);
+}
+
+static void dynticks_rearm_timer(struct qemu_alarm_timer *t)
+{
+    timer_t host_timer = (timer_t)t->priv;
+    struct itimerspec timeout;
+    int64_t nearest_delta_us = INT64_MAX;
+
+    if (active_timers[QEMU_TIMER_REALTIME] ||
+                    active_timers[QEMU_TIMER_VIRTUAL]) {
+        int64_t vmdelta_us, current_us;
+
+        if (active_timers[QEMU_TIMER_REALTIME])
+            nearest_delta_us = (active_timers[QEMU_TIMER_REALTIME]->expire_time - qemu_get_clock(rt_clock))*1000;
+
+        if (active_timers[QEMU_TIMER_VIRTUAL]) {
+            /* round up */
+            vmdelta_us = (active_timers[QEMU_TIMER_VIRTUAL]->expire_time - qemu_get_clock(vm_clock)+999)/1000;
+            if (vmdelta_us < nearest_delta_us)
+                nearest_delta_us = vmdelta_us;
+        }
+
+        /* Avoid arming the timer to negative, zero, or too low values */
+        /* TODO: MIN_TIMER_REARM_US should be optimized */
+        #define MIN_TIMER_REARM_US 250
+        if (nearest_delta_us <= MIN_TIMER_REARM_US)
+            nearest_delta_us = MIN_TIMER_REARM_US;
+
+        /* check whether a timer is already running */
+        if (timer_gettime(host_timer, &timeout)) {
+            perror("gettime");
+            fprintf(stderr, "Internal timer error: aborting\n");
+            exit(1);
+        }
+        current_us = timeout.it_value.tv_sec * 1000000 + timeout.it_value.tv_nsec/1000;
+        if (current_us && current_us <= nearest_delta_us)
+            return;
+
+        timeout.it_interval.tv_sec = 0;
+        timeout.it_interval.tv_nsec = 0; /* 0 for one-shot timer */
+        timeout.it_value.tv_sec =  nearest_delta_us / 1000000;
+        timeout.it_value.tv_nsec = (nearest_delta_us % 1000000) * 1000;
+        if (timer_settime(host_timer, 0 /* RELATIVE */, &timeout, NULL)) {
+            perror("settime");
+            fprintf(stderr, "Internal timer error: aborting\n");
+            exit(1);
+        }
+    }
+}
+
+#endif /* DYNAMIC_TICKS */
+
 static int unix_start_timer(struct qemu_alarm_timer *t)
 {
     struct sigaction act;
@@ -6490,6 +6626,7 @@
         cpu_enable_ticks();
         vm_running = 1;
         vm_state_notify(1);
+        qemu_rearm_alarm_timer(alarm_timer);
     }
 }
 
Index: qemu/configure
===================================================================
--- qemu.orig/configure	2007-08-17 17:45:17.000000000 +0200
+++ qemu/configure	2007-08-17 17:45:31.000000000 +0200
@@ -294,6 +294,8 @@
         *)     echo "undefined SPARC architecture. Exiting";exit 1;;
       esac
   ;;
+  --disable-dynamic-ticks) dynamic_ticks="no"
+  ;;
   esac
 done
 
@@ -859,6 +861,9 @@
 if [ "$build_docs" = "yes" ] ; then
   echo "BUILD_DOCS=yes" >> $config_mak
 fi
+if test "$dynamic_ticks" != "no" ; then
+  echo "#define DYNAMIC_TICKS 1" >> $config_h
+fi
 
 # XXX: suppress that
 if [ "$bsd" = "yes" ] ; then

-- 

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/

  parent reply	other threads:[~2007-08-17 23:11 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-08-17 23:11 [PATCH 0/4] Rework alarm timer infrastrucure - take 2 Luca Tettamanti
2007-08-17 23:11 ` [PATCH 1/4] Rework alarm timer infrastrucure Luca Tettamanti
2007-08-17 23:11 ` [PATCH 2/4] Add -clock option Luca Tettamanti
2007-08-17 23:11 ` [PATCH 3/4] Add support for HPET periodic timer Luca Tettamanti
     [not found]   ` <20070817231406.493008599-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2007-08-21 19:24     ` [Qemu-devel] " Matthew Kent
2007-08-21 19:40       ` Luca
     [not found]         ` <68676e00708211240k7237bf21k131257dd28063d26-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2007-08-21 20:15           ` Matthew Kent
2007-08-22  6:48             ` Dan Kenigsberg
     [not found]               ` <20070822064851.GA16295-RO/WWmT55CHJJbofclyLPCHBx9XpghdU@public.gmane.org>
2007-08-22  7:03                 ` Avi Kivity
     [not found]                   ` <46CBDFC4.5060207-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-08-22 12:34                     ` Andi Kleen
     [not found]                       ` <20070822123424.GK2642-KvMlXPVkKihbpigZmTR7Iw@public.gmane.org>
2007-08-22 21:11                         ` Dan Kenigsberg
     [not found]                           ` <20070822211150.GA22093-RO/WWmT55CHJJbofclyLPCHBx9XpghdU@public.gmane.org>
2007-08-22 22:09                             ` Andi Kleen
     [not found]                               ` <20070822220947.GK8058-KvMlXPVkKihbpigZmTR7Iw@public.gmane.org>
2007-08-23  7:02                                 ` Dan Kenigsberg
     [not found]                                   ` <20070823070230.GA24942-RO/WWmT55CHJJbofclyLPCHBx9XpghdU@public.gmane.org>
2007-08-24 20:18                                     ` Luca
2007-08-17 23:11 ` Luca Tettamanti [this message]
     [not found] ` <20070817231149.544849769-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2007-08-17 23:48   ` [Qemu-devel] [PATCH 0/4] Rework alarm timer infrastrucure - take 2 Christian MICHON
     [not found]     ` <46d6db660708171648m3a798685q6514261bc097bc62-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2007-08-18  0:10       ` Luca
2007-08-18 15:17   ` Anthony Liguori
2007-08-18 16:53     ` [PATCH 0/4] Rework alarm timer infrastrucure - take2 Dor Laor
     [not found]     ` <64F9B87B6B770947A9F8391472E032160D4645F0@ehost011-8.exch011.intermedia.net>
     [not found]       ` <64F9B87B6B770947A9F8391472E032160D4645F0-yEcIvxbTEBqsx+V+t5oei8rau4O3wl8o3fe8/T/H7NteoWH0uzbU5w@public.gmane.org>
2007-08-18 22:02         ` Luca Tettamanti
     [not found]           ` <20070818220252.GA19526-sTXFmx6KbOnUXq0IF5SVAZ4oGUkBHcCu@public.gmane.org>
2007-08-18 23:58             ` Anthony Liguori
2007-08-19  7:36               ` [PATCH 0/4] Rework alarm timer infrastrucure -take2 Dor Laor
2007-08-19  8:24               ` [PATCH 0/4] Rework alarm timer infrastrucure - take2 Avi Kivity
     [not found]                 ` <46C7FE32.4050309-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-08-19 13:10                   ` [Qemu-devel] " Jamie Lokier
     [not found]                     ` <20070819131042.GA22798-tp2ajI7sM85Y6zH9YvfY1x2eb7JE58TQ@public.gmane.org>
2007-08-19 13:48                       ` Avi Kivity
     [not found]                         ` <46C84A16.7040305-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-08-19 13:57                           ` Paul Brook
     [not found]                             ` <200708191457.21237.paul-qD8j1LwMmJjtCj0u4l0SBw@public.gmane.org>
2007-08-19 14:07                               ` Avi Kivity
     [not found]                                 ` <46C84E95.7070802-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-08-19 14:27                                   ` Dor Laor
2007-08-20  9:25                                   ` Avi Kivity
2007-08-19 17:15                               ` Jamie Lokier
     [not found]                                 ` <20070819171545.GB16928-tp2ajI7sM85Y6zH9YvfY1x2eb7JE58TQ@public.gmane.org>
2007-08-19 19:29                                   ` [Qemu-devel] Re: [PATCH 0/4] Rework alarmtimer " Dor Laor
2007-08-19 19:30                                   ` [Qemu-devel] Re: [PATCH 0/4] Rework alarm timer " Avi Kivity
2007-08-19 16:52             ` Luca
     [not found]               ` <68676e00708190952g7d4751c2g87a6ff71dd278f71-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2007-08-19 19:31                 ` Avi Kivity
     [not found]                   ` <46C89A8E.7040609-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-08-20 21:20                     ` Luca Tettamanti
     [not found]                       ` <20070820212058.GA6713-sTXFmx6KbOnUXq0IF5SVAZ4oGUkBHcCu@public.gmane.org>
2007-08-20 21:55                         ` [Qemu-devel] " malc
     [not found]                           ` <Pine.LNX.4.64.0708210140540.16421-KsBd/I2zj1m2ZGm1qqSgDg@public.gmane.org>
2007-08-20 22:49                             ` Luca
2007-08-21 12:09                         ` Avi Kivity
     [not found]                           ` <46CAD607.2080504-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-08-21 19:38                             ` Luca Tettamanti
     [not found]                               ` <20070821193834.GB13544-sTXFmx6KbOnUXq0IF5SVAZ4oGUkBHcCu@public.gmane.org>
2007-08-21 19:44                                 ` malc
2007-08-22  5:02                                 ` Avi Kivity
     [not found]                                   ` <46CBC34F.6060601-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-08-22 16:12                                     ` Luca Tettamanti
     [not found]                                       ` <20070822161211.GA30147-sTXFmx6KbOnUXq0IF5SVAZ4oGUkBHcCu@public.gmane.org>
2007-08-22 16:21                                         ` Avi Kivity
     [not found]                                           ` <46CC6285.3090904-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-08-22 16:38                                             ` Luca
     [not found]                                               ` <68676e00708220938y57c07edas705fc8360aefcb78-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2007-08-22 16:45                                                 ` Avi Kivity
     [not found]                                                   ` <46CC680C.1030307-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-08-22 17:23                                                     ` Luca
     [not found]                                                       ` <68676e00708221023m352c2de3y3b19188dbb9ef49e-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2007-08-22 17:39                                                         ` Luca
2007-08-22 19:21                                                         ` Luca
     [not found]                                                           ` <68676e00708221221n6f8fcd67m9d15f7fea663ec71-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2007-08-22 21:35                                                             ` Dor Laor
     [not found]                                                               ` <64F9B87B6B770947A9F8391472E032160D5042F3-yEcIvxbTEBqsx+V+t5oei8rau4O3wl8o3fe8/T/H7NteoWH0uzbU5w@public.gmane.org>
2007-08-22 22:07                                                                 ` Luca
2007-08-22 20:42                                                 ` Dan Kenigsberg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070817231406.717137712@gmail.com \
    --to=kronos.it-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
    --cc=kvm-devel-TtF/mJH4Jtrk1uMJSBkQmQ@public.gmane.org \
    --cc=qemu-devel-qX2TKyscuCcdnm+yROfE0A@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox