[PATCH v5] um: Enable preemption in UML

Johannes Berg johannes at sipsolutions.net
Fri Sep 22 02:14:13 PDT 2023


On Fri, 2023-09-22 at 11:10 +0200, Johannes Berg wrote:
> On Fri, 2023-09-22 at 10:06 +0100, Anton Ivanov wrote:
> > On 22/09/2023 09:41, Johannes Berg wrote:
> > > > Yes, but when does the fork actually happen?
> > > > 
> > > Looking further at this, now I'm confused as to why it doesn't happen
> > > _all_ the time.
> > > 
> > > I think this has pretty much always been wrong, just now we actually
> > > notice it?
> > > 
> > > Basically, when we create a new thread (really just mm I think), we say
> > > the first thing that has to run there is fork_handler(), which
> > > initialises things the first time around. This calls force_flush_all()
> > > 
> > > But of course it's called from __schedule(), which has
> > > preemption/interrupts disabled. So you can't do mmap_read_lock()?
> > 
> > Stupid question.
> > 
> > If we have preemption and interrupts disabled and we are UP do we really need to lock it at this point?
> 
> Heh.
> 

Ah, but this works:

--- a/arch/um/kernel/tlb.c
+++ b/arch/um/kernel/tlb.c
@@ -606,8 +606,8 @@ void force_flush_all(void)
 	struct vm_area_struct *vma;
 	VMA_ITERATOR(vmi, mm, 0);
 
-	mmap_read_lock(mm);
+	rcu_read_lock();
 	for_each_vma(vmi, vma)
 		fix_range(mm, vma->vm_start, vma->vm_end, 1);
-	mmap_read_unlock(mm);
+	rcu_read_unlock();
 }


it seems?

And it doesn't even seem _bad_ since as you say nothing can change, and
we only inject stuff into the process in fix_range() anyway.

So maybe that works - perhaps with a big comment?

johannes



More information about the linux-um mailing list