On 03/11/19(Sun) 13:12, Ted Unangst wrote:
> Martin Pieuchot wrote:
> > The last, now reverted change, to uvm_map_inentry() exposes a race that
> > is reproducible while building lang/go on amd64 which makes uvm_fault()
> > fail, resulting a in a SIGSEV of at least one of the processes.
> 
> > Interestingly the machine cannot reproduce the race if the KERNEL_LOCK()
> > is used as a barrier, like in the diff below. 
> > 
> > I couldn't reproduce the race with the go programs in src/regress.
> > Building go is huge and difficult to instrument.
> > 
> > By looking at sigpanic() in the traces it seems that stack manipulation
> > is generally the trigger.  I'm guessing the issue needs a multi-threaded
> > program to be exposed but at that stage I'd appreciate any pointer or
> > any simpler way to trigger the race. 
> 
> Can you explain the race some more? The lock changes below would all seem to
> come too late to resolve any races.

I don't know.  All I know is that the diff that got reverted causes the
build processes of golang to segfault.  If you have an easier way to
reproduce the problem, I'm interested ;)

> 
> >     if (uvm_map_inentry_recheck(serial, addr, ie)) {
> >             KERNEL_LOCK();
> > +           KERNEL_UNLOCK();
> 
> This in particular looks pretty weird.

That's just a barrier.  It's to show that taking & releasing the lock
here is sufficient to avoid the segfault.  In that scenario the map lock
is grabbed w/o the KERNEL_LOCK(), that said, it doesn't prove anything ;)

Reply via email to