|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/8] evtchn: refactor low-level event channel port ops
>>> On 09.08.13 at 20:08, David Vrabel <david.vrabel@xxxxxxxxxx> wrote:
> +static void evtchn_2l_set_pending(struct vcpu *v, struct evtchn *evtchn)
> +{
> + struct domain *d = v->domain;
> + unsigned port = evtchn->port;
> +
> + /*
> + * The following bit operations must happen in strict order.
> + * NB. On x86, the atomic bit operations also act as memory barriers.
> + * There is therefore sufficiently strict ordering for this architecture
> --
> + * others may require explicit memory barriers.
> + */
> +
> + if ( test_and_set_bit(port, &shared_info(d, evtchn_pending)) )
> + return;
> +
> + if ( !test_bit (port, &shared_info(d, evtchn_mask)) &&
> + !test_and_set_bit(port / BITS_PER_EVTCHN_WORD(d),
> + &vcpu_info(v, evtchn_pending_sel)) )
Up to here this is indeed 2-level specific, but the rest of the
function isn't, and would therefore better go back into
generic code.
> + {
> + vcpu_mark_events_pending(v);
> + }
> +
> + evtchn_check_pollers(d, port);
> +}
>[...]
> +static void evtchn_2l_unmask(struct domain *d, struct evtchn *evtchn)
> +{
> + struct vcpu *v = d->vcpu[evtchn->notify_vcpu_id];
> + unsigned port = evtchn->port;
> +
> + /*
> + * These operations must happen in strict order. Based on
> + * evtchn_2l_set_pending() above.
> + */
> + if ( test_and_clear_bit(port, &shared_info(d, evtchn_mask)) &&
> + test_bit (port, &shared_info(d, evtchn_pending)) &&
> + !test_and_set_bit (port / BITS_PER_EVTCHN_WORD(d),
> + &vcpu_info(v, evtchn_pending_sel)) )
Similarly here.
> + {
> + vcpu_mark_events_pending(v);
> + }
> +}
>[...]
> @@ -615,43 +616,10 @@ out:
>
> static void evtchn_set_pending(struct vcpu *v, int port)
> {
> - struct domain *d = v->domain;
> - int vcpuid;
> -
> - /*
> - * The following bit operations must happen in strict order.
> - * NB. On x86, the atomic bit operations also act as memory barriers.
> - * There is therefore sufficiently strict ordering for this architecture
> --
> - * others may require explicit memory barriers.
> - */
> -
> - if ( test_and_set_bit(port, &shared_info(d, evtchn_pending)) )
> - return;
> -
> - if ( !test_bit (port, &shared_info(d, evtchn_mask)) &&
> - !test_and_set_bit(port / BITS_PER_EVTCHN_WORD(d),
> - &vcpu_info(v, evtchn_pending_sel)) )
> - {
> - vcpu_mark_events_pending(v);
> - }
> -
> - /* Check if some VCPU might be polling for this event. */
> - if ( likely(bitmap_empty(d->poll_mask, d->max_vcpus)) )
> - return;
> + struct evtchn *evtchn;
>
> - /* Wake any interested (or potentially interested) pollers. */
> - for ( vcpuid = find_first_bit(d->poll_mask, d->max_vcpus);
> - vcpuid < d->max_vcpus;
> - vcpuid = find_next_bit(d->poll_mask, d->max_vcpus, vcpuid+1) )
> - {
> - v = d->vcpu[vcpuid];
> - if ( ((v->poll_evtchn <= 0) || (v->poll_evtchn == port)) &&
> - test_and_clear_bit(vcpuid, d->poll_mask) )
> - {
> - v->poll_evtchn = 0;
> - vcpu_unblock(v);
> - }
> - }
> + evtchn = evtchn_from_port(v->domain, port);
> + evtchn_port_set_pending(v, evtchn);
I know it's a matter of taste, but having a variable that's used
just once is usually done only whether otherwise the code
would get much harder to read. Similarly further down.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |