From: Juergen Gross Date: Fri, 2 Oct 2015 11:44:59 +0000 (+0200) Subject: use masking operation instead of test_bit for MCSF bits X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~2450 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=90f2e2a307fc6a6258c39cc87b3b2bf9441c0fa7;p=xen.git use masking operation instead of test_bit for MCSF bits Use a bit mask for testing of a set bit instead of test_bit in case no atomic operation is needed, as this will lead to smaller and more effective code. Signed-off-by: Juergen Gross Reviewed-by: Jan Beulich Reviewed-by: Andrew Cooper --- diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 4e96f6ca5a..7ca9b938b9 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -1750,7 +1750,7 @@ void hypercall_cancel_continuation(void) struct cpu_user_regs *regs = guest_cpu_user_regs(); struct mc_state *mcs = ¤t->mc_state; - if ( test_bit(_MCSF_in_multicall, &mcs->flags) ) + if ( mcs->flags & MCSF_in_multicall ) { __clear_bit(_MCSF_call_preempted, &mcs->flags); } @@ -1774,7 +1774,7 @@ unsigned long hypercall_create_continuation( va_start(args, format); - if ( test_bit(_MCSF_in_multicall, &mcs->flags) ) + if ( mcs->flags & MCSF_in_multicall ) { __set_bit(_MCSF_call_preempted, &mcs->flags); @@ -1852,9 +1852,9 @@ int hypercall_xlat_continuation(unsigned int *id, unsigned int nr, va_start(args, mask); - if ( test_bit(_MCSF_in_multicall, &mcs->flags) ) + if ( mcs->flags & MCSF_in_multicall ) { - if ( !test_bit(_MCSF_call_preempted, &mcs->flags) ) + if ( !(mcs->flags & MCSF_call_preempted) ) { va_end(args); return 0; diff --git a/xen/arch/x86/x86_64/compat/mm.c b/xen/arch/x86/x86_64/compat/mm.c index d034bd0c71..178e42d976 100644 --- a/xen/arch/x86/x86_64/compat/mm.c +++ b/xen/arch/x86/x86_64/compat/mm.c @@ -324,7 +324,7 @@ int compat_mmuext_op(XEN_GUEST_HANDLE_PARAM(mmuext_op_compat_t) cmp_uops, { struct cpu_user_regs *regs = guest_cpu_user_regs(); struct mc_state *mcs = ¤t->mc_state; - unsigned int arg1 = !test_bit(_MCSF_in_multicall, &mcs->flags) + unsigned int arg1 = !(mcs->flags & MCSF_in_multicall) ? regs->ecx : mcs->call.args[1]; unsigned int left = arg1 & ~MMU_UPDATE_PREEMPTED; @@ -338,7 +338,7 @@ int compat_mmuext_op(XEN_GUEST_HANDLE_PARAM(mmuext_op_compat_t) cmp_uops, { BUG_ON(!hypercall_xlat_continuation(&left, 4, 0x01, nat_ops, cmp_uops)); - if ( !test_bit(_MCSF_in_multicall, &mcs->flags) ) + if ( !(mcs->flags & MCSF_in_multicall) ) regs->_ecx += count - i; else mcs->compat_call.args[1] += count - i; diff --git a/xen/common/multicall.c b/xen/common/multicall.c index fa9d910594..21661ee4f8 100644 --- a/xen/common/multicall.c +++ b/xen/common/multicall.c @@ -79,7 +79,7 @@ do_multicall( if ( unlikely(__copy_field_to_guest(call_list, &mcs->call, result)) ) rc = -EFAULT; - else if ( test_bit(_MCSF_call_preempted, &mcs->flags) ) + else if ( mcs->flags & MCSF_call_preempted ) { /* Translate sub-call continuation to guest layout */ xlat_multicall_entry(mcs);