mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-28 21:33:52 +00:00
x86/paravirt: Move the Xen-only pv_mmu_ops under the PARAVIRT_XXL umbrella
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
This commit is contained in:
parent
6da63eb241
commit
fdc0269e89
12 changed files with 105 additions and 114 deletions
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -16,12 +16,12 @@
|
|||
|
||||
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
|
||||
|
||||
|
|
|
@ -17,6 +17,62 @@
|
|||
#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 */
|
||||
|
|
|
@ -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,23 +206,6 @@ struct pv_irq_ops {
|
|||
} __no_randomize_layout;
|
||||
|
||||
struct pv_mmu_ops {
|
||||
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.
|
||||
*/
|
||||
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);
|
||||
|
@ -231,6 +215,22 @@ struct pv_mmu_ops {
|
|||
|
||||
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 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);
|
||||
|
||||
/* Hooks for allocating and freeing a pagetable top-level */
|
||||
int (*pgd_alloc)(struct mm_struct *mm);
|
||||
void (*pgd_free)(struct mm_struct *mm, pgd_t *pgd);
|
||||
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -25,14 +25,12 @@
|
|||
#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
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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()) {
|
||||
|
|
Loading…
Reference in a new issue