NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: port-vax/55415: vax no longer preempts in a timely fashion



The following reply was made to PR port-vax/55415; it has been noted by GNATS.

From: oster%netbsd.org@localhost
To: Anders Magnusson <ragge%tethuvudet.se@localhost>, gnats-bugs%netbsd.org@localhost,
 oster%netbsd.org@localhost
Cc: 
Subject: Re: port-vax/55415: vax no longer preempts in a timely fashion
Date: Thu, 30 Jul 2020 14:49:55 -0600

 On 7/30/20 1:38 PM, Anders Magnusson wrote:
 > 
 > 
 > Den 2020-07-30 kl. 21:30, skrev oster%netbsd.org@localhost:
 >> The following reply was made to PR port-vax/55415; it has been noted 
 >> by GNATS.
 >>
 >> From: oster%netbsd.org@localhost
 >> To: gnats-bugs%netbsd.org@localhost, port-vax-maintainer%netbsd.org@localhost,
 >>   gnats-admin%netbsd.org@localhost, netbsd-bugs%netbsd.org@localhost, oster%netbsd.org@localhost
 >> Cc:
 >> Subject: Re: port-vax/55415: vax no longer preempts in a timely fashion
 >> Date: Thu, 30 Jul 2020 13:25:48 -0600
 >>
 >>   On 7/30/20 1:10 PM, Anders Magnusson wrote:
 >>   > The following reply was made to PR port-vax/55415; it has been 
 >> noted by GNATS.
 >>   >
 >>   > From: Anders Magnusson <ragge%tethuvudet.se@localhost>
 >>   > To: gnats-bugs%netbsd.org@localhost, oster%netbsd.org@localhost
 >>   > Cc:
 >>   > Subject: Re: port-vax/55415: vax no longer preempts in a timely 
 >> fashion
 >>   > Date: Thu, 30 Jul 2020 21:07:37 +0200
 >>   >
 >>   >   >   I've done a bit more debugging...   What I'm seeing is that in
 >>   >   >   kern_runq.c:sched_resched_cpu() the call to 
 >> cpu_need_resched(ci, l, f)
 >>   >   >   happens, cpu_need_resched() sets up the AST.  Except it's 
 >> only once in a
 >>   >   >   while that the trap with the AST fires, userret() gets 
 >> called, and
 >>   >   >   preemption happens!  Sometimes the trap with AST fires once, 
 >> and not
 >>   >   >   again... sometimes it fires 5 times in a row, and then 
 >> misses.... but I
 >>   >   >   don't know why an AST that has been posted would 
 >> subsequently get missed
 >>   >   >   sometimes....
 >>   >   >
 >>   >   >   So it's able to hit a situation where cpu_need_resched() is 
 >> called, but
 >>   >   >   the corresponding AST never fires. The loop in 
 >> sched_resched_cpu() that
 >>   >   >   sets ci->ci_want_resched keeps thinking (correctly!) that 
 >> the AST has
 >>   >   >   already been setup, and so doesn't try to call 
 >> cpu_need_resched() again.
 >>   >   >     When it gets 'stuck' like this, we never see an AST until 
 >> the process
 >>   >   >   completes.  (nor do we see preemption until the process 
 >> completes.)
 >>   >   >   That seems to be because if I check the AST status with:
 >>   >   >
 >>   >   >     if (mfpr(PR_ASTLVL) != AST_OK)
 >>   >   >
 >>   >   >   that condition is always true... (meaning the AST is not 
 >> setup...)
 >>   >   >
 >>   >   >   Any ideas on how an AST can just 'disappear'?  (I'm using 
 >> the same
 >>   >   >   mfpr() check right after the mtpr() setting of PR_ASTLVL, 
 >> and there it
 >>   >   >   thinks it's set just fine... so how does it go missing a few 
 >> moments
 >>   >   >   after????)
 >>   >   >
 >>   >   The AST is only acked if it has been taken.  This is done in 
 >> trap(),
 >>   >   just before userret() is called.
 >>   >   Losing the AST should not be possible.
 >>   >
 >>   >   Reading the VAX manual says that ASTLVL is not saved by svpctx, 
 >> so if a
 >>   >   process switch occurs before the AST is delivered it will be lost.
 >>   >   Can this ever happen?
 >>   Hmm... svpctx happens in softint_common(), which seems to be called 
 >> from
 >>   lots of softFOO functions...   So if I'm reading this correctly, if we
 >>   happen to get into softint_common then the AST will get lost....
 > AST is itself a softint (called at Softint level 2).
 > But we should probably add saving of AST levels in the PCB anyway.
 
 I'm happy to test :)
 
 Later...
 
 Greg Oster
 


Home | Main Index | Thread Index | Old Index