[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.