[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2 03/10] hvm/hpet: Only set comparator or period not both.



>>> On 08.04.14 at 16:24, <dslutz@xxxxxxxxxxx> wrote:
> +        if ( timer_is_periodic(h, tn) )
> +        {
> +            if ( h->hpet.timers[tn].config & HPET_TN_SETVAL )
> +            {
> +                /*
> +                 * When SETVAL is one, software is able to "directly
> +                 * set a periodic timer's accumulator."  That is,
> +                 * set the comparator without adjusting the period.
> +                 * Much the same as just setting the comparator on
> +                 * an enabled one-shot timer.
> +                 *
> +                 * This configuration bit clears when the comparator
> +                 * is written.
> +                 */
> +                h->hpet.timers[tn].config &= ~HPET_TN_SETVAL;
> +                h->hpet.timers[tn].cmp = new_val;
> +                h->hpet.comparator64[tn] = new_val;
> +            }
> +            else
> +            {
> +                /*
> +                 * Clamp period to reasonable min/max values:
> +                 *  - minimum is 100us, same as timers controlled by vpt.c
> +                 *  - maximum is to prevent overflow in time_after()
> +                 *    calculations
> +                 */
> +                if ( hpet_tick_to_ns(h, new_val) < MICROSECS(100) )
> +                    new_val = (MICROSECS(100) << 10) / h->hpet_to_ns_scale;
> +                new_val &= (timer_is_32bit(h, tn) ? ~0u : ~0ull) >> 1;
> +                h->hpet.period[tn] = new_val;
> +            }
> +        }
> +        else
>          {
>              /*
> -             * Clamp period to reasonable min/max values:
> -             *  - minimum is 100us, same as timers controlled by vpt.c
> -             *  - maximum is to prevent overflow in time_after() calculations
> +             * The spec says "do not use", but clear if specified.
>               */
> -            if ( hpet_tick_to_ns(h, new_val) < MICROSECS(100) )
> -                new_val = (MICROSECS(100) << 10) / h->hpet_to_ns_scale;
> -            new_val &= (timer_is_32bit(h, tn) ? ~0u : ~0ull) >> 1;
> -            h->hpet.period[tn] = new_val;
> +            if ( h->hpet.timers[tn].config & HPET_TN_SETVAL )
> +                h->hpet.timers[tn].config &= ~HPET_TN_SETVAL;

The if() is clearly unnecessary here, and with it removed I don't see
any difference left with the inner if() path above. Hence I guess
they should be folded. Once that's done, new_val as calculated
before the outer if() isn't needed in the inner "else" path, and
hence its truncation could be moved inside the if(). Which in turn
allows you to fix the comparator64 related bug here too: All other
code stores the non-truncated value there, just the code here
doesn't.

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®.