qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 3/3] Fix time drift problem under high load when RTC


From: Gleb Natapov
Subject: [Qemu-devel] [PATCH 3/3] Fix time drift problem under high load when RTC is in use.
Date: Wed, 29 Oct 2008 17:22:52 +0200
User-agent: StGIT/0.14.2

Count the number of interrupts that was lost due to interrupt coalescing
and re-inject them back when possible. This fixes time drift problem when
RTC is used as a time source.

Signed-off-by: Gleb Natapov <address@hidden>
---

 hw/mc146818rtc.c |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
index 30bb044..505e117 100644
--- a/hw/mc146818rtc.c
+++ b/hw/mc146818rtc.c
@@ -66,6 +66,7 @@ struct RTCState {
     int64_t next_periodic_time;
     /* second update */
     int64_t next_second_time;
+    uint32_t irq_coalesced;
     QEMUTimer *second_timer;
     QEMUTimer *second_timer2;
 };
@@ -101,7 +102,8 @@ static void rtc_periodic_timer(void *opaque)
 
     rtc_timer_update(s, s->next_periodic_time);
     s->cmos_data[RTC_REG_C] |= 0xc0;
-    qemu_irq_raise(s->irq);
+    if(!qemu_irq_raise(s->irq))
+        s->irq_coalesced++;
 }
 
 static void cmos_ioport_write(void *opaque, uint32_t addr, uint32_t data)
@@ -360,7 +362,12 @@ static uint32_t cmos_ioport_read(void *opaque, uint32_t 
addr)
         case RTC_REG_C:
             ret = s->cmos_data[s->cmos_index];
             qemu_irq_lower(s->irq);
-            s->cmos_data[RTC_REG_C] = 0x00;
+            if(!s->irq_coalesced) {
+                s->cmos_data[RTC_REG_C] = 0x00;
+            } else {
+                if(qemu_irq_raise(s->irq))
+                    s->irq_coalesced--;
+            }
             break;
         default:
             ret = s->cmos_data[s->cmos_index];





reply via email to

[Prev in Thread] Current Thread [Next in Thread]