rcu: Fix quiescent state reporting deadlock
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 15 Jun 2018 20:33:54 +0000 (16:33 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 15 Jun 2018 20:33:54 +0000 (16:33 -0400)
commit526df6f66a9f776d98f23c55648028670704ecd1
treee7ea681c7d614ef93a97e31eeb203350bafbf222
parenta7ba356969a02a91353b4f49cee100e4857d8fc8
rcu: Fix quiescent state reporting deadlock

When a core is the last to report in, it will kick the gp_ktask's rendez
variable.  That will wake the gp_ktask, and waking a ktask is done with a
kernel message.  Currently, those messages are sent to the calling core.

When we reported *after* checking the RKMs, we'd halt.  Then the GP ktask
wouldn't run.  We wouldn't see it sleeping (e.g. with "db sem"), since it
was in the process of being awake.  We wouldn't see it running either,
since it was stuck as a KMSG.  With trace_printks, we could see it went
into the rendez (rcu.c L435), but never came out.

By kicking all the cores with "trace coretf -1", we woke the system up.
I thought to try that since it would trigger a QS, but in the trace also
spat out a message for the RKM that hadn't run yet.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/smp.c