Date: Sun, 22 Sep 1996 17:06:25 -0700 From: Julian Elischer <julian@whistle.com> To: Bruce Evans <bde@zeta.org.au> Cc: freebsd-bugs@freefall.freebsd.org Subject: Re: kern/1652: Version of itimer patch for -current Message-ID: <3245D481.7566F4CF@whistle.com> References: <199609200220.TAA04571@freefall.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Bruce Evans wrote: > From: Bruce Evans <bde@zeta.org.au> [...] > >It is possible that this should only be called if delta is greater than a particular > >size. > > No, delta is very unlikely to be small (else adjtime() should have [...] Ok so that part stays the same.. no such optimisation.. > > >Also SPL must be considered if the number of processes is large.. > > Yes, walking the queue at splclock() defeats the micro-optimized spl > placement in settimeofday(). It think atomic update is only > necessary for each itimer, not for all of them together. hmm do you think we need any particular locking then? will we break SMP stuff? etc. etc. would doing it a splsoftclock be sufficient? if so, how about the fix below? do we need to lock the process list for SMP ops? > > >I could check this in myself, but I want comments first.. > > Mihoko Tanaka <mihoko@pa.yokogawa.co.jp> posted a similar fix > the other day. yes and I think we need to do this.. > > All versions forgot to remove or update the load comment about > this problem. eh? Oh you mean the comment in the code? yeah ok, if I did this I'd change the comment.. :-) > > I wonder why this problem has been around for so long, and why > adjkerntz doesn't seem to cause it. sorry I don't follow.. adjkerntz? that doesn't change the internal time does it? just how we express it? Oh I see, because we interpret the cmos clock differntly..? well that will only be at most 24 hours, or 3600x24 loops. Where we are talking about year sized changes.. > > Bruce o how about the following variation? (using splsoftclock) (warning.. cut+paste used) *** 1.17 1996/07/12 07:55:35 --- kern_time.c 1996/09/23 00:04:46 *************** *** 56,61 **** --- 56,62 ---- */ static void timevalfix __P((struct timeval *)); + static void recalc_realtimer(struct timeval); #ifndef _SYS_SYSPROTO_H_ struct gettimeofday_args { *************** *** 114,120 **** (error = copyin((caddr_t)uap->tzp, (caddr_t)&atz, sizeof(atz)))) return (error); if (uap->tv) { - /* WHAT DO WE DO ABOUT PENDING REAL-TIME TIMEOUTS??? */ s = splclock(); /* * Calculate delta directly to minimize clock interrupt --- 115,120 ---- *************** *** 136,141 **** --- 136,142 ---- timevalfix(&delta); timevaladd(&boottime, &delta); timevaladd(&runtime, &delta); + recalc_realtimer(delta); LEASE_UPDATETIME(delta.tv_sec); splx(s); resettodr(); *************** *** 144,149 **** --- 145,164 ---- tz = atz; return (0); } + + + static void + recalc_realtimer(struct timeval delta) + { + struct proc *p; + + for (p = allproc.lh_first; p != 0; p = p->p_list.le_next) { + if (timerisset(&p->p_realtimer.it_value)) { + timevaladd(&p->p_realtimer.it_value, &delta); + timevalfix(&p->p_realtimer.it_value); + } + } + } extern int tickadj; /* "standard" clock skew, us./tick */ int tickdelta; /* current clock skew, us. per tick */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3245D481.7566F4CF>