This replaces the previous fix to multicall state tracking so that now the
multicall-
in-progress status is maintained on a per-VCPU basis (all other state remains
per physical CPU). This seems cleaner than the previous hack requiring clearing
of the flags in domain_crash_synchronous().
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
Index: 2006-12-11/xen/arch/ia64/xen/hypercall.c
===================================================================
--- 2006-12-11.orig/xen/arch/ia64/xen/hypercall.c 2006-12-11
15:09:57.000000000 +0100
+++ 2006-12-11/xen/arch/ia64/xen/hypercall.c 2006-12-11 15:15:20.000000000
+0100
@@ -320,7 +320,7 @@ unsigned long hypercall_create_continuat
va_list args;
va_start(args, format);
- if ( test_bit(_MCSF_in_multicall, &mcs->flags) ) {
+ if ( test_bit(_VCPUF_in_multicall, &v->vcpu_flags) ) {
panic("PREEMPT happen in multicall\n"); // Not support yet
} else {
vcpu_set_gr(v, 2, op, 0);
Index: 2006-12-11/xen/arch/x86/domain.c
===================================================================
--- 2006-12-11.orig/xen/arch/x86/domain.c 2006-12-11 15:09:57.000000000
+0100
+++ 2006-12-11/xen/arch/x86/domain.c 2006-12-11 15:15:20.000000000 +0100
@@ -811,7 +811,7 @@ unsigned long hypercall_create_continuat
va_start(args, format);
- if ( test_bit(_MCSF_in_multicall, &mcs->flags) )
+ if ( test_bit(_VCPUF_in_multicall, ¤t->vcpu_flags) )
{
__set_bit(_MCSF_call_preempted, &mcs->flags);
Index: 2006-12-11/xen/common/domain.c
===================================================================
--- 2006-12-11.orig/xen/common/domain.c 2006-12-04 08:49:58.000000000 +0100
+++ 2006-12-11/xen/common/domain.c 2006-12-11 15:15:20.000000000 +0100
@@ -22,7 +22,6 @@
#include <xen/delay.h>
#include <xen/shutdown.h>
#include <xen/percpu.h>
-#include <xen/multicall.h>
#include <asm/debugger.h>
#include <public/sched.h>
#include <public/vcpu.h>
@@ -258,19 +257,6 @@ void __domain_crash_synchronous(void)
{
__domain_crash(current->domain);
- /*
- * Flush multicall state before dying if a multicall is in progress.
- * This shouldn't be necessary, but some architectures are calling
- * domain_crash_synchronous() when they really shouldn't (i.e., from
- * within hypercall context).
- */
- if ( this_cpu(mc_state).flags != 0 )
- {
- dprintk(XENLOG_ERR,
- "FIXME: synchronous domain crash during a multicall!\n");
- this_cpu(mc_state).flags = 0;
- }
-
for ( ; ; )
do_softirq();
}
Index: 2006-12-11/xen/common/multicall.c
===================================================================
--- 2006-12-11.orig/xen/common/multicall.c 2006-10-30 12:07:22.000000000
+0100
+++ 2006-12-11/xen/common/multicall.c 2006-12-11 15:15:20.000000000 +0100
@@ -19,10 +19,11 @@ long
do_multicall(
XEN_GUEST_HANDLE(multicall_entry_t) call_list, unsigned int nr_calls)
{
+ struct vcpu *v = current;
struct mc_state *mcs = &this_cpu(mc_state);
unsigned int i;
- if ( unlikely(__test_and_set_bit(_MCSF_in_multicall, &mcs->flags)) )
+ if ( unlikely(test_and_set_bit(_VCPUF_in_multicall, &v->vcpu_flags)) )
{
gdprintk(XENLOG_INFO, "Multicall reentry is disallowed.\n");
return -EINVAL;
@@ -66,14 +67,17 @@ do_multicall(
guest_handle_add_offset(call_list, 1);
}
+ clear_bit(_VCPUF_in_multicall, &v->vcpu_flags);
mcs->flags = 0;
return 0;
fault:
+ clear_bit(_VCPUF_in_multicall, &v->vcpu_flags);
mcs->flags = 0;
return -EFAULT;
preempted:
+ clear_bit(_VCPUF_in_multicall, &v->vcpu_flags);
mcs->flags = 0;
return hypercall_create_continuation(
__HYPERVISOR_multicall, "hi", call_list, nr_calls-i);
Index: 2006-12-11/xen/include/xen/multicall.h
===================================================================
--- 2006-12-11.orig/xen/include/xen/multicall.h 2006-08-14 14:44:40.000000000
+0200
+++ 2006-12-11/xen/include/xen/multicall.h 2006-12-11 15:15:20.000000000
+0100
@@ -8,9 +8,7 @@
#include <xen/percpu.h>
#include <asm/multicall.h>
-#define _MCSF_in_multicall 0
-#define _MCSF_call_preempted 1
-#define MCSF_in_multicall (1<<_MCSF_in_multicall)
+#define _MCSF_call_preempted 0
#define MCSF_call_preempted (1<<_MCSF_call_preempted)
struct mc_state {
unsigned long flags;
Index: 2006-12-11/xen/include/xen/sched.h
===================================================================
--- 2006-12-11.orig/xen/include/xen/sched.h 2006-11-16 14:06:41.000000000
+0100
+++ 2006-12-11/xen/include/xen/sched.h 2006-12-11 15:15:20.000000000 +0100
@@ -399,6 +399,8 @@ extern struct domain *domain_list;
/* VCPU affinity has changed: migrating to a new CPU. */
#define _VCPUF_migrating 13
#define VCPUF_migrating (1UL<<_VCPUF_migrating)
+#define _VCPUF_in_multicall 14
+#define VCPUF_in_multicall (1UL<<_VCPUF_in_multicall)
/*
* Per-domain flags (domain_flags).
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|