[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Question about patch "svm: fix incorrect TSC scaling"
On 05/29/2018 06:23 PM, Dongli Zhang wrote: > > > On 05/29/2018 05:56 PM, Jan Beulich wrote: >>>>> On 28.05.18 at 14:25, <dongli.zhang@xxxxxxxxxx> wrote: >>> I am writing to ask about below patch as I am not familiar with AMD tsc >>> scaling: >>> >>> commit 11eeca65126e51f03a883907751d5ccbe4f35aa3 >>> Author: Haozhong Zhang <haozhong.zhang@xxxxxxxxx> >>> Date: Tue Dec 8 09:46:12 2015 +0100 >>> >>> svm: fix incorrect TSC scaling >>> >>> SVM TSC ratio is incorrectly used in the current >>> svm_get_tsc_offset(). This patch replaces the scaling logic in >>> svm_get_tsc_offset() with a correct implementation. >>> >>> Signed-off-by: Haozhong Zhang <haozhong.zhang@xxxxxxxxx> >>> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> >>> >>> >>> The below equation is used in the above patch: >>> >>> ------------------------- >>> host_tsc * ratio * 2^-32. >>> ------------------------- Indeed, I have an extra question that why 2^-32 is involved here? Is it because we would like to ignore the frag part and only consider the leading integer part? Why not just use "host_tsc * ratio"? Thank you very much! Dongli Zhang >>> >>> >>> While the below incorrect equation (indeed code) was used before above >>> patch: >>> >>> --------------------------------------------------------------- >>> offset = (((host_tsc >> 32U) * (ratio >> 32U)) << 32U) + >>> (host_tsc & 0xffffffffULL) * (ratio & 0xffffffffULL); >>> return guest_tsc - offset; >>> --------------------------------------------------------------- >>> >>> Can I summarize the above code as: >>> >>> tsc_h * mult * 2^32 + tsc_l * frag or >>> >>> tsc_h * int * 2^32 + tsc_l * frag ? >>> >>> >>> Would you please help confirm why the equation is replaced? Or would you >>> please >>> help and let me know the chapter/page of AMD reference manual showing the >>> correct equation? >> >> This has nothing to do with AMD's doc, but only with maths: To split >> a multiplication x * y when considering x = xh + xl (high and low parts) >> and y = yh + yl you get x * y = xh * yh + xh * yl + xl * yh + xl * xl. >> Width constraints make it unnecessary to calculate the xh * yh part >> here. The original expression, however, calculated something rather >> strange instead (only the xl * yl part was actually correct). > > Thank you very much for the explanation! > > Now it is clear to me. > > Dongli Zhang > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |