Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d85cf93d authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Thomas Gleixner
Browse files

x86/paravirt: make arch_flush_lazy_mmu/cpu disable preemption



Impact: avoid access to percpu vars in preempible context

They are intended to be used whenever there's the possibility
that there's some stale state which is going to be overwritten
with a queued update, or to force a state change when we may be
in lazy mode.  Either way, we could end up calling it with
preemption enabled, so wrap the functions in their own little
preempt-disable section so they can be safely called in any
context (though preemption should never be enabled if we're actually
in a lazy state).

(Move out of line to avoid #include dependencies.)
    
Signed-off-by: default avatarJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent be03d9e8
Loading
Loading
Loading
Loading
+2 −15
Original line number Original line Diff line number Diff line
@@ -1352,14 +1352,7 @@ static inline void arch_leave_lazy_cpu_mode(void)
	PVOP_VCALL0(pv_cpu_ops.lazy_mode.leave);
	PVOP_VCALL0(pv_cpu_ops.lazy_mode.leave);
}
}


static inline void arch_flush_lazy_cpu_mode(void)
void arch_flush_lazy_cpu_mode(void);
{
	if (unlikely(paravirt_get_lazy_mode() == PARAVIRT_LAZY_CPU)) {
		arch_leave_lazy_cpu_mode();
		arch_enter_lazy_cpu_mode();
	}
}



#define  __HAVE_ARCH_ENTER_LAZY_MMU_MODE
#define  __HAVE_ARCH_ENTER_LAZY_MMU_MODE
static inline void arch_enter_lazy_mmu_mode(void)
static inline void arch_enter_lazy_mmu_mode(void)
@@ -1372,13 +1365,7 @@ static inline void arch_leave_lazy_mmu_mode(void)
	PVOP_VCALL0(pv_mmu_ops.lazy_mode.leave);
	PVOP_VCALL0(pv_mmu_ops.lazy_mode.leave);
}
}


static inline void arch_flush_lazy_mmu_mode(void)
void arch_flush_lazy_mmu_mode(void);
{
	if (unlikely(paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU)) {
		arch_leave_lazy_mmu_mode();
		arch_enter_lazy_mmu_mode();
	}
}


static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,
static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,
				unsigned long phys, pgprot_t flags)
				unsigned long phys, pgprot_t flags)
+24 −0
Original line number Original line Diff line number Diff line
@@ -268,6 +268,30 @@ enum paravirt_lazy_mode paravirt_get_lazy_mode(void)
	return __get_cpu_var(paravirt_lazy_mode);
	return __get_cpu_var(paravirt_lazy_mode);
}
}


void arch_flush_lazy_mmu_mode(void)
{
	preempt_disable();

	if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU) {
		arch_leave_lazy_mmu_mode();
		arch_enter_lazy_mmu_mode();
	}

	preempt_enable();
}

void arch_flush_lazy_cpu_mode(void)
{
	preempt_disable();

	if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_CPU) {
		arch_leave_lazy_cpu_mode();
		arch_enter_lazy_cpu_mode();
	}

	preempt_enable();
}

struct pv_info pv_info = {
struct pv_info pv_info = {
	.name = "bare hardware",
	.name = "bare hardware",
	.paravirt_enabled = 0,
	.paravirt_enabled = 0,