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

Re: [Xen-devel] [PATCH 3/4] x86/APIC: reduce rounding errors in calculations



On 13.03.2020 16:50, Andrew Cooper wrote:
> On 13/03/2020 09:26, Jan Beulich wrote:
>> --- a/xen/arch/x86/apic.c
>> +++ b/xen/arch/x86/apic.c
>> @@ -1249,17 +1249,16 @@ static int __init calibrate_APIC_clock(v
>>      tt2 = apic_read(APIC_TMCCT);
>>      t2 = rdtsc_ordered();
>>  
>> -    result = (tt1-tt2)*APIC_DIVISOR/LOOPS;
>> +    bus_freq = (tt1 - tt2) * APIC_DIVISOR * LOOPS_FRAC;
>>  
>> -    apic_printk(APIC_VERBOSE, "..... CPU clock speed is %ld.%04ld MHz.\n",
>> -                ((long)(t2 - t1) / LOOPS) / (1000000 / HZ),
>> -                ((long)(t2 - t1) / LOOPS) % (1000000 / HZ));
>> +    apic_printk(APIC_VERBOSE, "..... CPU clock speed is %lu.%04lu MHz.\n",
>> +                ((unsigned long)(t2 - t1) * LOOPS_FRAC) / 1000000,
>> +                ((unsigned long)(t2 - t1) * LOOPS_FRAC / 100) % 10000);
> 
> If I'm not mistaken, this expression only works because of the L->R
> associativity (given the same precedence of * and /) grouping it as
> ((t2-t1) * 10)  / 100 as opposed to (t2-t1) * (10 / 100), where the
> latter would truncate to 0.  I think some extra brackets would help for
> clarity.

Well, yes, done. The alternative would have been to drop more of
them.

> That said, what is wrong with keeping the original form?

The same as elsewhere in this patch, and as said in the description -
there's been pointless rounding (really: truncation) errors here from
first dividing by HZ (to be precise: by HZ/10) and then effectively
multiplying by this value again. The original division-only argument
would not be affected afaict, but the remainder one would. Furthermore
I'd like to avoid having to retain the LOOPS constant.

>  I realise this
> is only for a printk(), but the div instruction can't be shared between
> the two halves.

This being an __init function, I don't think the number of divisions
is a concern here, the more that the compiler - with the divisor
being a constant - will convert them to multiplications anyway.

Jan

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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