[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Fix preemption-check race in memory_op hypercall.
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID ec11c5cca195bd6a671a9813d4610d8847e01eee # Parent 7c2afbad0188ac64feb0f4122c7b262bc640c014 Fix preemption-check race in memory_op hypercall. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> diff -r 7c2afbad0188 -r ec11c5cca195 xen/common/memory.c --- a/xen/common/memory.c Fri Sep 2 16:51:55 2005 +++ b/xen/common/memory.c Fri Sep 2 17:02:08 2005 @@ -25,7 +25,8 @@ unsigned long *extent_list, unsigned int nr_extents, unsigned int extent_order, - unsigned int flags) + unsigned int flags, + int *preempted) { struct pfn_info *page; unsigned long i; @@ -43,7 +44,10 @@ for ( i = 0; i < nr_extents; i++ ) { if ( hypercall_preempt_check() ) - return i; + { + *preempted = 1; + return i; + } if ( unlikely((page = alloc_domheap_pages( d, extent_order, flags)) == NULL) ) @@ -67,7 +71,8 @@ unsigned long *extent_list, unsigned int nr_extents, unsigned int extent_order, - unsigned int flags) + unsigned int flags, + int *preempted) { struct pfn_info *page; unsigned long i, j, mpfn; @@ -78,7 +83,10 @@ for ( i = 0; i < nr_extents; i++ ) { if ( hypercall_preempt_check() ) - return i; + { + *preempted = 1; + return i; + } if ( unlikely(__get_user(mpfn, &extent_list[i]) != 0) ) return i; @@ -124,7 +132,7 @@ long do_memory_op(int cmd, void *arg) { struct domain *d; - int rc, start_extent, op, flags = 0; + int rc, start_extent, op, flags = 0, preempted = 0; struct xen_memory_reservation reservation; op = cmd & ((1 << START_EXTENT_SHIFT) - 1); @@ -165,19 +173,18 @@ reservation.extent_start, reservation.nr_extents, reservation.extent_order, - flags); + flags, + &preempted); if ( unlikely(reservation.domid != DOMID_SELF) ) put_domain(d); rc += start_extent; - if ( (rc != reservation.nr_extents) && hypercall_preempt_check() ) + if ( preempted ) return hypercall2_create_continuation( - __HYPERVISOR_memory_op, - op | (rc << START_EXTENT_SHIFT), - arg); - + __HYPERVISOR_memory_op, op | (rc << START_EXTENT_SHIFT), arg); + break; case XENMEM_maximum_ram_page: _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |