x86/tlb: Uninline __get_current_cr3_fast()
authorThomas Gleixner <tglx@linutronix.de>
Tue, 21 Apr 2020 09:20:28 +0000 (11:20 +0200)
committerBorislav Petkov <bp@suse.de>
Fri, 24 Apr 2020 13:55:50 +0000 (15:55 +0200)
cpu_tlbstate is exported because various TLB-related functions need
access to it, but cpu_tlbstate is sensitive information which should
only be accessed by well-contained kernel functions and not be directly
exposed to modules.

In preparation for unexporting cpu_tlbstate move __get_current_cr3_fast()
into the x86 TLB management code.

No functional change.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Alexandre Chartre <alexandre.chartre@oracle.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Andy Lutomirski <luto@kernel.org>
Link: https://lkml.kernel.org/r/20200421092558.848064318@linutronix.de
arch/x86/include/asm/mmu_context.h
arch/x86/mm/tlb.c

index 4e55370e48e859ff7fb7342126f001adbcd4a471..9608536b9c8556ee7cc2519fa5e581aa8cd20a73 100644 (file)
@@ -225,24 +225,7 @@ static inline bool arch_vma_access_permitted(struct vm_area_struct *vma,
        return __pkru_allows_pkey(vma_pkey(vma), write);
 }
 
-/*
- * This can be used from process context to figure out what the value of
- * CR3 is without needing to do a (slow) __read_cr3().
- *
- * It's intended to be used for code like KVM that sneakily changes CR3
- * and needs to restore it.  It needs to be used very carefully.
- */
-static inline unsigned long __get_current_cr3_fast(void)
-{
-       unsigned long cr3 = build_cr3(this_cpu_read(cpu_tlbstate.loaded_mm)->pgd,
-               this_cpu_read(cpu_tlbstate.loaded_mm_asid));
-
-       /* For now, be very restrictive about when this can be called. */
-       VM_WARN_ON(in_nmi() || preemptible());
-
-       VM_BUG_ON(cr3 != __read_cr3());
-       return cr3;
-}
+unsigned long __get_current_cr3_fast(void);
 
 typedef struct {
        struct mm_struct *mm;
index 66f96f21a7b60b2a73832fd291c1f7ae783cb2c5..ea6f98a7ec06e70d4662f8ce5d8c3315be08fc20 100644 (file)
@@ -843,6 +843,26 @@ void flush_tlb_kernel_range(unsigned long start, unsigned long end)
        }
 }
 
+/*
+ * This can be used from process context to figure out what the value of
+ * CR3 is without needing to do a (slow) __read_cr3().
+ *
+ * It's intended to be used for code like KVM that sneakily changes CR3
+ * and needs to restore it.  It needs to be used very carefully.
+ */
+unsigned long __get_current_cr3_fast(void)
+{
+       unsigned long cr3 = build_cr3(this_cpu_read(cpu_tlbstate.loaded_mm)->pgd,
+               this_cpu_read(cpu_tlbstate.loaded_mm_asid));
+
+       /* For now, be very restrictive about when this can be called. */
+       VM_WARN_ON(in_nmi() || preemptible());
+
+       VM_BUG_ON(cr3 != __read_cr3());
+       return cr3;
+}
+EXPORT_SYMBOL_GPL(__get_current_cr3_fast);
+
 /*
  * arch_tlbbatch_flush() performs a full TLB flush regardless of the active mm.
  * This means that the 'struct flush_tlb_info' that describes which mappings to