Commit fb92a1ff authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'hyperv-fixes-signed-20240908' of...

Merge tag 'hyperv-fixes-signed-20240908' of git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux

Pull hyperv fixes from Wei Liu:

 - Add a documentation overview of Confidential Computing VM support
   (Michael Kelley)

 - Use lapic timer in a TDX VM without paravisor (Dexuan Cui)

 - Set X86_FEATURE_TSC_KNOWN_FREQ when Hyper-V provides frequency
   (Michael Kelley)

 - Fix a kexec crash due to VP assist page corruption (Anirudh
   Rayabharam)

 - Python3 compatibility fix for lsvmbus (Anthony Nandaa)

 - Misc fixes (Rachel Menge, Roman Kisel, zhang jiao, Hongbo Li)

* tag 'hyperv-fixes-signed-20240908' of git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux:
  hv: vmbus: Constify struct kobj_type and struct attribute_group
  tools: hv: rm .*.cmd when make clean
  x86/hyperv: fix kexec crash due to VP assist page corruption
  Drivers: hv: vmbus: Fix the misplaced function description
  tools: hv: lsvmbus: change shebang to use python3
  x86/hyperv: Set X86_FEATURE_TSC_KNOWN_FREQ when Hyper-V provides frequency
  Documentation: hyperv: Add overview of Confidential Computing VM support
  clocksource: hyper-v: Use lapic timer in a TDX VM without paravisor
  Drivers: hv: Remove deprecated hv_fcopy declarations
parents da3ea350 89538488
This diff is collapsed.
...@@ -11,3 +11,4 @@ Hyper-V Enlightenments ...@@ -11,3 +11,4 @@ Hyper-V Enlightenments
vmbus vmbus
clocks clocks
vpci vpci
coco
...@@ -35,7 +35,6 @@ ...@@ -35,7 +35,6 @@
#include <clocksource/hyperv_timer.h> #include <clocksource/hyperv_timer.h>
#include <linux/highmem.h> #include <linux/highmem.h>
int hyperv_init_cpuhp;
u64 hv_current_partition_id = ~0ull; u64 hv_current_partition_id = ~0ull;
EXPORT_SYMBOL_GPL(hv_current_partition_id); EXPORT_SYMBOL_GPL(hv_current_partition_id);
...@@ -607,8 +606,6 @@ void __init hyperv_init(void) ...@@ -607,8 +606,6 @@ void __init hyperv_init(void)
register_syscore_ops(&hv_syscore_ops); register_syscore_ops(&hv_syscore_ops);
hyperv_init_cpuhp = cpuhp;
if (cpuid_ebx(HYPERV_CPUID_FEATURES) & HV_ACCESS_PARTITION_ID) if (cpuid_ebx(HYPERV_CPUID_FEATURES) & HV_ACCESS_PARTITION_ID)
hv_get_partition_id(); hv_get_partition_id();
...@@ -637,7 +634,7 @@ void __init hyperv_init(void) ...@@ -637,7 +634,7 @@ void __init hyperv_init(void)
clean_guest_os_id: clean_guest_os_id:
wrmsrl(HV_X64_MSR_GUEST_OS_ID, 0); wrmsrl(HV_X64_MSR_GUEST_OS_ID, 0);
hv_ivm_msr_write(HV_X64_MSR_GUEST_OS_ID, 0); hv_ivm_msr_write(HV_X64_MSR_GUEST_OS_ID, 0);
cpuhp_remove_state(cpuhp); cpuhp_remove_state(CPUHP_AP_HYPERV_ONLINE);
free_ghcb_page: free_ghcb_page:
free_percpu(hv_ghcb_pg); free_percpu(hv_ghcb_pg);
free_vp_assist_page: free_vp_assist_page:
......
...@@ -40,7 +40,6 @@ static inline unsigned char hv_get_nmi_reason(void) ...@@ -40,7 +40,6 @@ static inline unsigned char hv_get_nmi_reason(void)
} }
#if IS_ENABLED(CONFIG_HYPERV) #if IS_ENABLED(CONFIG_HYPERV)
extern int hyperv_init_cpuhp;
extern bool hyperv_paravisor_present; extern bool hyperv_paravisor_present;
extern void *hv_hypercall_pg; extern void *hv_hypercall_pg;
......
...@@ -199,8 +199,8 @@ static void hv_machine_shutdown(void) ...@@ -199,8 +199,8 @@ static void hv_machine_shutdown(void)
* Call hv_cpu_die() on all the CPUs, otherwise later the hypervisor * Call hv_cpu_die() on all the CPUs, otherwise later the hypervisor
* corrupts the old VP Assist Pages and can crash the kexec kernel. * corrupts the old VP Assist Pages and can crash the kexec kernel.
*/ */
if (kexec_in_progress && hyperv_init_cpuhp > 0) if (kexec_in_progress)
cpuhp_remove_state(hyperv_init_cpuhp); cpuhp_remove_state(CPUHP_AP_HYPERV_ONLINE);
/* The function calls stop_other_cpus(). */ /* The function calls stop_other_cpus(). */
native_machine_shutdown(); native_machine_shutdown();
...@@ -424,6 +424,7 @@ static void __init ms_hyperv_init_platform(void) ...@@ -424,6 +424,7 @@ static void __init ms_hyperv_init_platform(void)
ms_hyperv.misc_features & HV_FEATURE_FREQUENCY_MSRS_AVAILABLE) { ms_hyperv.misc_features & HV_FEATURE_FREQUENCY_MSRS_AVAILABLE) {
x86_platform.calibrate_tsc = hv_get_tsc_khz; x86_platform.calibrate_tsc = hv_get_tsc_khz;
x86_platform.calibrate_cpu = hv_get_tsc_khz; x86_platform.calibrate_cpu = hv_get_tsc_khz;
setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ);
} }
if (ms_hyperv.priv_high & HV_ISOLATION) { if (ms_hyperv.priv_high & HV_ISOLATION) {
...@@ -449,9 +450,23 @@ static void __init ms_hyperv_init_platform(void) ...@@ -449,9 +450,23 @@ static void __init ms_hyperv_init_platform(void)
ms_hyperv.hints &= ~HV_X64_APIC_ACCESS_RECOMMENDED; ms_hyperv.hints &= ~HV_X64_APIC_ACCESS_RECOMMENDED;
if (!ms_hyperv.paravisor_present) { if (!ms_hyperv.paravisor_present) {
/* To be supported: more work is required. */ /*
* Mark the Hyper-V TSC page feature as disabled
* in a TDX VM without paravisor so that the
* Invariant TSC, which is a better clocksource
* anyway, is used instead.
*/
ms_hyperv.features &= ~HV_MSR_REFERENCE_TSC_AVAILABLE; ms_hyperv.features &= ~HV_MSR_REFERENCE_TSC_AVAILABLE;
/*
* The Invariant TSC is expected to be available
* in a TDX VM without paravisor, but if not,
* print a warning message. The slower Hyper-V MSR-based
* Ref Counter should end up being the clocksource.
*/
if (!(ms_hyperv.features & HV_ACCESS_TSC_INVARIANT))
pr_warn("Hyper-V: Invariant TSC is unavailable\n");
/* HV_MSR_CRASH_CTL is unsupported. */ /* HV_MSR_CRASH_CTL is unsupported. */
ms_hyperv.misc_features &= ~HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE; ms_hyperv.misc_features &= ~HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE;
......
...@@ -137,7 +137,21 @@ static int hv_stimer_init(unsigned int cpu) ...@@ -137,7 +137,21 @@ static int hv_stimer_init(unsigned int cpu)
ce->name = "Hyper-V clockevent"; ce->name = "Hyper-V clockevent";
ce->features = CLOCK_EVT_FEAT_ONESHOT; ce->features = CLOCK_EVT_FEAT_ONESHOT;
ce->cpumask = cpumask_of(cpu); ce->cpumask = cpumask_of(cpu);
ce->rating = 1000;
/*
* Lower the rating of the Hyper-V timer in a TDX VM without paravisor,
* so the local APIC timer (lapic_clockevent) is the default timer in
* such a VM. The Hyper-V timer is not preferred in such a VM because
* it depends on the slow VM Reference Counter MSR (the Hyper-V TSC
* page is not enbled in such a VM because the VM uses Invariant TSC
* as a better clocksource and it's challenging to mark the Hyper-V
* TSC page shared in very early boot).
*/
if (!ms_hyperv.paravisor_present && hv_isolation_type_tdx())
ce->rating = 90;
else
ce->rating = 1000;
ce->set_state_shutdown = hv_ce_shutdown; ce->set_state_shutdown = hv_ce_shutdown;
ce->set_state_oneshot = hv_ce_set_oneshot; ce->set_state_oneshot = hv_ce_set_oneshot;
ce->set_next_event = hv_ce_set_next_event; ce->set_next_event = hv_ce_set_next_event;
......
...@@ -342,9 +342,6 @@ int hv_synic_init(unsigned int cpu) ...@@ -342,9 +342,6 @@ int hv_synic_init(unsigned int cpu)
return 0; return 0;
} }
/*
* hv_synic_cleanup - Cleanup routine for hv_synic_init().
*/
void hv_synic_disable_regs(unsigned int cpu) void hv_synic_disable_regs(unsigned int cpu)
{ {
struct hv_per_cpu_context *hv_cpu = struct hv_per_cpu_context *hv_cpu =
...@@ -436,6 +433,9 @@ static bool hv_synic_event_pending(void) ...@@ -436,6 +433,9 @@ static bool hv_synic_event_pending(void)
return pending; return pending;
} }
/*
* hv_synic_cleanup - Cleanup routine for hv_synic_init().
*/
int hv_synic_cleanup(unsigned int cpu) int hv_synic_cleanup(unsigned int cpu)
{ {
struct vmbus_channel *channel, *sc; struct vmbus_channel *channel, *sc;
......
...@@ -380,12 +380,6 @@ void hv_vss_deinit(void); ...@@ -380,12 +380,6 @@ void hv_vss_deinit(void);
int hv_vss_pre_suspend(void); int hv_vss_pre_suspend(void);
int hv_vss_pre_resume(void); int hv_vss_pre_resume(void);
void hv_vss_onchannelcallback(void *context); void hv_vss_onchannelcallback(void *context);
int hv_fcopy_init(struct hv_util_service *srv);
void hv_fcopy_deinit(void);
int hv_fcopy_pre_suspend(void);
int hv_fcopy_pre_resume(void);
void hv_fcopy_onchannelcallback(void *context);
void vmbus_initiate_unload(bool crash); void vmbus_initiate_unload(bool crash);
static inline void hv_poll_channel(struct vmbus_channel *channel, static inline void hv_poll_channel(struct vmbus_channel *channel,
......
...@@ -1803,12 +1803,12 @@ static umode_t vmbus_chan_attr_is_visible(struct kobject *kobj, ...@@ -1803,12 +1803,12 @@ static umode_t vmbus_chan_attr_is_visible(struct kobject *kobj,
return attr->mode; return attr->mode;
} }
static struct attribute_group vmbus_chan_group = { static const struct attribute_group vmbus_chan_group = {
.attrs = vmbus_chan_attrs, .attrs = vmbus_chan_attrs,
.is_visible = vmbus_chan_attr_is_visible .is_visible = vmbus_chan_attr_is_visible
}; };
static struct kobj_type vmbus_chan_ktype = { static const struct kobj_type vmbus_chan_ktype = {
.sysfs_ops = &vmbus_chan_sysfs_ops, .sysfs_ops = &vmbus_chan_sysfs_ops,
.release = vmbus_chan_release, .release = vmbus_chan_release,
}; };
......
...@@ -52,7 +52,7 @@ $(OUTPUT)hv_fcopy_uio_daemon: $(HV_FCOPY_UIO_DAEMON_IN) ...@@ -52,7 +52,7 @@ $(OUTPUT)hv_fcopy_uio_daemon: $(HV_FCOPY_UIO_DAEMON_IN)
clean: clean:
rm -f $(ALL_PROGRAMS) rm -f $(ALL_PROGRAMS)
find $(or $(OUTPUT),.) -name '*.o' -delete -o -name '\.*.d' -delete find $(or $(OUTPUT),.) -name '*.o' -delete -o -name '\.*.d' -delete -o -name '\.*.cmd' -delete
install: $(ALL_PROGRAMS) install: $(ALL_PROGRAMS)
install -d -m 755 $(DESTDIR)$(sbindir); \ install -d -m 755 $(DESTDIR)$(sbindir); \
......
#!/usr/bin/env python #!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
import os import os
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment