* [Qemu-devel] [PATCH v3] mc146818rtc: add rtc-reset-reinjection QMP command
@ 2014-06-24 21:55 Marcelo Tosatti
2014-06-24 23:22 ` Eric Blake
2014-06-25 8:08 ` Michael S. Tsirkin
0 siblings, 2 replies; 3+ messages in thread
From: Marcelo Tosatti @ 2014-06-24 21:55 UTC (permalink / raw)
To: Michael S. Tsirkin; +Cc: Paolo Bonzini, qemu-devel
It is necessary to reset RTC interrupt reinjection backlog if
guest time is synchronized via a different mechanism, such as
QGA's guest-set-time command.
Failing to do so causes both corrections to be applied (summed),
resulting in an incorrect guest time.
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c
index 1201f90..5bd8710 100644
--- a/hw/timer/mc146818rtc.c
+++ b/hw/timer/mc146818rtc.c
@@ -26,6 +26,7 @@
#include "sysemu/sysemu.h"
#include "hw/timer/mc146818rtc.h"
#include "qapi/visitor.h"
+#include "qmp-commands.h"
#ifdef TARGET_I386
#include "hw/i386/apic.h"
@@ -84,6 +85,7 @@ typedef struct RTCState {
Notifier clock_reset_notifier;
LostTickPolicy lost_tick_policy;
Notifier suspend_notifier;
+ QLIST_ENTRY(RTCState) link;
} RTCState;
static void rtc_set_time(RTCState *s);
@@ -522,6 +524,20 @@ static void rtc_get_time(RTCState *s, struct tm *tm)
rtc_from_bcd(s, s->cmos_data[RTC_CENTURY]) * 100 - 1900;
}
+static QLIST_HEAD(, RTCState) rtc_devices =
+ QLIST_HEAD_INITIALIZER(rtc_devices);
+
+#ifdef TARGET_I386
+void qmp_rtc_reset_reinjection(Error **errp)
+{
+ RTCState *s;
+
+ QLIST_FOREACH(s, &rtc_devices, link) {
+ s->irq_coalesced = 0;
+ }
+}
+#endif
+
static void rtc_set_time(RTCState *s)
{
struct tm tm;
@@ -910,6 +926,8 @@ ISADevice *rtc_init(ISABus *bus, int base_year, qemu_irq intercept_irq)
} else {
isa_init_irq(isadev, &s->irq, RTC_ISA_IRQ);
}
+ QLIST_INSERT_HEAD(&rtc_devices, s, link);
+
return isadev;
}
diff --git a/monitor.c b/monitor.c
index 2901187..51c9a1d 100644
--- a/monitor.c
+++ b/monitor.c
@@ -5475,3 +5475,12 @@ QemuOptsList qemu_mon_opts = {
{ /* end of list */ }
},
};
+
+#ifndef TARGET_I386
+void qmp_rtc_reset_reinjection(Error **errp)
+{
+ error_set(errp, QERR_COMMAND_NOT_FOUND, "rtc-reset-reinjection");
+ return;
+}
+#endif
+
diff --git a/qapi-schema.json b/qapi-schema.json
index dc2abe4..7e04d28 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -3080,3 +3080,15 @@
'btn' : 'InputBtnEvent',
'rel' : 'InputMoveEvent',
'abs' : 'InputMoveEvent' } }
+
+##
+# @rtc-reset-reinjection
+#
+# This command will reset the RTC interrupt reinjection backlog.
+# Can be used if another mechanism to synchronize guest time
+# is in effect, for example QEMU guest agent's guest-set-time
+# command.
+#
+# Since: 2.1
+##
+{ 'command': 'rtc-reset-reinjection' }
diff --git a/qmp-commands.hx b/qmp-commands.hx
index d6bb0f4..87ce94a 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -3574,3 +3574,26 @@ Example:
} } ] }
EQMP
+
+#if defined TARGET_I386
+ {
+ .name = "rtc-reset-reinjection",
+ .args_type = "",
+ .mhandler.cmd_new = qmp_marshal_input_rtc_reset_reinjection,
+ },
+#endif
+
+SQMP
+rtc-reset-reinjection
+---------------------
+
+Reset the RTC interrupt reinjection backlog.
+
+Arguments: None.
+
+Example:
+
+-> { "execute": "rtc-reset-reinjection" }
+<- { "return": {} }
+
+EQMP
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [Qemu-devel] [PATCH v3] mc146818rtc: add rtc-reset-reinjection QMP command
2014-06-24 21:55 [Qemu-devel] [PATCH v3] mc146818rtc: add rtc-reset-reinjection QMP command Marcelo Tosatti
@ 2014-06-24 23:22 ` Eric Blake
2014-06-25 8:08 ` Michael S. Tsirkin
1 sibling, 0 replies; 3+ messages in thread
From: Eric Blake @ 2014-06-24 23:22 UTC (permalink / raw)
To: Marcelo Tosatti, Michael S. Tsirkin; +Cc: Paolo Bonzini, qemu-devel
[-- Attachment #1: Type: text/plain, Size: 618 bytes --]
On 06/24/2014 03:55 PM, Marcelo Tosatti wrote:
>
> It is necessary to reset RTC interrupt reinjection backlog if
> guest time is synchronized via a different mechanism, such as
> QGA's guest-set-time command.
>
> Failing to do so causes both corrections to be applied (summed),
> resulting in an incorrect guest time.
>
> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
>
No --- separator? No mention what changed in v3 relative to v2?
Reviewed-by: Eric Blake <eblake@redhat.com>
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Qemu-devel] [PATCH v3] mc146818rtc: add rtc-reset-reinjection QMP command
2014-06-24 21:55 [Qemu-devel] [PATCH v3] mc146818rtc: add rtc-reset-reinjection QMP command Marcelo Tosatti
2014-06-24 23:22 ` Eric Blake
@ 2014-06-25 8:08 ` Michael S. Tsirkin
1 sibling, 0 replies; 3+ messages in thread
From: Michael S. Tsirkin @ 2014-06-25 8:08 UTC (permalink / raw)
To: Marcelo Tosatti; +Cc: Paolo Bonzini, qemu-devel
On Tue, Jun 24, 2014 at 06:55:11PM -0300, Marcelo Tosatti wrote:
>
> It is necessary to reset RTC interrupt reinjection backlog if
> guest time is synchronized via a different mechanism, such as
> QGA's guest-set-time command.
>
> Failing to do so causes both corrections to be applied (summed),
> resulting in an incorrect guest time.
>
> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Doesn't seem to apply :(
error: patch failed: hw/timer/mc146818rtc.c:26
error: hw/timer/mc146818rtc.c: patch does not apply
error: patch failed: monitor.c:5475
error: monitor.c: patch does not apply
error: patch failed: qapi-schema.json:3080
error: qapi-schema.json: patch does not apply
error: patch failed: qmp-commands.hx:3574
error: qmp-commands.hx: patch does not apply
> diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c
> index 1201f90..5bd8710 100644
> --- a/hw/timer/mc146818rtc.c
> +++ b/hw/timer/mc146818rtc.c
> @@ -26,6 +26,7 @@
> #include "sysemu/sysemu.h"
> #include "hw/timer/mc146818rtc.h"
> #include "qapi/visitor.h"
> +#include "qmp-commands.h"
>
> #ifdef TARGET_I386
> #include "hw/i386/apic.h"
> @@ -84,6 +85,7 @@ typedef struct RTCState {
> Notifier clock_reset_notifier;
> LostTickPolicy lost_tick_policy;
> Notifier suspend_notifier;
> + QLIST_ENTRY(RTCState) link;
> } RTCState;
>
> static void rtc_set_time(RTCState *s);
> @@ -522,6 +524,20 @@ static void rtc_get_time(RTCState *s, struct tm *tm)
> rtc_from_bcd(s, s->cmos_data[RTC_CENTURY]) * 100 - 1900;
> }
>
> +static QLIST_HEAD(, RTCState) rtc_devices =
> + QLIST_HEAD_INITIALIZER(rtc_devices);
> +
> +#ifdef TARGET_I386
> +void qmp_rtc_reset_reinjection(Error **errp)
> +{
> + RTCState *s;
> +
> + QLIST_FOREACH(s, &rtc_devices, link) {
> + s->irq_coalesced = 0;
> + }
> +}
> +#endif
> +
> static void rtc_set_time(RTCState *s)
> {
> struct tm tm;
> @@ -910,6 +926,8 @@ ISADevice *rtc_init(ISABus *bus, int base_year, qemu_irq intercept_irq)
> } else {
> isa_init_irq(isadev, &s->irq, RTC_ISA_IRQ);
> }
> + QLIST_INSERT_HEAD(&rtc_devices, s, link);
> +
> return isadev;
> }
>
> diff --git a/monitor.c b/monitor.c
> index 2901187..51c9a1d 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -5475,3 +5475,12 @@ QemuOptsList qemu_mon_opts = {
> { /* end of list */ }
> },
> };
> +
> +#ifndef TARGET_I386
> +void qmp_rtc_reset_reinjection(Error **errp)
> +{
> + error_set(errp, QERR_COMMAND_NOT_FOUND, "rtc-reset-reinjection");
Is there a way to get here on non 386?
If no let's do assert.
If yes, looks more like QERR_FEATURE_DISABLED to me.
> + return;
return not necessary.
> +}
> +#endif
> +
Adds whitespace at EOF.
> diff --git a/qapi-schema.json b/qapi-schema.json
> index dc2abe4..7e04d28 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -3080,3 +3080,15 @@
> 'btn' : 'InputBtnEvent',
> 'rel' : 'InputMoveEvent',
> 'abs' : 'InputMoveEvent' } }
> +
> +##
> +# @rtc-reset-reinjection
> +#
> +# This command will reset the RTC interrupt reinjection backlog.
> +# Can be used if another mechanism to synchronize guest time
> +# is in effect, for example QEMU guest agent's guest-set-time
> +# command.
> +#
> +# Since: 2.1
> +##
> +{ 'command': 'rtc-reset-reinjection' }
> diff --git a/qmp-commands.hx b/qmp-commands.hx
> index d6bb0f4..87ce94a 100644
> --- a/qmp-commands.hx
> +++ b/qmp-commands.hx
> @@ -3574,3 +3574,26 @@ Example:
> } } ] }
>
> EQMP
> +
> +#if defined TARGET_I386
> + {
> + .name = "rtc-reset-reinjection",
> + .args_type = "",
> + .mhandler.cmd_new = qmp_marshal_input_rtc_reset_reinjection,
> + },
> +#endif
> +
> +SQMP
> +rtc-reset-reinjection
> +---------------------
> +
> +Reset the RTC interrupt reinjection backlog.
> +
> +Arguments: None.
> +
> +Example:
> +
> +-> { "execute": "rtc-reset-reinjection" }
> +<- { "return": {} }
> +
> +EQMP
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2014-06-25 8:08 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-06-24 21:55 [Qemu-devel] [PATCH v3] mc146818rtc: add rtc-reset-reinjection QMP command Marcelo Tosatti
2014-06-24 23:22 ` Eric Blake
2014-06-25 8:08 ` Michael S. Tsirkin
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.