WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] linux/x86: fix long timeout handling in stop_hz_time

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] linux/x86: fix long timeout handling in stop_hz_timer()
From: "Jan Beulich" <JBeulich@xxxxxxxxxx>
Date: Thu, 18 Feb 2010 17:07:03 +0000
Delivery-date: Thu, 18 Feb 2010 09:07:50 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Other than for HYPERVISOR_set_timer_op, zero doesn't mean "no timeout"
for VCPUOP_set_singleshot_timer (but should be retained rather than
adjusted by NS_PER_TICK/2 for the former).

Also properly cancel the singleshot timer is start_hz_timer().

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>

--- a/arch/i386/kernel/time-xen.c
+++ b/arch/i386/kernel/time-xen.c
@@ -939,7 +939,10 @@ static void stop_hz_timer(void)
                j = jiffies + 1;
        }
 
-       singleshot.timeout_abs_ns = jiffies_to_st(j) + NS_PER_TICK/2;
+       singleshot.timeout_abs_ns = jiffies_to_st(j);
+       if (!singleshot.timeout_abs_ns)
+               return;
+       singleshot.timeout_abs_ns += NS_PER_TICK / 2;
        singleshot.flags = 0;
        rc = HYPERVISOR_vcpu_op(VCPUOP_set_singleshot_timer, cpu, &singleshot);
 #if CONFIG_XEN_COMPAT <= 0x030004
@@ -953,7 +956,17 @@ static void stop_hz_timer(void)
 
 static void start_hz_timer(void)
 {
-       cpu_clear(smp_processor_id(), nohz_cpu_mask);
+       unsigned int cpu = smp_processor_id();
+       int rc = HYPERVISOR_vcpu_op(VCPUOP_stop_singleshot_timer, cpu, NULL);
+
+#if CONFIG_XEN_COMPAT <= 0x030004
+       if (rc) {
+               BUG_ON(rc != -ENOSYS);
+               rc = HYPERVISOR_set_timer_op(0);
+       }
+#endif
+       BUG_ON(rc);
+       cpu_clear(cpu, nohz_cpu_mask);
 }
 
 void raw_safe_halt(void)




_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] linux/x86: fix long timeout handling in stop_hz_timer(), Jan Beulich <=