Daniel Veillard wrote:
On Thu, Jan 24, 2013 at 12:55:09PM -0700, Jim Fehlig wrote:
> Jim Fehlig wrote:
>
>> xen-unstable commit XXXX makes changes wrt modifying and deregistering
>> timeouts.
>>
>> First, timeout modify callbacks will only be invoked with an
>> abs_t of {0,0}, i.e. make the timeout fire immediately. Prior to this
>> commit, timeout modify callbacks were never invoked.
>>
>> Second, timeout deregister hooks will no longer be called.
>>
>> This patch makes changes in the libvirt libxl driver that should be
>> compatible before and after commit XXXX.
>>
>> While at it, fix a potential overflow in the timeout register callback.
>> ---
>>
>> 'commit XXXX' will be replaced with a proper commit id once committed
>> to xen-unstable.
>>
>>
> libxl patch as been committed to xen-unstable now, changeset 26469.
> I've updated this patch accordingly.
>
> Regards,
> Jim
>
>
>
> >From 451c84284fa1b4f311f2ceb052c8e9f25ffa0cf0 Mon Sep 17 00:00:00 2001
> From: Jim Fehlig <jfehlig(a)suse.com>
> Date: Mon, 21 Jan 2013 09:59:28 -0700
> Subject: [PATCH 1/6] libxl: Fix handling of timeouts
>
> xen-unstable changeset 26469 makes changes wrt modifying and deregistering
> timeouts.
>
> First, timeout modify callbacks will only be invoked with an
> abs_t of {0,0}, i.e. make the timeout fire immediately. Prior to this
> commit, timeout modify callbacks were never invoked.
>
> Second, timeout deregister hooks will no longer be called.
>
> This patch makes changes in the libvirt libxl driver that should be
> compatible before and after changeset 26469.
>
> While at it, fix a potential overflow in the timeout register callback.
> ---
> src/libxl/libxl_driver.c | 39 ++++++++++++++++++++++++++++++---------
> 1 file changed, 30 insertions(+), 9 deletions(-)
>
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index a8c4cae..77026fc 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -186,7 +186,13 @@ libxlTimerCallback(int timer ATTRIBUTE_UNUSED, void
*timer_info)
> {
> struct libxlOSEventHookTimerInfo *info = timer_info;
>
> + /* libxl expects the event to be deregistered when calling
> + libxl_osevent_occurred_timeout, but we dont want the event info
> + destroyed. Disable the timeout and only remove it after returning
> + from libxl. */
> + virEventUpdateTimeout(info->id, -1);
> libxl_osevent_occurred_timeout(info->priv->ctx, info->xl_priv);
> + virEventRemoveTimeout(info->id);
> }
>
> static void
> @@ -202,6 +208,8 @@ libxlTimeoutRegisterEventHook(void *priv,
> void *xl_priv)
> {
> struct timeval now;
> + struct timeval res;
> + static struct timeval zero;
> struct libxlOSEventHookTimerInfo *timer_info;
> int timeout, timer_id;
>
> @@ -211,8 +219,15 @@ libxlTimeoutRegisterEventHook(void *priv,
> }
>
> gettimeofday(&now, NULL);
> - timeout = (abs_t.tv_usec - now.tv_usec) / 1000;
> - timeout += (abs_t.tv_sec - now.tv_sec) * 1000;
> + timersub(&abs_t, &now, &res);
> + /* Ensure timeout is not overflowed */
> + if (timercmp(&res, &zero, <)) {
> + timeout = 0;
> + } else if (res.tv_sec > INT_MAX / 1000) {
> + timeout = INT_MAX;
> + } else {
> + timeout = res.tv_sec * 1000 + (res.tv_usec + 999) / 1000;
> + }
> timer_id = virEventAddTimeout(timeout, libxlTimerCallback,
> timer_info, libxlTimerInfoFree);
> if (timer_id < 0) {
> @@ -227,19 +242,25 @@ libxlTimeoutRegisterEventHook(void *priv,
> return 0;
> }
>
> +/*
> + * Note: There are two changes wrt timeouts starting with xen-unstable
> + * changeset 26469:
> + *
> + * 1. Timeout modify callbacks will only be invoked with an abs_t of {0,0},
> + * i.e. make the timeout fire immediately. Prior to this commit, timeout
> + * modify callbacks were never invoked.
> + *
> + * 2. Timeout deregister hooks will no longer be called.
> + */
> static int
> libxlTimeoutModifyEventHook(void *priv ATTRIBUTE_UNUSED,
> void **hndp,
> - struct timeval abs_t)
> + struct timeval abs_t ATTRIBUTE_UNUSED)
> {
> - struct timeval now;
> - int timeout;
> struct libxlOSEventHookTimerInfo *timer_info = *hndp;
>
> - gettimeofday(&now, NULL);
> - timeout = (abs_t.tv_usec - now.tv_usec) / 1000;
> - timeout += (abs_t.tv_sec - now.tv_sec) * 1000;
> - virEventUpdateTimeout(timer_info->id, timeout);
> + /* Make the timeout fire */
> + virEventUpdateTimeout(timer_info->id, 0);
> return 0;
> }
>
>
ACK, I assume you tested with the older libxl, right ?
Yes, but with limited success due to the issue described here
http://lists.xen.org/archives/html/xen-devel/2012-11/msg01016.html
With Ian Jackson's libxl fixes, I've been able to do several hundred
save/restore iterations. Without his libxl fixes, I'd be lucky to get
beyond 5 iterations.
http://lists.xen.org/archives/html/xen-devel/2013-01/msg01971.html
Those libxl fixes will be included in the xen 4.2 branch too, and will
be available in 4.2.2.
Thanks!
Jim