From: Claudio Jeker Subject: Re: use nanoseconds for timekeeping in hfsc To: David Gwynne Cc: tech@openbsd.org Date: Mon, 28 Oct 2024 13:00:41 +0100 On Fri, Oct 25, 2024 at 03:11:25PM +1000, David Gwynne wrote: > hfsc uses a scaled version of microseconds for time at the moment. it > seems more straightforward to just use nanoseconds. > > kjc and cheloa like the idea. it seems to work fine in my own tests. > > ok? OK claudio@. Only think I wonder is why we need hfsc_uptime() instead of using nsecuptime() in the code? It is an extra abstraction that does not really help. > Index: hfsc.c > =================================================================== > RCS file: /cvs/src/sys/net/hfsc.c,v > diff -u -p -r1.49 hfsc.c > --- hfsc.c 11 Apr 2023 00:45:09 -0000 1.49 > +++ hfsc.c 30 Sep 2024 05:24:11 -0000 > @@ -248,11 +248,12 @@ void hfsc_rtsc_min(struct hfsc_runtime_ > void hfsc_getclstats(struct hfsc_class_stats *, struct hfsc_class *); > struct hfsc_class *hfsc_clh2cph(struct hfsc_if *, u_int32_t); > > -#define HFSC_CLK_SHIFT 8 > -#define HFSC_FREQ (1000000 << HFSC_CLK_SHIFT) > -#define HFSC_CLK_PER_TICK (HFSC_FREQ / hz) > +#define HFSC_FREQ 1000000000LL > +#define HFSC_CLK_PER_TICK tick_nsec > #define HFSC_HT_INFINITY 0xffffffffffffffffLL /* infinite time value */ > > +#define hfsc_uptime() nsecuptime() > + > struct pool hfsc_class_pl, hfsc_internal_sc_pl; > > /* > @@ -345,16 +346,6 @@ hfsc_class_purge(struct hfsc_class *cl, > return cl->cl_qops->pfq_purge(cl->cl_qdata, ml); > } > > -u_int64_t > -hfsc_microuptime(void) > -{ > - struct timeval tv; > - > - microuptime(&tv); > - return (((u_int64_t)(tv.tv_sec) * 1000000 + tv.tv_usec) << > - HFSC_CLK_SHIFT); > -} > - > static inline u_int > hfsc_more_slots(u_int current) > { > @@ -845,7 +836,7 @@ hfsc_deq_begin(struct ifqueue *ifq, void > struct mbuf *m; > u_int64_t cur_time; > > - cur_time = hfsc_microuptime(); > + cur_time = hfsc_uptime(); > > /* > * if there are eligible classes, use real-time criteria. > @@ -1007,7 +998,7 @@ hfsc_init_ed(struct hfsc_if *hif, struct > { > u_int64_t cur_time; > > - cur_time = hfsc_microuptime(); > + cur_time = hfsc_uptime(); > > /* update the deadline curve */ > hfsc_rtsc_min(&cl->cl_deadline, cl->cl_rsc, cur_time, cl->cl_cumul); > @@ -1114,7 +1105,7 @@ hfsc_init_vf(struct hfsc_class *cl, int > if (cl->cl_usc != NULL) { > /* class has upper limit curve */ > if (cur_time == 0) > - cur_time = hfsc_microuptime(); > + cur_time = hfsc_uptime(); > > /* update the ulimit curve */ > hfsc_rtsc_min(&cl->cl_ulimit, cl->cl_usc, cur_time, > @@ -1701,7 +1692,7 @@ hfsc_getclstats(struct hfsc_class_stats > sp->myfadj = cl->cl_myfadj; > sp->vtadj = cl->cl_vtadj; > > - sp->cur_time = hfsc_microuptime(); > + sp->cur_time = hfsc_uptime(); > sp->machclk_freq = HFSC_FREQ; > > sp->qlength = hfsc_class_qlength(cl); > -- :wq Claudio