[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 08/11] hvm/hpet: Use signed divide in hpet_get_comparator.
On 04/23/14 11:45, Jan Beulich wrote: >>>> On 17.04.14 at 19:43, <dslutz@xxxxxxxxxxx> wrote: >> This is done so that when comparator is less then or equal to one >> period it does not change. >> >> The code lines: >> >> elapsed = hpet_read_maincounter(h, guest_time) + >> period - 1 - comparator; >> comparator += (elapsed / period) * period; >> >> are what matter here. For almost all cases where >> "hpet_read_maincounter() + period - 1" is greater then >> "comparator", a signed divide will produce the same answer as an >> unsigned divide. One of the problem areas is when >> "hpet_read_maincounter() + period - 1" needs more then 64 bits to >> represent it. It includes cases where hpet_read_maincounter() has > "It includes" implies there are other cases, yet I can't see any. > (Also twice s/then/than/ I think.) The boundary cases of 2's complement show up here (8 bits is just nice small numbers: -128 (signed) vs 128 (unsigned)). Ok. >> wrapped (I.E. needs more then 64 bits to correctly represent it), >> but "comparator" has not wrapped. > But can this happen in practice? Main counter and comparator > shouldn't be very far apart, and hence other than > "hpet_read_maincounter() + period - 1", > "hpet_read_maincounter() + period - 1 - comparator" shouldn't > ever require more than 64 bits to correctly represent it. All you > really need to deal with is the case where > hpet_read_maincounter() + period == comparator, i.e. the 1 > being subtracted makes the expression degenerate. So you could > simply make the computation and update dependent upon > hpet_read_maincounter() + period > comparator. > And then again I don't really see why the subtraction of 1 is needed > here in the first place. As you saw in patch #10, the -1 is an issue. Doing patch #10 1st, removes the normal Linux case. After more thinking on it, the last patch (#11) does make this patch (#8) not needed. The case that is overlapping is: If the 1st period's cmp is > 1 period by less then 2 periods (using numbers from #8 adjusted): hpet_read_maincounter(h, guest_time) = 67752 period = 62500 comparator = 130253 == 67752 + 62500 + 1 what unsigned signed comparator : 130253 130253 elapsed : 18446744073709551615 -1 elapsed/period : 295147905179352 0 comparator_delta : 18446744073709500000 0 new comparator : 78637 130253 and hpet_read_maincounter(h, guest_time) = 67752 period = 62500 comparator = 161502 == 67752 + 62500 + 31250 what unsigned signed comparator : 161502 161502 elapsed : 18446744073709520366 -31250 elapsed/period : 295147905179352 0 comparator_delta : 18446744073709500000 0 new comparator : 109886 161502 It does the right thing, but does not handle the general case. But since the last patch also handles this case, I will be dropping this patch in v4. -Don Slutz > > Jan > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |