[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-ia64-devel] [PATCH] fix deadlock of ptc.ga emulation



Sorry, my previous patch implies a bug.

ptc_ga_remote_func() might be invoked by IPI with a schedule_lock
that is acquired. (e.g., inside of vcpu_migrate())
It will cause a deadlock.

-- Kouya

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

diff -r 94cce9a51540 xen/arch/ia64/vmx/vmmu.c
--- a/xen/arch/ia64/vmx/vmmu.c  Mon May 14 12:54:26 2007 -0600
+++ b/xen/arch/ia64/vmx/vmmu.c  Wed May 16 15:49:33 2007 +0900
@@ -567,13 +567,16 @@ static void ptc_ga_remote_func (void *va
     struct ptc_ga_args *args = (struct ptc_ga_args *)varg;
     VCPU *v = args->vcpu;
     vadr = args->vadr;
+    int cpu = v->processor;
 
     /* Try again if VCPU has migrated. */
-    if (v->processor != current->processor)
+    if (cpu != current->processor)
         return;
-    vcpu_schedule_lock_irqsave(v, flags);
-    if (v->processor != current->processor)
-        goto bail;
+    local_irq_save(flags);
+    if (!spin_trylock(&per_cpu(schedule_data, cpu).schedule_lock))
+        goto bail2;
+    if (v->processor != cpu)
+        goto bail1;
     oldrid = VMX(v, vrr[0]);
     VMX(v, vrr[0]) = args->rid;
     oldpsbits = VMX(v, psbits[0]);
@@ -591,8 +594,10 @@ static void ptc_ga_remote_func (void *va
     ia64_set_pta(mpta);
     ia64_dv_serialize_data();
     args->vcpu = NULL;
-bail:
-    vcpu_schedule_unlock_irqrestore(v, flags);
+  bail1:
+    spin_unlock(&per_cpu(schedule_data, cpu).schedule_lock);
+  bail2:
+    local_irq_restore(flags);
 }
 
 
@@ -602,7 +607,7 @@ IA64FAULT vmx_vcpu_ptc_ga(VCPU *vcpu, u6
     struct domain *d = vcpu->domain;
     struct vcpu *v;
     struct ptc_ga_args args;
-    int proc;
+    int cpu;
 
     args.vadr = va;
     vcpu_get_rr(vcpu, va, &args.rid);
@@ -618,13 +623,15 @@ IA64FAULT vmx_vcpu_ptc_ga(VCPU *vcpu, u6
 
         args.vcpu = v;
         do {
-            proc = v->processor;
-            if (proc != vcpu->processor)
+            cpu = v->processor;
+            if (cpu != current->processor) {
+                spin_unlock_wait(&per_cpu(schedule_data, cpu).schedule_lock);
                 /* Flush VHPT on remote processors. */
-                smp_call_function_single(proc, &ptc_ga_remote_func,
+                smp_call_function_single(cpu, &ptc_ga_remote_func,
                                          &args, 0, 1);
-            else
+            } else {
                 ptc_ga_remote_func(&args);
+            }
         } while (args.vcpu != NULL);
     }
     return IA64_NO_FAULT;
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.