| Hi,
I'm still worried about the confliction between waking up a vcpu and
destroying the domain.
I'm not sure but the following modification seems to be necessary. 
It does the same thing as hvm_bringup_ap() in x86.
LOCK_BIGLOCK might be exaggerated but at least any lock is required. 
If two cpu execute IPI at the same time, vmx_final_setup_guest() can
be called simultaneously and that incurs memory leak.
diff -r 5176c3ea3293 xen/arch/ia64/vmx/mmio.c
--- a/xen/arch/ia64/vmx/mmio.c  Sun Oct 08 18:55:12 2006 -0600
+++ b/xen/arch/ia64/vmx/mmio.c  Thu Oct 12 14:33:59 2006 +0900
@@ -386,7 +386,13 @@ static void write_ipi (VCPU *vcpu, uint6
 
         memset (&c, 0, sizeof (c));
 
+       LOCK_BIGLOCK(d);
+       if (test_bit(_VCPUF_initialised, &targ->vcpu_flags)) {
+           UNLOCK_BIGLOCK(d);
+           goto initialized;
+       }
         if (arch_set_info_guest (targ, &c) != 0) {
+           UNLOCK_BIGLOCK(d);
             printf ("arch_boot_vcpu: failure\n");
             return;
         }
@@ -397,13 +403,18 @@ static void write_ipi (VCPU *vcpu, uint6
 
         if (test_and_clear_bit(_VCPUF_down,&targ->vcpu_flags)) {
             vcpu_wake(targ);
+           UNLOCK_BIGLOCK(d);
             printf ("arch_boot_vcpu: vcpu %d awaken %016lx!\n",
                     targ->vcpu_id, targ_regs->cr_iip);
         }
-        else
+        else {
+           UNLOCK_BIGLOCK(d);
             printf ("arch_boot_vcpu: huu, already awaken!");
-    }
-    else {
+       }
+       return;
+    }
+  initialized:
+    {
         int running = test_bit(_VCPUF_running,&targ->vcpu_flags);
         deliver_ipi (targ, ((ipi_d_t)value).dm, 
                     ((ipi_d_t)value).vector);
Thanks,
Kouya
Keir Fraser writes:
 > 
 > 
 > 
 > On 11/10/06 08:34, "Xu, Anthony" <anthony.xu@xxxxxxxxx> wrote:
 > 
 > > Keir,
 > > 
 > > When free_vcpu_struct() is called, is it guaranteed that this vcpu is 
 > > stopped
 > > completely?
 > 
 > Yes. domain_kill() calls domain_pause() which synchronously stops execution
 > of every VCPU. domain_kill() drops a 'master reference' on the domain, so
 > the destructors cannot run until domain_kill() has run.
 > 
 >  -- Keir
 > 
 > 
 > 
 > _______________________________________________
 > Xen-devel mailing list
 > Xen-devel@xxxxxxxxxxxxxxxxxxx
 > http://lists.xensource.com/xen-devel
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
 |