On Mon, Feb 27, 2023 at 06:26:00PM -0600, Scott Cheloha wrote:
> On Tue, Feb 28, 2023 at 10:18:16AM +1100, Jonathan Gray wrote:
> > On Mon, Feb 27, 2023 at 04:57:04PM -0600, Scott Cheloha wrote:
> > > ticks and jiffies start at zero.  During boot in initclocks(), we
> > > reset them:
> > > 
> > >   /* sys/kern/kern_clock.c */
> > > 
> > >     89    int     ticks;
> > >     90    static int psdiv, pscnt;                /* prof => stat divider 
> > > */
> > >     91    int     psratio;                        /* ratio: prof / stat */
> > >     92    
> > >     93    volatile unsigned long jiffies;         /* XXX Linux API for 
> > > drm(4) */
> > >     94    
> > >     95    /*
> > >     96     * Initialize clock frequencies and start both clocks running.
> > >     97     */
> > >     98    void
> > >     99    initclocks(void)
> > >    100    {
> > >    101            ticks = INT_MAX - (15 * 60 * hz);
> > >    102            jiffies = ULONG_MAX - (10 * 60 * hz);
> > >    103    
> > >    104            /* [... ] */
> > > 
> > > The idea here (committed by dlg@) is sound.  We reset ticks and
> > > jiffies to near-rollover values to catch buggy code misusing them.
> > > 
> > > But!  That jump from zero to whatever violates valid assumptions made
> > > by correct code, too.
> > 
> > Assumptions made by what code?  Does it exist in the tree?
> 
> First, even if the code did not exist, wouldn't it be simpler to not
> do the jump?  No?

There are enough problems to fix without chasing ones that
don't exist.

> 
> Second, with rare exception, all kernel code using ticks/jiffies
> assumes ticks/jiffies does not advance more than once every 1/hz
> seconds on average.
> 
> In timeout_add(9), we assign an absolute expiration time relative
> to the current value of ticks.  Code calling timeout_add(9) before
> initclocks() cannot account for the jump in initclocks().

What code calling timeout_add() before initclocks()?

> 
> There is probably equivalent code in drm(4) making the same
> assumption.

The vast majority of drm runs after root is mounted.

> 
> Relatedly, in cpu_relax() we increment jiffies if the kernel is
> cold:
> 
> sys/dev/pci/drm/include/linux/processor.h
> 
>     12  static inline void
>     13  cpu_relax(void)
>     14  {
>     15          CPU_BUSY_CYCLE();
>     16          if (cold) {
>     17                  delay(tick);
>     18                  jiffies++;
>     19          }
>     20  }
> 

Reply via email to