[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] common: make hypercall preemption checks consistent
commit 8c0eed2cc8d8a2ccccdffe4c386b625b672dc12a Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Thu Mar 13 14:26:35 2014 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Thu Mar 13 14:26:35 2014 +0100 common: make hypercall preemption checks consistent - never preempt on the first iteration (ensure forward progress) - do cheap checks first 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/common/memory.c | 9 +++++---- xen/common/multicall.c | 2 +- xen/drivers/char/console.c | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/xen/common/memory.c b/xen/common/memory.c index 9d0d32e..4d6ffee 100644 --- a/xen/common/memory.c +++ b/xen/common/memory.c @@ -63,7 +63,7 @@ static void increase_reservation(struct memop_args *a) for ( i = a->nr_done; i < a->nr_extents; i++ ) { - if ( hypercall_preempt_check() ) + if ( i != a->nr_done && hypercall_preempt_check() ) { a->preempted = 1; goto out; @@ -109,7 +109,7 @@ static void populate_physmap(struct memop_args *a) for ( i = a->nr_done; i < a->nr_extents; i++ ) { - if ( hypercall_preempt_check() ) + if ( i != a->nr_done && hypercall_preempt_check() ) { a->preempted = 1; goto out; @@ -268,7 +268,7 @@ static void decrease_reservation(struct memop_args *a) for ( i = a->nr_done; i < a->nr_extents; i++ ) { - if ( hypercall_preempt_check() && i != a->nr_done ) + if ( i != a->nr_done && hypercall_preempt_check() ) { a->preempted = 1; goto out; @@ -398,7 +398,8 @@ static long memory_exchange(XEN_GUEST_HANDLE_PARAM(xen_memory_exchange_t) arg) i < (exch.in.nr_extents >> in_chunk_order); i++ ) { - if ( hypercall_preempt_check() ) + if ( i != (exch.nr_exchanged >> in_chunk_order) && + hypercall_preempt_check() ) { exch.nr_exchanged = i << in_chunk_order; rcu_unlock_domain(d); diff --git a/xen/common/multicall.c b/xen/common/multicall.c index 2afba98..e66c798 100644 --- a/xen/common/multicall.c +++ b/xen/common/multicall.c @@ -52,7 +52,7 @@ do_multicall( for ( i = 0; !rc && i < nr_calls; i++ ) { - if ( hypercall_preempt_check() ) + if ( i && hypercall_preempt_check() ) goto preempted; if ( unlikely(__copy_from_guest(&mcs->call, call_list, 1)) ) diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index 7d4383c..beda79f 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -375,12 +375,12 @@ static DECLARE_SOFTIRQ_TASKLET(notify_dom0_con_ring_tasklet, static long guest_console_write(XEN_GUEST_HANDLE_PARAM(char) buffer, int count) { char kbuf[128]; - int kcount; + int kcount = 0; struct domain *cd = current->domain; while ( count > 0 ) { - if ( hypercall_preempt_check() ) + if ( kcount && hypercall_preempt_check() ) return hypercall_create_continuation( __HYPERVISOR_console_io, "iih", CONSOLEIO_write, count, buffer); -- 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 |