> For eg: if a clock interrupt from userland got deferred as pending, even > if it came in from userland (is this possible ?), because the current > spl level was at, say, SPL_HIGH, it now seems to be the case that the > system accounts for the delayed execution by charging the *entire* time > (from the last hardclock() inclusive of whatever was executing at > SPL_HIGH, to the system and not the userland process, thus charging the > time interval between when the last hardclock() was called, and when it > was actually serviced, to the system instead of the user process that > was originally interrupted. > > To emphasise my point, I've added a patch below that I think should > reflect the accounting correctly. > > I'm not sure I've understood this correctly, so I'd appreciate it if > someone who has a good understanding of this would be able to comment. > > Many Thanks, > > Cherry > > > > --- kern_clock.c.~1.138.~ 2018-09-21 11:28:02.792675611 +0000 > +++ kern_clock.c 2018-10-16 12:06:38.753987323 +0000 > @@ -352,6 +352,10 @@ > } > > if (CLKF_USERMODE(frame)) { > + if (p == NULL) { /* Account deferred clock ticks to > current user. */ > + p = l->l_proc; > + mutex_spin_enter(&p->p_stmutex); > + } > KASSERT(p != NULL); > if ((p->p_stflag & PST_PROFIL) && profsrc == > PROFSRC_CLOCK) > addupc_intr(l, CLKF_PC(frame));
i don't believe this can happen. if it does, then something else is horribly wrong and should be fixed instead. eg, if i'm in usermode, then i can't be the idle thread, so p should always be valid. (usermode can also never be at any IPL besides 0, with it being an outright bug.) what problem are you actually trying to solve? .mrg.