David Gwynne(da...@gwynne.id.au) on 2016.05.30 17:16:24 +1000: > llinfo_nd6 thinks its expiry may extend beyond a timeout interval. > > so it keeps track of the number of ticks it really wants via ln_ntick > in llinfo_nd6 and schedules multiple timeouts to reach it. > > i think this is a waste of time for two reasons: > > 1. nd6_llinfo_settimer() (which sets this up) doesnt seem to be > called with a timeout greater than what timeouts can handle. timeouts > off the wire are ignored if theyre greater than an hour > (MAX_REACHABLE_TIME), and the largest constant that ends up being > passed is a day via nd6_gctimer. the fastest ticking arch we have > is alpha with HZ at 1024, which wraps at about 24 days. we have > space. > > 2. ln_ntick is a long, which is the same size as int on 32 bit > archs. the semantics it wants dont exist on a bunch of platforms. > it is kind of arguing its own uselesness. > > ok?
sounds reasonable. ok benno > > Index: nd6.c > =================================================================== > RCS file: /cvs/src/sys/netinet6/nd6.c,v > retrieving revision 1.179 > diff -u -p -r1.179 nd6.c > --- nd6.c 17 May 2016 08:29:14 -0000 1.179 > +++ nd6.c 30 May 2016 07:08:09 -0000 > @@ -308,21 +308,16 @@ nd6_llinfo_settimer(struct llinfo_nd6 *l > { > int s; > > + KASSERT(tick <= INT_MAX); > + > s = splsoftnet(); > > if (tick < 0) { > ln->ln_expire = 0; > - ln->ln_ntick = 0; > timeout_del(&ln->ln_timer_ch); > } else { > ln->ln_expire = time_second + tick / hz; > - if (tick > INT_MAX) { > - ln->ln_ntick = tick - INT_MAX; > - timeout_add(&ln->ln_timer_ch, INT_MAX); > - } else { > - ln->ln_ntick = 0; > - timeout_add(&ln->ln_timer_ch, tick); > - } > + timeout_add(&ln->ln_timer_ch, tick); > } > > splx(s); > @@ -341,18 +336,6 @@ nd6_llinfo_timer(void *arg) > s = splsoftnet(); > > ln = (struct llinfo_nd6 *)arg; > - > - if (ln->ln_ntick > 0) { > - if (ln->ln_ntick > INT_MAX) { > - ln->ln_ntick -= INT_MAX; > - nd6_llinfo_settimer(ln, INT_MAX); > - } else { > - ln->ln_ntick = 0; > - nd6_llinfo_settimer(ln, ln->ln_ntick); > - } > - splx(s); > - return; > - } > > if ((rt = ln->ln_rt) == NULL) > panic("ln->ln_rt == NULL"); > Index: nd6.h > =================================================================== > RCS file: /cvs/src/sys/netinet6/nd6.h,v > retrieving revision 1.58 > diff -u -p -r1.58 nd6.h > --- nd6.h 30 Mar 2016 10:13:14 -0000 1.58 > +++ nd6.h 30 May 2016 07:08:09 -0000 > @@ -150,7 +150,6 @@ struct llinfo_nd6 { > short ln_state; /* reachability state */ > short ln_router; /* 2^0: ND6 router bit */ > > - long ln_ntick; > struct timeout ln_timer_ch; > }; > > --