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. */ 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: > 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); > }