Messages in this thread | | | Date | Fri, 21 Aug 2020 15:04:45 +0200 | From | peterz@infradea ... | Subject | Re: [PATCH v3] mm: Fix kthread_use_mm() vs TLB invalidate |
| |
On Fri, Aug 21, 2020 at 11:09:51AM +0530, Aneesh Kumar K.V wrote: > Peter Zijlstra <peterz@infradead.org> writes: > > > For SMP systems using IPI based TLB invalidation, looking at > > current->active_mm is entirely reasonable. This then presents the > > following race condition: > > > > > > CPU0 CPU1 > > > > flush_tlb_mm(mm) use_mm(mm) > > <send-IPI> > > tsk->active_mm = mm; > > <IPI> > > if (tsk->active_mm == mm) > > // flush TLBs > > </IPI> > > switch_mm(old_mm,mm,tsk); > > > > > > Where it is possible the IPI flushed the TLBs for @old_mm, not @mm, > > because the IPI lands before we actually switched. > > > > Avoid this by disabling IRQs across changing ->active_mm and > > switch_mm(). > > > > [ There are all sorts of reasons this might be harmless for various > > architecture specific reasons, but best not leave the door open at > > all. ] > > > Do we have similar race with exec_mmap()? I am looking at exec_mmap() > runnning parallel to do_exit_flush_lazy_tlb(). We can get > > if (current->active_mm == mm) { > > true and if we don't disable irq around updating tsk->mm/active_mm we > can end up doing mmdrop on wrong mm?
exec_mmap() is called after de_thread(), there should not be any mm specific invalidations around I think.
Then again, CLONE_VM without CLONE_THREAD might still be possible, so yeah, we probably want IRQs disabled there too, just for consistency and general paranoia if nothing else.
| |