mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Tim Deegan <tim@xen.org>
Acked-by: Keir Fraser <keir@xen.org>
master commit: fd7bfce039
master date: 2014-03-13 14:27:51 +0100
This commit is contained in:
1 parent
21ff0c9141
commit
1c20a463f9
6 files changed
+26
-20
No files matched your search
+2
-2
@@ -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;
|
||||
|
||||
@@ -319,7 +319,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 )
|
||||
{
|
||||
@@ -348,6 +348,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() )
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -1674,7 +1674,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 )
|
||||
{
|
||||
@@ -1709,6 +1709,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() )
|
||||
|
||||
@@ -3608,13 +3608,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;
|
||||
@@ -3635,6 +3628,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;
|
||||
|
||||
@@ -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;
|
||||
|
||||