[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 3/4] xen: implement SCHEDOP_soft_reset
Reset event channels, replace grant pages with empty ones, unmount previously mounted vcpu_info. Signed-off-by: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx> --- xen/common/domain.c | 37 +++++++++++++++++++++++++++++++++---- xen/common/schedule.c | 4 ++++ xen/include/public/sched.h | 7 +++++++ xen/include/xen/domain.h | 2 ++ 4 files changed, 46 insertions(+), 4 deletions(-) diff --git a/xen/common/domain.c b/xen/common/domain.c index 6803c4d..44e532b 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -1116,12 +1116,12 @@ 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. + * else. */ void unmap_vcpu_info(struct vcpu *v) { unsigned long mfn; + struct domain *d = v->domain; if ( v->vcpu_info_mfn == INVALID_MFN ) return; @@ -1129,8 +1129,9 @@ void unmap_vcpu_info(struct vcpu *v) mfn = v->vcpu_info_mfn; unmap_domain_page_global((void *) ((unsigned long)v->vcpu_info & PAGE_MASK)); - - v->vcpu_info = &dummy_vcpu_info; + v->vcpu_info = ((v->vcpu_id < XEN_LEGACY_MAX_VCPUS) + ? (vcpu_info_t *)&shared_info(d, vcpu_info[v->vcpu_id]) + : &dummy_vcpu_info); v->vcpu_info_mfn = INVALID_MFN; put_page_and_type(mfn_to_page(mfn)); @@ -1446,6 +1447,34 @@ int continue_hypercall_on_cpu( return 0; } +int domain_soft_reset(struct domain *d) +{ + struct vcpu *v; + int ret = 0; + + for_each_vcpu ( d, v ) + { + if ( v != current ) + vcpu_pause(v); + } + + evtchn_reset(d, 1); + + ret = grant_table_soft_reset(d); + if ( ret ) + goto vcpu_unpause; + + for_each_vcpu ( d, v ) + unmap_vcpu_info(v); + + vcpu_unpause: + for_each_vcpu ( d, v ) + if ( v != current ) + vcpu_unpause(v); + + return ret; +} + /* * Local variables: * mode: C diff --git a/xen/common/schedule.c b/xen/common/schedule.c index f5a2e55..a76de60 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -1030,6 +1030,10 @@ ret_t do_sched_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) break; } + case SCHEDOP_soft_reset: + ret = domain_soft_reset(current->domain); + break; + default: ret = -ENOSYS; } diff --git a/xen/include/public/sched.h b/xen/include/public/sched.h index 4000ac9..2fa65f3 100644 --- a/xen/include/public/sched.h +++ b/xen/include/public/sched.h @@ -118,6 +118,13 @@ * With id != 0 and timeout != 0, poke watchdog timer and set new timeout. */ #define SCHEDOP_watchdog 6 + +/* + * Do soft reset. + */ + +#define SCHEDOP_soft_reset 7 + /* ` } */ struct sched_shutdown { diff --git a/xen/include/xen/domain.h b/xen/include/xen/domain.h index 848db8a..57f8ddd 100644 --- a/xen/include/xen/domain.h +++ b/xen/include/xen/domain.h @@ -78,6 +78,8 @@ void arch_dump_domain_info(struct domain *d); int arch_vcpu_reset(struct vcpu *); +int domain_soft_reset(struct domain *d); + extern spinlock_t vcpu_alloc_lock; bool_t domctl_lock_acquire(void); void domctl_lock_release(void); -- 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 |