Re: pps_capture() and pps_fetch()

From: Sebastian Huber <sebastian.huber_at_embedded-brains.de>
Date: Fri, 03 Jun 2022 13:10:10 UTC
On 03.06.22 10:28, Poul-Henning Kamp wrote:
>> The expensive part in pps_event() is after the th_generation checks. I
>> think from a performance point of view, the checks can be reduced to
>> just one th_generation check. I am more concerned if this would
>> introduce a subtle functional change.
> Assuming that your timecounter hardware does not roll over fast enough
> to open any races, I think that is correct.

Would a timecounter overflow within a time interval from th_generation 
to th_generation + 1 not be a bug in general?

static __inline void
bintime_off(struct bintime *bt, u_int off)
{
	struct timehands *th;
	struct bintime *btp;
	uint64_t scale;
	u_int delta, gen, large_delta;

	do {
		th = timehands;
		gen = atomic_load_acq_int(&th->th_generation);

For example, if the thread gets interrupted here and the timecounter 
overflows, then the measurement below would be wrong if th_generation 
didn't change.

		btp = (struct bintime *)((vm_offset_t)th + off);
		*bt = *btp;
		scale = th->th_scale;
		delta = tc_delta(th);
		large_delta = th->th_large_delta;
		atomic_thread_fence_acq();
	} while (gen == 0 || gen != th->th_generation);

	bintime_add_tc_delta(bt, scale, large_delta, delta);
}


-- 
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax:   +49-89-18 94 741 - 08

Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/