[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 1/1] Introduce VCPUOP_reset_vcpu_info
From: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> When an SMP guest performs kexec/kdump it tries issuing VCPUOP_register_vcpu_info. This fails due to vcpu_info already being registered. Introduce new vcpu operation to reset vcpu_info to its default state. Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> Signed-off-by: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx> --- xen/arch/x86/hvm/hvm.c | 1 + xen/common/domain.c | 22 +++++++++++++++++++--- xen/include/public/vcpu.h | 6 ++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 216c3f2..7917272 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -3332,6 +3332,7 @@ static long hvm_vcpu_op( case VCPUOP_set_singleshot_timer: case VCPUOP_stop_singleshot_timer: case VCPUOP_register_vcpu_info: + case VCPUOP_reset_vcpu_info: case VCPUOP_register_vcpu_time_memory_area: rc = do_vcpu_op(cmd, vcpuid, arg); break; diff --git a/xen/common/domain.c b/xen/common/domain.c index ac444ba..024f366 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -961,9 +961,9 @@ int map_vcpu_info(struct vcpu *v, unsigned long gfn, unsigned offset) } /* - * Unmap the vcpu info page if the guest decided to place it somewhere - * else. This is only used from arch_domain_destroy, so there's no - * need to do anything clever. + * Unmap the vcpu info page if the guest decided to place it somewhere else. + * This is used from arch_domain_destroy and from VCPUOP_reset_vcpu_info + * handler. */ void unmap_vcpu_info(struct vcpu *v) { @@ -1121,6 +1121,22 @@ long do_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg) break; } + case VCPUOP_reset_vcpu_info: + { + struct domain *d = v->domain; + + if ( !test_bit(_VPF_down, &v->pause_flags) ) + return -EFAULT; + + domain_lock(d); + unmap_vcpu_info(v); + if ( vcpuid < XEN_LEGACY_MAX_VCPUS ) + v->vcpu_info = (vcpu_info_t *)&shared_info(d, vcpu_info[vcpuid]); + domain_unlock(d); + rc = 0; + break; + } + case VCPUOP_register_runstate_memory_area: { struct vcpu_register_runstate_memory_area area; diff --git a/xen/include/public/vcpu.h b/xen/include/public/vcpu.h index e888daf..c0283bc 100644 --- a/xen/include/public/vcpu.h +++ b/xen/include/public/vcpu.h @@ -227,6 +227,12 @@ struct vcpu_register_time_memory_area { typedef struct vcpu_register_time_memory_area vcpu_register_time_memory_area_t; DEFINE_XEN_GUEST_HANDLE(vcpu_register_time_memory_area_t); +/* + * Reset all of the vcpu_info information from their previous location + * to the default one used at bootup. + */ +#define VCPUOP_reset_vcpu_info 14 + #endif /* __XEN_PUBLIC_VCPU_H__ */ /* -- 1.9.3 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |