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

[Xen-ia64-devel] [PATCH] fix PAL_CACHE_FLUSH to be vcpu-migration-safe

To: xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-ia64-devel] [PATCH] fix PAL_CACHE_FLUSH to be vcpu-migration-safe
From: Kouya SHIMURA <kouya@xxxxxxxxxxxxxx>
Date: Thu, 15 Mar 2007 20:51:22 +0900
Delivery-date: Thu, 15 Mar 2007 04:50:47 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-ia64-devel-request@lists.xensource.com?subject=help>
List-id: Discussion of the ia64 port of Xen <xen-ia64-devel.lists.xensource.com>
List-post: <mailto:xen-ia64-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-ia64-devel-bounces@xxxxxxxxxxxxxxxxxxx
A vcpu might migrate after ia64_pal_cache_flush() before cpu_clear().
It causes cache incoherency.

Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>

diff -r a862200c572a xen/arch/ia64/xen/fw_emul.c
--- a/xen/arch/ia64/xen/fw_emul.c       Wed Mar 14 09:36:14 2007 -0600
+++ b/xen/arch/ia64/xen/fw_emul.c       Thu Mar 15 20:25:45 2007 +0900
@@ -475,6 +475,8 @@ xen_pal_emulator(unsigned long index, u6
        unsigned long r10 = 0;
        unsigned long r11 = 0;
        long status = PAL_STATUS_UNIMPLEMENTED;
+       unsigned long flags;
+       int processor;
 
        if (running_on_sim)
                return pal_emulator_static(index);
@@ -657,18 +659,20 @@ xen_pal_emulator(unsigned long index, u6
                 * Clear psr.ic when call PAL_CACHE_FLUSH
                 */
                r10 = in3;
+               local_irq_save(flags);
+               processor = current->processor;
                status = ia64_pal_cache_flush(in1, in2, &r10, &r9);
+               local_irq_restore(flags);
 
                if (status != 0)
                        panic_domain(NULL, "PAL_CACHE_FLUSH ERROR, "
                                     "status %lx", status);
 
                if (in1 == PAL_CACHE_TYPE_COHERENT) {
-                       int cpu = current->processor;
                        cpus_setall(current->arch.cache_coherent_map);
-                       cpu_clear(cpu, current->arch.cache_coherent_map);
+                       cpu_clear(processor, current->arch.cache_coherent_map);
                        cpus_setall(cpu_cache_coherent_map);
-                       cpu_clear(cpu, cpu_cache_coherent_map);
+                       cpu_clear(processor, cpu_cache_coherent_map);
                }
                break;
            case PAL_PERF_MON_INFO:
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
<Prev in Thread] Current Thread [Next in Thread>