x86/paravirt: Move the Xen-only pv_mmu_ops under the PARAVIRT_XXL umbrella
authorJuergen Gross <jgross@suse.com>
Tue, 28 Aug 2018 07:40:25 +0000 (09:40 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Mon, 3 Sep 2018 14:50:37 +0000 (16:50 +0200)
Most of the paravirt ops defined in pv_mmu_ops are for Xen PV guests
only. Define them only if CONFIG_PARAVIRT_XXL is set.

Signed-off-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: xen-devel@lists.xenproject.org
Cc: virtualization@lists.linux-foundation.org
Cc: akataria@vmware.com
Cc: rusty@rustcorp.com.au
Cc: boris.ostrovsky@oracle.com
Cc: hpa@zytor.com
Link: https://lkml.kernel.org/r/20180828074026.820-15-jgross@suse.com
12 files changed:
arch/x86/include/asm/fixmap.h
arch/x86/include/asm/mmu_context.h
arch/x86/include/asm/paravirt.h
arch/x86/include/asm/paravirt_types.h
arch/x86/include/asm/pgalloc.h
arch/x86/include/asm/pgtable.h
arch/x86/include/asm/special_insns.h
arch/x86/kernel/asm-offsets.c
arch/x86/kernel/head_64.S
arch/x86/kernel/paravirt.c
arch/x86/kernel/paravirt_patch_32.c
arch/x86/kernel/paravirt_patch_64.c

index e203169931c721b7958c940694458c11a270b982..ac80e7eadc3a9e594042bcc5ab0b60292fcc0299 100644 (file)
@@ -152,7 +152,7 @@ void __native_set_fixmap(enum fixed_addresses idx, pte_t pte);
 void native_set_fixmap(enum fixed_addresses idx,
                       phys_addr_t phys, pgprot_t flags);
 
-#ifndef CONFIG_PARAVIRT
+#ifndef CONFIG_PARAVIRT_XXL
 static inline void __set_fixmap(enum fixed_addresses idx,
                                phys_addr_t phys, pgprot_t flags)
 {
index eeeb9289c764db96099caea715682411d79396c8..0ca50611e8cec0b5af0f29947bee90761bc76ef1 100644 (file)
 
 extern atomic64_t last_mm_ctx_id;
 
-#ifndef CONFIG_PARAVIRT
+#ifndef CONFIG_PARAVIRT_XXL
 static inline void paravirt_activate_mm(struct mm_struct *prev,
                                        struct mm_struct *next)
 {
 }
-#endif /* !CONFIG_PARAVIRT */
+#endif /* !CONFIG_PARAVIRT_XXL */
 
 #ifdef CONFIG_PERF_EVENTS
 
index 512433c56c339989ebfae4fae4d5d2f6857d1038..63ab58dc5b73b6086f0aabaa6364455a32826fa9 100644 (file)
 #include <linux/cpumask.h>
 #include <asm/frame.h>
 
+static inline unsigned long long paravirt_sched_clock(void)
+{
+       return PVOP_CALL0(unsigned long long, time.sched_clock);
+}
+
+struct static_key;
+extern struct static_key paravirt_steal_enabled;
+extern struct static_key paravirt_steal_rq_enabled;
+
+static inline u64 paravirt_steal_clock(int cpu)
+{
+       return PVOP_CALL1(u64, time.steal_clock, cpu);
+}
+
+/* The paravirtualized I/O functions */
+static inline void slow_down_io(void)
+{
+       pv_ops.cpu.io_delay();
+#ifdef REALLY_SLOW_IO
+       pv_ops.cpu.io_delay();
+       pv_ops.cpu.io_delay();
+       pv_ops.cpu.io_delay();
+#endif
+}
+
+static inline void __flush_tlb(void)
+{
+       PVOP_VCALL0(mmu.flush_tlb_user);
+}
+
+static inline void __flush_tlb_global(void)
+{
+       PVOP_VCALL0(mmu.flush_tlb_kernel);
+}
+
+static inline void __flush_tlb_one_user(unsigned long addr)
+{
+       PVOP_VCALL1(mmu.flush_tlb_one_user, addr);
+}
+
+static inline void flush_tlb_others(const struct cpumask *cpumask,
+                                   const struct flush_tlb_info *info)
+{
+       PVOP_VCALL2(mmu.flush_tlb_others, cpumask, info);
+}
+
+static inline void paravirt_tlb_remove_table(struct mmu_gather *tlb, void *table)
+{
+       PVOP_VCALL2(mmu.tlb_remove_table, tlb, table);
+}
+
+static inline void paravirt_arch_exit_mmap(struct mm_struct *mm)
+{
+       PVOP_VCALL1(mmu.exit_mmap, mm);
+}
+
 #ifdef CONFIG_PARAVIRT_XXL
 static inline void load_sp0(unsigned long sp0)
 {
@@ -52,7 +108,6 @@ static inline void write_cr0(unsigned long x)
 {
        PVOP_VCALL1(cpu.write_cr0, x);
 }
-#endif
 
 static inline unsigned long read_cr2(void)
 {
@@ -74,7 +129,6 @@ static inline void write_cr3(unsigned long x)
        PVOP_VCALL1(mmu.write_cr3, x);
 }
 
-#ifdef CONFIG_PARAVIRT_XXL
 static inline void __write_cr4(unsigned long x)
 {
        PVOP_VCALL1(cpu.write_cr4, x);
@@ -172,23 +226,7 @@ static inline int rdmsrl_safe(unsigned msr, unsigned long long *p)
        *p = paravirt_read_msr_safe(msr, &err);
        return err;
 }
-#endif
 
-static inline unsigned long long paravirt_sched_clock(void)
-{
-       return PVOP_CALL0(unsigned long long, time.sched_clock);
-}
-
-struct static_key;
-extern struct static_key paravirt_steal_enabled;
-extern struct static_key paravirt_steal_rq_enabled;
-
-static inline u64 paravirt_steal_clock(int cpu)
-{
-       return PVOP_CALL1(u64, time.steal_clock, cpu);
-}
-
-#ifdef CONFIG_PARAVIRT_XXL
 static inline unsigned long long paravirt_read_pmc(int counter)
 {
        return PVOP_CALL1(u64, cpu.read_pmc, counter);
@@ -267,18 +305,6 @@ static inline void set_iopl_mask(unsigned mask)
 {
        PVOP_VCALL1(cpu.set_iopl_mask, mask);
 }
-#endif
-
-/* The paravirtualized I/O functions */
-static inline void slow_down_io(void)
-{
-       pv_ops.cpu.io_delay();
-#ifdef REALLY_SLOW_IO
-       pv_ops.cpu.io_delay();
-       pv_ops.cpu.io_delay();
-       pv_ops.cpu.io_delay();
-#endif
-}
 
 static inline void paravirt_activate_mm(struct mm_struct *prev,
                                        struct mm_struct *next)
@@ -292,35 +318,6 @@ static inline void paravirt_arch_dup_mmap(struct mm_struct *oldmm,
        PVOP_VCALL2(mmu.dup_mmap, oldmm, mm);
 }
 
-static inline void paravirt_arch_exit_mmap(struct mm_struct *mm)
-{
-       PVOP_VCALL1(mmu.exit_mmap, mm);
-}
-
-static inline void __flush_tlb(void)
-{
-       PVOP_VCALL0(mmu.flush_tlb_user);
-}
-static inline void __flush_tlb_global(void)
-{
-       PVOP_VCALL0(mmu.flush_tlb_kernel);
-}
-static inline void __flush_tlb_one_user(unsigned long addr)
-{
-       PVOP_VCALL1(mmu.flush_tlb_one_user, addr);
-}
-
-static inline void flush_tlb_others(const struct cpumask *cpumask,
-                                   const struct flush_tlb_info *info)
-{
-       PVOP_VCALL2(mmu.flush_tlb_others, cpumask, info);
-}
-
-static inline void paravirt_tlb_remove_table(struct mmu_gather *tlb, void *table)
-{
-       PVOP_VCALL2(mmu.tlb_remove_table, tlb, table);
-}
-
 static inline int paravirt_pgd_alloc(struct mm_struct *mm)
 {
        return PVOP_CALL1(int, mmu.pgd_alloc, mm);
@@ -623,7 +620,6 @@ static inline void pmd_clear(pmd_t *pmdp)
 }
 #endif /* CONFIG_X86_PAE */
 
-#ifdef CONFIG_PARAVIRT_XXL
 #define  __HAVE_ARCH_START_CONTEXT_SWITCH
 static inline void arch_start_context_switch(struct task_struct *prev)
 {
@@ -634,7 +630,6 @@ static inline void arch_end_context_switch(struct task_struct *next)
 {
        PVOP_VCALL1(cpu.end_context_switch, next);
 }
-#endif
 
 #define  __HAVE_ARCH_ENTER_LAZY_MMU_MODE
 static inline void arch_enter_lazy_mmu_mode(void)
@@ -657,6 +652,7 @@ static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,
 {
        pv_ops.mmu.set_fixmap(idx, phys, flags);
 }
+#endif
 
 #if defined(CONFIG_SMP) && defined(CONFIG_PARAVIRT_SPINLOCKS)
 
@@ -948,15 +944,20 @@ extern void default_banner(void);
 #endif /* __ASSEMBLY__ */
 #else  /* CONFIG_PARAVIRT */
 # define default_banner x86_init_noop
+#endif /* !CONFIG_PARAVIRT */
+
 #ifndef __ASSEMBLY__
+#ifndef CONFIG_PARAVIRT_XXL
 static inline void paravirt_arch_dup_mmap(struct mm_struct *oldmm,
                                          struct mm_struct *mm)
 {
 }
+#endif
 
+#ifndef CONFIG_PARAVIRT
 static inline void paravirt_arch_exit_mmap(struct mm_struct *mm)
 {
 }
+#endif
 #endif /* __ASSEMBLY__ */
-#endif /* !CONFIG_PARAVIRT */
 #endif /* _ASM_X86_PARAVIRT_H */
index f582093b52dd596177805e36f3a420563c39ad9b..a0094aaf073ec58792f21ab08e5da6e93ff62a2f 100644 (file)
@@ -91,13 +91,14 @@ struct pv_init_ops {
                          unsigned long addr, unsigned len);
 } __no_randomize_layout;
 
-
+#ifdef CONFIG_PARAVIRT_XXL
 struct pv_lazy_ops {
        /* Set deferred update mode, used for batching operations. */
        void (*enter)(void);
        void (*leave)(void);
        void (*flush)(void);
 } __no_randomize_layout;
+#endif
 
 struct pv_time_ops {
        unsigned long long (*sched_clock)(void);
@@ -205,31 +206,30 @@ struct pv_irq_ops {
 } __no_randomize_layout;
 
 struct pv_mmu_ops {
+       /* TLB operations */
+       void (*flush_tlb_user)(void);
+       void (*flush_tlb_kernel)(void);
+       void (*flush_tlb_one_user)(unsigned long addr);
+       void (*flush_tlb_others)(const struct cpumask *cpus,
+                                const struct flush_tlb_info *info);
+
+       void (*tlb_remove_table)(struct mmu_gather *tlb, void *table);
+
+       /* Hook for intercepting the destruction of an mm_struct. */
+       void (*exit_mmap)(struct mm_struct *mm);
+
+#ifdef CONFIG_PARAVIRT_XXL
        unsigned long (*read_cr2)(void);
        void (*write_cr2)(unsigned long);
 
        unsigned long (*read_cr3)(void);
        void (*write_cr3)(unsigned long);
 
-       /*
-        * Hooks for intercepting the creation/use/destruction of an
-        * mm_struct.
-        */
+       /* Hooks for intercepting the creation/use of an mm_struct. */
        void (*activate_mm)(struct mm_struct *prev,
                            struct mm_struct *next);
        void (*dup_mmap)(struct mm_struct *oldmm,
                         struct mm_struct *mm);
-       void (*exit_mmap)(struct mm_struct *mm);
-
-
-       /* TLB operations */
-       void (*flush_tlb_user)(void);
-       void (*flush_tlb_kernel)(void);
-       void (*flush_tlb_one_user)(unsigned long addr);
-       void (*flush_tlb_others)(const struct cpumask *cpus,
-                                const struct flush_tlb_info *info);
-
-       void (*tlb_remove_table)(struct mmu_gather *tlb, void *table);
 
        /* Hooks for allocating and freeing a pagetable top-level */
        int  (*pgd_alloc)(struct mm_struct *mm);
@@ -304,6 +304,7 @@ struct pv_mmu_ops {
           an mfn.  We can tell which is which from the index. */
        void (*set_fixmap)(unsigned /* enum fixed_addresses */ idx,
                           phys_addr_t phys, pgprot_t flags);
+#endif
 } __no_randomize_layout;
 
 struct arch_spinlock;
index fbd578daa66e97416058e961dd440774fa9ed586..ec7f43327033b5b3fd4bb91878dea9ea0b105e2a 100644 (file)
@@ -8,7 +8,7 @@
 
 static inline int  __paravirt_pgd_alloc(struct mm_struct *mm) { return 0; }
 
-#ifdef CONFIG_PARAVIRT
+#ifdef CONFIG_PARAVIRT_XXL
 #include <asm/paravirt.h>
 #else
 #define paravirt_pgd_alloc(mm) __paravirt_pgd_alloc(mm)
index 5bb0fe3b7e008f7bb8b8b71f6332bfe5934da72f..7b0489ca027a036d1221385bee7814bb36576883 100644 (file)
@@ -55,9 +55,9 @@ extern struct mm_struct *pgd_page_get_mm(struct page *page);
 
 extern pmdval_t early_pmd_flags;
 
-#ifdef CONFIG_PARAVIRT
+#ifdef CONFIG_PARAVIRT_XXL
 #include <asm/paravirt.h>
-#else  /* !CONFIG_PARAVIRT */
+#else  /* !CONFIG_PARAVIRT_XXL */
 #define set_pte(ptep, pte)             native_set_pte(ptep, pte)
 #define set_pte_at(mm, addr, ptep, pte)        native_set_pte_at(mm, addr, ptep, pte)
 
@@ -111,9 +111,6 @@ extern pmdval_t early_pmd_flags;
 #define pte_val(x)     native_pte_val(x)
 #define __pte(x)       native_make_pte(x)
 
-#endif /* CONFIG_PARAVIRT */
-
-#ifndef CONFIG_PARAVIRT_XXL
 #define arch_end_context_switch(prev)  do {} while(0)
 #endif /* CONFIG_PARAVIRT_XXL */
 
index 2aa6ce4bf1590c5cbe5c928894bc06aa5b6e8410..43c029cdc3fe8764a8b812084b943129a66e0e58 100644 (file)
@@ -141,11 +141,10 @@ static inline unsigned long __read_cr4(void)
        return native_read_cr4();
 }
 
-#ifdef CONFIG_PARAVIRT
+#ifdef CONFIG_PARAVIRT_XXL
 #include <asm/paravirt.h>
-#endif
+#else
 
-#ifndef CONFIG_PARAVIRT_XXL
 static inline unsigned long read_cr0(void)
 {
        return native_read_cr0();
@@ -155,9 +154,7 @@ static inline void write_cr0(unsigned long x)
 {
        native_write_cr0(x);
 }
-#endif
 
-#ifndef CONFIG_PARAVIRT
 static inline unsigned long read_cr2(void)
 {
        return native_read_cr2();
@@ -181,9 +178,7 @@ static inline void write_cr3(unsigned long x)
 {
        native_write_cr3(x);
 }
-#endif
 
-#ifndef CONFIG_PARAVIRT_XXL
 static inline void __write_cr4(unsigned long x)
 {
        native_write_cr4(x);
@@ -213,7 +208,7 @@ static inline void load_gs_index(unsigned selector)
 
 #endif
 
-#endif/* CONFIG_PARAVIRT_XXL */
+#endif /* CONFIG_PARAVIRT_XXL */
 
 static inline void clflush(volatile void *__p)
 {
index 28e7572ff74d51f358fcf04b39b66affa6bc7023..fc02c3cf238f41891b0fd2d0d1aa8deaad016d62 100644 (file)
@@ -64,13 +64,11 @@ void common(void) {
        OFFSET(IA32_RT_SIGFRAME_sigcontext, rt_sigframe_ia32, uc.uc_mcontext);
 #endif
 
-#ifdef CONFIG_PARAVIRT
-       BLANK();
 #ifdef CONFIG_PARAVIRT_XXL
+       BLANK();
        OFFSET(PV_IRQ_irq_disable, paravirt_patch_template, irq.irq_disable);
        OFFSET(PV_IRQ_irq_enable, paravirt_patch_template, irq.irq_enable);
        OFFSET(PV_CPU_iret, paravirt_patch_template, cpu.iret);
-#endif
        OFFSET(PV_MMU_read_cr2, paravirt_patch_template, mmu.read_cr2);
 #endif
 
index a5bd72a0ee1a0b3d2cdfff66f83932a64cf72964..827bca2c278275627790083b8b85c5be688e176c 100644 (file)
 #include <asm/export.h>
 #include <asm/nospec-branch.h>
 
-#ifdef CONFIG_PARAVIRT
+#ifdef CONFIG_PARAVIRT_XXL
 #include <asm/asm-offsets.h>
 #include <asm/paravirt.h>
 #define GET_CR2_INTO(reg) GET_CR2_INTO_RAX ; movq %rax, reg
 #else
 #define GET_CR2_INTO(reg) movq %cr2, reg
-#endif
-#ifndef CONFIG_PARAVIRT_XXL
 #define INTERRUPT_RETURN iretq
 #endif
 
index 5e8226335eaca4d23c8c56d8791d0bd63a4c3889..bbf006fe78d799d1dc9aeaf32e1c68ee02f01a14 100644 (file)
@@ -384,11 +384,6 @@ struct paravirt_patch_template pv_ops = {
 #endif /* CONFIG_PARAVIRT_XXL */
 
        /* Mmu ops. */
-       .mmu.read_cr2           = native_read_cr2,
-       .mmu.write_cr2          = native_write_cr2,
-       .mmu.read_cr3           = __native_read_cr3,
-       .mmu.write_cr3          = native_write_cr3,
-
        .mmu.flush_tlb_user     = native_flush_tlb,
        .mmu.flush_tlb_kernel   = native_flush_tlb_global,
        .mmu.flush_tlb_one_user = native_flush_tlb_one_user,
@@ -396,6 +391,14 @@ struct paravirt_patch_template pv_ops = {
        .mmu.tlb_remove_table   =
                        (void (*)(struct mmu_gather *, void *))tlb_remove_page,
 
+       .mmu.exit_mmap          = paravirt_nop,
+
+#ifdef CONFIG_PARAVIRT_XXL
+       .mmu.read_cr2           = native_read_cr2,
+       .mmu.write_cr2          = native_write_cr2,
+       .mmu.read_cr3           = __native_read_cr3,
+       .mmu.write_cr3          = native_write_cr3,
+
        .mmu.pgd_alloc          = __paravirt_pgd_alloc,
        .mmu.pgd_free           = paravirt_nop,
 
@@ -448,7 +451,6 @@ struct paravirt_patch_template pv_ops = {
        .mmu.make_pgd           = PTE_IDENT,
 
        .mmu.dup_mmap           = paravirt_nop,
-       .mmu.exit_mmap          = paravirt_nop,
        .mmu.activate_mm        = paravirt_nop,
 
        .mmu.lazy_mode = {
@@ -458,6 +460,7 @@ struct paravirt_patch_template pv_ops = {
        },
 
        .mmu.set_fixmap         = native_set_fixmap,
+#endif /* CONFIG_PARAVIRT_XXL */
 
 #if defined(CONFIG_PARAVIRT_SPINLOCKS)
        /* Lock ops. */
index 1d44705c65286b004cd248bfbfc8e927fc9d47dd..d460cbcabcfe08d68730cd24d1e9f12ff6f74a94 100644 (file)
@@ -7,10 +7,10 @@ DEF_NATIVE(irq, irq_enable, "sti");
 DEF_NATIVE(irq, restore_fl, "push %eax; popf");
 DEF_NATIVE(irq, save_fl, "pushf; pop %eax");
 DEF_NATIVE(cpu, iret, "iret");
-#endif
 DEF_NATIVE(mmu, read_cr2, "mov %cr2, %eax");
 DEF_NATIVE(mmu, write_cr3, "mov %eax, %cr3");
 DEF_NATIVE(mmu, read_cr3, "mov %cr3, %eax");
+#endif
 
 #if defined(CONFIG_PARAVIRT_SPINLOCKS)
 DEF_NATIVE(lock, queued_spin_unlock, "movb $0, (%eax)");
@@ -49,10 +49,10 @@ unsigned native_patch(u8 type, void *ibuf, unsigned long addr, unsigned len)
                PATCH_SITE(irq, restore_fl);
                PATCH_SITE(irq, save_fl);
                PATCH_SITE(cpu, iret);
-#endif
                PATCH_SITE(mmu, read_cr2);
                PATCH_SITE(mmu, read_cr3);
                PATCH_SITE(mmu, write_cr3);
+#endif
 #if defined(CONFIG_PARAVIRT_SPINLOCKS)
                case PARAVIRT_PATCH(lock.queued_spin_unlock):
                        if (pv_is_native_spin_unlock()) {
index b00937963a0fd56d26f4e686494a06c6f69c2f71..5ad5bcda9dc61c1504d74a04a92092bd92f7f2e5 100644 (file)
@@ -8,11 +8,9 @@ DEF_NATIVE(irq, irq_disable, "cli");
 DEF_NATIVE(irq, irq_enable, "sti");
 DEF_NATIVE(irq, restore_fl, "pushq %rdi; popfq");
 DEF_NATIVE(irq, save_fl, "pushfq; popq %rax");
-#endif
 DEF_NATIVE(mmu, read_cr2, "movq %cr2, %rax");
 DEF_NATIVE(mmu, read_cr3, "movq %cr3, %rax");
 DEF_NATIVE(mmu, write_cr3, "movq %rdi, %cr3");
-#ifdef CONFIG_PARAVIRT_XXL
 DEF_NATIVE(cpu, wbinvd, "wbinvd");
 
 DEF_NATIVE(cpu, usergs_sysret64, "swapgs; sysretq");
@@ -61,10 +59,10 @@ unsigned native_patch(u8 type, void *ibuf, unsigned long addr, unsigned len)
                PATCH_SITE(cpu, usergs_sysret64);
                PATCH_SITE(cpu, swapgs);
                PATCH_SITE(cpu, wbinvd);
-#endif
                PATCH_SITE(mmu, read_cr2);
                PATCH_SITE(mmu, read_cr3);
                PATCH_SITE(mmu, write_cr3);
+#endif
 #if defined(CONFIG_PARAVIRT_SPINLOCKS)
                case PARAVIRT_PATCH(lock.queued_spin_unlock):
                        if (pv_is_native_spin_unlock()) {