On Thu, Feb 22, 2024 at 08:48:17AM -0800, Dave Hansen wrote: > On 1/26/24 00:06, Yosry Ahmed wrote: > > +/* > > + * The "prev" argument passed by the caller does not always match CR3. For > > + * example, the scheduler passes in active_mm when switching from lazy TLB mode > > + * to normal mode, but switch_mm_irqs_off() can be called from x86 code without > > + * updating active_mm. Use cpu_tlbstate.loaded_mm instead. > > + */ > > +void switch_mm_irqs_off(struct mm_struct *unused, struct mm_struct *next, > > struct task_struct *tsk) > > One nit here: It's not obvious that "unused" is 'the "prev" argument'. > > Would something like this be more clear? > > /* > * This optimizes when not actually switching mm's. Some architectures > * use the 'unused' argument for this optimization, but x86 must use > * 'cpu_tlbstate.loaded_mm' instead because it does not always keep > * ->active_mm up to date. > */ Yes, this is more clear, thanks! However, Andrew already merged that patch into mm-stable, so it cannot be amended. I can send a separate patch to rewrite the comment tho if you'd like, WDYT? > > Also, I think it might be useful to have the rule that arch/x86 code > _always_ calls switch_mm_irqs_off() with the first argument (the > newly-named 'unused') set to NULL. I think there's only one site: Agreed. I can also send a separate patch for this. Thanks! > > > void switch_mm(struct mm_struct *prev, struct mm_struct *next, > > struct task_struct *tsk) > > { > > unsigned long flags; > > > > local_irq_save(flags); > > switch_mm_irqs_off(prev, next, tsk); > > local_irq_restore(flags); > > } >