[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86: make hypercall preemption checks consistent
commit fd7bfce0395ace266159760e35dc49f7af3b90ce Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Thu Mar 13 14:27:51 2014 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Thu Mar 13 14:27:51 2014 +0100 x86: make hypercall preemption checks consistent - never preempt on the first iteration (ensure forward progress) - never preempt on the last iteration (pointless/wasteful) Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Reviewed-by: Tim Deegan <tim@xxxxxxx> Acked-by: Keir Fraser <keir@xxxxxxx> --- xen/arch/x86/mm.c | 4 ++-- xen/arch/x86/mm/hap/hap.c | 4 +++- xen/arch/x86/mm/p2m-pod.c | 6 ++++-- xen/arch/x86/mm/shadow/common.c | 4 +++- xen/arch/x86/traps.c | 14 +++++++------- xen/arch/x86/x86_64/compat/traps.c | 14 +++++++------- 6 files changed, 26 insertions(+), 20 deletions(-) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 172c68c..fdc5ed3 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -2934,7 +2934,7 @@ long do_mmuext_op( for ( i = 0; i < count; i++ ) { - if ( curr->arch.old_guest_table || hypercall_preempt_check() ) + if ( curr->arch.old_guest_table || (i && hypercall_preempt_check()) ) { rc = -EAGAIN; break; @@ -3481,7 +3481,7 @@ long do_mmu_update( for ( i = 0; i < count; i++ ) { - if ( curr->arch.old_guest_table || hypercall_preempt_check() ) + if ( curr->arch.old_guest_table || (i && hypercall_preempt_check()) ) { rc = -EAGAIN; break; diff --git a/xen/arch/x86/mm/hap/hap.c b/xen/arch/x86/mm/hap/hap.c index 5f75636..b8c5422 100644 --- a/xen/arch/x86/mm/hap/hap.c +++ b/xen/arch/x86/mm/hap/hap.c @@ -326,7 +326,7 @@ hap_set_allocation(struct domain *d, unsigned int pages, int *preempted) else pages -= d->arch.paging.hap.p2m_pages; - while ( d->arch.paging.hap.total_pages != pages ) + for ( ; ; ) { if ( d->arch.paging.hap.total_pages < pages ) { @@ -355,6 +355,8 @@ hap_set_allocation(struct domain *d, unsigned int pages, int *preempted) d->arch.paging.hap.total_pages--; free_domheap_page(pg); } + else + break; /* Check to see if we need to yield and try again */ if ( preempted && hypercall_preempt_check() ) diff --git a/xen/arch/x86/mm/p2m-pod.c b/xen/arch/x86/mm/p2m-pod.c index 81645c4..d14565d 100644 --- a/xen/arch/x86/mm/p2m-pod.c +++ b/xen/arch/x86/mm/p2m-pod.c @@ -242,7 +242,8 @@ p2m_pod_set_cache_target(struct p2m_domain *p2m, unsigned long pod_target, int p p2m_pod_cache_add(p2m, page, order); - if ( hypercall_preempt_check() && preemptible ) + if ( preemptible && pod_target != p2m->pod.count && + hypercall_preempt_check() ) { ret = -EAGAIN; goto out; @@ -286,7 +287,8 @@ p2m_pod_set_cache_target(struct p2m_domain *p2m, unsigned long pod_target, int p put_page(page+i); - if ( hypercall_preempt_check() && preemptible ) + if ( preemptible && pod_target != p2m->pod.count && + hypercall_preempt_check() ) { ret = -EAGAIN; goto out; diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c index 6eb781e..517b5f1 100644 --- a/xen/arch/x86/mm/shadow/common.c +++ b/xen/arch/x86/mm/shadow/common.c @@ -1672,7 +1672,7 @@ static unsigned int sh_set_allocation(struct domain *d, SHADOW_PRINTK("current %i target %i\n", d->arch.paging.shadow.total_pages, pages); - while ( d->arch.paging.shadow.total_pages != pages ) + for ( ; ; ) { if ( d->arch.paging.shadow.total_pages < pages ) { @@ -1707,6 +1707,8 @@ static unsigned int sh_set_allocation(struct domain *d, d->arch.paging.shadow.total_pages--; free_domheap_page(sp); } + else + break; /* Check to see if we need to yield and try again */ if ( preempted && hypercall_preempt_check() ) diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index c462317..ed4ae2d 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -3596,13 +3596,6 @@ long do_set_trap_table(XEN_GUEST_HANDLE_PARAM(const_trap_info_t) traps) for ( ; ; ) { - if ( hypercall_preempt_check() ) - { - rc = hypercall_create_continuation( - __HYPERVISOR_set_trap_table, "h", traps); - break; - } - if ( copy_from_guest(&cur, traps, 1) ) { rc = -EFAULT; @@ -3623,6 +3616,13 @@ long do_set_trap_table(XEN_GUEST_HANDLE_PARAM(const_trap_info_t) traps) init_int80_direct_trap(curr); guest_handle_add_offset(traps, 1); + + if ( hypercall_preempt_check() ) + { + rc = hypercall_create_continuation( + __HYPERVISOR_set_trap_table, "h", traps); + break; + } } return rc; diff --git a/xen/arch/x86/x86_64/compat/traps.c b/xen/arch/x86/x86_64/compat/traps.c index 21a82b9..5f0ea0a 100644 --- a/xen/arch/x86/x86_64/compat/traps.c +++ b/xen/arch/x86/x86_64/compat/traps.c @@ -329,13 +329,6 @@ int compat_set_trap_table(XEN_GUEST_HANDLE(trap_info_compat_t) traps) for ( ; ; ) { - if ( hypercall_preempt_check() ) - { - rc = hypercall_create_continuation( - __HYPERVISOR_set_trap_table, "h", traps); - break; - } - if ( copy_from_guest(&cur, traps, 1) ) { rc = -EFAULT; @@ -353,6 +346,13 @@ int compat_set_trap_table(XEN_GUEST_HANDLE(trap_info_compat_t) traps) init_int80_direct_trap(current); guest_handle_add_offset(traps, 1); + + if ( hypercall_preempt_check() ) + { + rc = hypercall_create_continuation( + __HYPERVISOR_set_trap_table, "h", traps); + break; + } } return rc; -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |