Commit dd18a07f authored by Zengruan Ye's avatar Zengruan Ye Committed by lishusen
Browse files

KVM: arm64: Add interface to support vCPU preempted check

virt inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I8WMFU


CVE: NA

--------------------------------

This is to fix some lock holder preemption issues. Some other locks
implementation do a spin loop before acquiring the lock itself.
Currently kernel has an interface of bool vcpu_is_preempted(int cpu). It
takes the CPU as parameter and return true if the CPU is preempted.
Then kernel can break the spin loops upon the retval of vcpu_is_preempted.

As kernel has used this interface, So lets support it.

Signed-off-by: default avatarZengruan Ye <yezengruan@huawei.com>
Signed-off-by: default avatarlishusen <lishusen2@huawei.com>
parent c0d910ff
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -20,6 +20,14 @@ static inline u64 paravirt_steal_clock(int cpu)

int __init pv_time_init(void);

__visible bool __native_vcpu_is_preempted(int cpu);
DECLARE_STATIC_CALL(pv_vcpu_preempted, __native_vcpu_is_preempted);

static inline bool pv_vcpu_is_preempted(int cpu)
{
	return static_call(pv_vcpu_preempted)(cpu);
}

#else

#define pv_time_init() do {} while (0)
+8 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@

#include <asm/qspinlock.h>
#include <asm/qrwlock.h>
#include <asm/paravirt.h>

/* See include/linux/spinlock.h */
#define smp_mb__after_spinlock()	smp_mb()
@@ -19,9 +20,16 @@
 * https://lore.kernel.org/lkml/20200110100612.GC2827@hirez.programming.kicks-ass.net
 */
#define vcpu_is_preempted vcpu_is_preempted
#if defined(CONFIG_PARAVIRT) && defined(CONFIG_PARAVIRT_SCHED)
static inline bool vcpu_is_preempted(int cpu)
{
	return pv_vcpu_is_preempted(cpu);
}
#else
static inline bool vcpu_is_preempted(int cpu)
{
	return false;
}
#endif /* CONFIG_PARAVIRT && CONFIG_PARAVIRT_SCHED */

#endif /* __ASM_SPINLOCK_H */
+1 −1
Original line number Diff line number Diff line
@@ -60,7 +60,7 @@ obj-$(CONFIG_ARMV8_DEPRECATED) += armv8_deprecated.o
obj-$(CONFIG_ACPI)			+= acpi.o
obj-$(CONFIG_ACPI_NUMA)			+= acpi_numa.o
obj-$(CONFIG_ARM64_ACPI_PARKING_PROTOCOL)	+= acpi_parking_protocol.o
obj-$(CONFIG_PARAVIRT)			+= paravirt.o
obj-$(CONFIG_PARAVIRT)			+= paravirt.o paravirt-spinlocks.o
obj-$(CONFIG_RANDOMIZE_BASE)		+= kaslr.o pi/
obj-$(CONFIG_HIBERNATION)		+= hibernate.o hibernate-asm.o
obj-$(CONFIG_ELF_CORE)			+= elfcore.o
+16 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright(c) 2019 Huawei Technologies Co., Ltd
 * Author: Zengruan Ye <yezengruan@huawei.com>
 */

#include <linux/static_call.h>
#include <linux/spinlock.h>
#include <asm/paravirt.h>

__visible bool __native_vcpu_is_preempted(int cpu)
{
	return false;
}

DEFINE_STATIC_CALL(pv_vcpu_preempted, __native_vcpu_is_preempted);