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-ppc-devel

[XenPPC] [xenppc-unstable] [XEN][POWERPC] Fix IPI stall timeout without

To: xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
Subject: [XenPPC] [xenppc-unstable] [XEN][POWERPC] Fix IPI stall timeout without using timebase_freq
From: Xen patchbot-xenppc-unstable <patchbot-xenppc-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 29 Nov 2006 00:10:34 +0000
Delivery-date: Tue, 28 Nov 2006 16:13:27 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-ppc-devel-request@lists.xensource.com?subject=help>
List-id: Xen PPC development <xen-ppc-devel.lists.xensource.com>
List-post: <mailto:xen-ppc-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-ppc-devel-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
# Node ID 2e909d6f2ab767fe5723a97e2f5413f876167296
# Parent  e01e08ca629b4f154828b0976a58df8767558aec
[XEN][POWERPC] Fix IPI stall timeout without using timebase_freq

When using the register dump feature of Xen, one will sometimes see a
message about an IPI finish stall.  This is because of an int to long
comparison bug, so fix it by doing proper nanosecond based time
accounting with no explicit reference to timebase_freq.

Signed-off-by: Amos Waterland <apw@xxxxxxxxxx>
Signed-off-by: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
---
 xen/arch/powerpc/smp.c |   39 +++++++++++++++++++++++++--------------
 1 files changed, 25 insertions(+), 14 deletions(-)

diff -r e01e08ca629b -r 2e909d6f2ab7 xen/arch/powerpc/smp.c
--- a/xen/arch/powerpc/smp.c    Tue Nov 28 17:01:00 2006 -0500
+++ b/xen/arch/powerpc/smp.c    Tue Nov 28 18:46:13 2006 -0500
@@ -90,7 +90,8 @@ int on_selected_cpus(
     int retry,
     int wait)
 {
-    int t, retval = 0, nr_cpus = cpus_weight(selected);
+    int retval = 0, nr_cpus = cpus_weight(selected);
+    unsigned long start, stall = SECONDS(1);
 
     spin_lock(&call_lock);
 
@@ -104,19 +105,21 @@ int on_selected_cpus(
     send_IPI_mask(selected, CALL_FUNCTION_VECTOR);
 
     /* We always wait for an initiation ACK from remote CPU.  */
-    for (t = 0; atomic_read(&call_data.started) != nr_cpus; t++) {
-        if (t && t % timebase_freq == 0) {
+    for (start = NOW(); atomic_read(&call_data.started) != nr_cpus; ) {
+        if (NOW() > start + stall) {
             printk("IPI start stall: %d ACKS to %d SYNS\n", 
                    atomic_read(&call_data.started), nr_cpus);
+           start = NOW();
         }
     }
 
     /* If told to, we wait for a completion ACK from remote CPU.  */
     if (wait) {
-        for (t = 0; atomic_read(&call_data.finished) != nr_cpus; t++) {
-            if (t > timebase_freq && t % timebase_freq == 0) {
+        for (start = NOW(); atomic_read(&call_data.finished) != nr_cpus; ) {
+            if (NOW() > start + stall) {
                 printk("IPI finish stall: %d ACKS to %d SYNS\n", 
                        atomic_read(&call_data.finished), nr_cpus);
+                start = NOW();
             }
         }
     }
@@ -168,6 +171,11 @@ void smp_message_recv(int msg, struct cp
 #ifdef DEBUG_IPI
 static void debug_ipi_ack(void *info)
 {
+    if (info) {
+       unsigned long start, stall = SECONDS(5);
+       for (start = NOW(); NOW() < start + stall; );
+       printk("IPI recv on cpu #%d: %s\n", smp_processor_id(), (char *)info);
+    }
     return;
 }
 
@@ -175,12 +183,12 @@ void ipi_torture_test(void)
 {
     int cpu;
     unsigned long before, after, delta;
-    unsigned long min = ~0, max = 0, mean = 0, sum = 0, tick = 0;
+    unsigned long min = ~0, max = 0, mean = 0, sum = 0, trials = 0;
     cpumask_t mask;
 
     cpus_clear(mask);
 
-    while (tick < 1000000) {
+    while (trials < 1000000) {
         for_each_online_cpu(cpu) {
             cpu_set(cpu, mask);
             before = mftb();
@@ -192,12 +200,15 @@ void ipi_torture_test(void)
             if (delta > max) max = delta;
             if (delta < min) min = delta;
             sum += delta;
-            tick++;
-        }
-    }
-
-    mean = sum / tick;
-
-    printk("IPI tb ticks: min = %ld max = %ld mean = %ld\n", min, max, mean);
+            trials++;
+        }
+    }
+
+    mean = tb_to_ns(sum / trials);
+
+    printk("IPI latency: min = %ld ticks, max = %ld ticks, mean = %ldns\n",
+          min, max, mean);
+
+    smp_call_function(debug_ipi_ack, "Hi", 0, 1);
 }
 #endif

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

<Prev in Thread] Current Thread [Next in Thread>
  • [XenPPC] [xenppc-unstable] [XEN][POWERPC] Fix IPI stall timeout without using timebase_freq, Xen patchbot-xenppc-unstable <=