Message ID | 20240712-asi-rfc-24-v1-10-144b319a40d8@google.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Address Space Isolation (ASI) 2024 | expand |
Hi Brendan, kernel test robot noticed the following build warnings: [auto build test WARNING on a38297e3fb012ddfa7ce0321a7e5a8daeb1872b6] url: https://github.com/intel-lab-lkp/linux/commits/Brendan-Jackman/mm-asi-Make-some-utility-functions-noinstr-compatible/20240713-012107 base: a38297e3fb012ddfa7ce0321a7e5a8daeb1872b6 patch link: https://lore.kernel.org/r/20240712-asi-rfc-24-v1-10-144b319a40d8%40google.com patch subject: [PATCH 10/26] mm: asi: Avoid warning from NMI userspace accesses in ASI context config: i386-buildonly-randconfig-004-20240714 (https://download.01.org/0day-ci/archive/20240714/202407141109.Vpmj3Sze-lkp@intel.com/config) compiler: clang version 18.1.5 (https://github.com/llvm/llvm-project 617a15a9eac96088ae5e9134248d8236e34b91b1) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240714/202407141109.Vpmj3Sze-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202407141109.Vpmj3Sze-lkp@intel.com/ All warnings (new ones prefixed by >>): >> arch/x86/mm/tlb.c:1329:20: warning: function 'cr3_matches_current_mm' is not needed and will not be emitted [-Wunneeded-internal-declaration] 1329 | static inline bool cr3_matches_current_mm(void) | ^~~~~~~~~~~~~~~~~~~~~~ 1 warning generated. vim +/cr3_matches_current_mm +1329 arch/x86/mm/tlb.c 1328 > 1329 static inline bool cr3_matches_current_mm(void) 1330 { 1331 struct asi *asi = asi_get_current(); 1332 pgd_t *cr3_pgd; 1333 1334 /* 1335 * Prevent read_cr3_pa -> [NMI, asi_exit] -> asi_get_current, 1336 * otherwise we might find CR3 pointing to the ASI PGD but not 1337 * find a current ASI domain. 1338 */ 1339 barrier(); 1340 cr3_pgd = __va(read_cr3_pa()); 1341 1342 if (cr3_pgd == current->mm->pgd) 1343 return true; 1344 return asi && (cr3_pgd == asi_pgd(asi)); 1345 } 1346
diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c index 02f73a71d4ea..e80cd67a5239 100644 --- a/arch/x86/mm/tlb.c +++ b/arch/x86/mm/tlb.c @@ -1326,6 +1326,24 @@ void arch_tlbbatch_flush(struct arch_tlbflush_unmap_batch *batch) put_cpu(); } +static inline bool cr3_matches_current_mm(void) +{ + struct asi *asi = asi_get_current(); + pgd_t *cr3_pgd; + + /* + * Prevent read_cr3_pa -> [NMI, asi_exit] -> asi_get_current, + * otherwise we might find CR3 pointing to the ASI PGD but not + * find a current ASI domain. + */ + barrier(); + cr3_pgd = __va(read_cr3_pa()); + + if (cr3_pgd == current->mm->pgd) + return true; + return asi && (cr3_pgd == asi_pgd(asi)); +} + /* * Blindly accessing user memory from NMI context can be dangerous * if we're in the middle of switching the current user task or @@ -1341,10 +1359,10 @@ bool nmi_uaccess_okay(void) VM_WARN_ON_ONCE(!loaded_mm); /* - * The condition we want to check is - * current_mm->pgd == __va(read_cr3_pa()). This may be slow, though, - * if we're running in a VM with shadow paging, and nmi_uaccess_okay() - * is supposed to be reasonably fast. + * The condition we want to check that CR3 points to either + * current_mm->pgd or an appropriate ASI PGD. Reading CR3 may be slow, + * though, if we're running in a VM with shadow paging, and + * nmi_uaccess_okay() is supposed to be reasonably fast. * * Instead, we check the almost equivalent but somewhat conservative * condition below, and we rely on the fact that switch_mm_irqs_off() @@ -1353,7 +1371,7 @@ bool nmi_uaccess_okay(void) if (loaded_mm != current_mm) return false; - VM_WARN_ON_ONCE(current_mm->pgd != __va(read_cr3_pa())); + VM_WARN_ON_ONCE(!cr3_matches_current_mm()); return true; }
nmi_uaccess_okay() emits a warning if current CR3 != mm->pgd. Limit the warning to only when ASI is not active. Co-developed-by: Junaid Shahid <junaids@google.com> Signed-off-by: Brendan Jackman <jackmanb@google.com> --- arch/x86/mm/tlb.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-)