diff --git a/docs/misc/xen-command-line.markdown b/docs/misc/xen-command-line.markdown index c81d6936b2..bdbdb8a53b 100644 --- a/docs/misc/xen-command-line.markdown +++ b/docs/misc/xen-command-line.markdown @@ -1624,6 +1624,14 @@ relinquish control to dom0. , and must be integers. The values will be encoded in guest CPUID 0x40000002 if viridian enlightenments are enabled. +### viridian-spinlock-retry-count +> `= ` + +> Default: `2047` + +Specify the maximum number of retries before an enlightened Windows +guest will notify Xen that it has failed to acquire a spinlock. + ### vpid (Intel) > `= ` diff --git a/xen/arch/x86/hvm/viridian.c b/xen/arch/x86/hvm/viridian.c index d59294fb18..4c65ddca54 100644 --- a/xen/arch/x86/hvm/viridian.c +++ b/xen/arch/x86/hvm/viridian.c @@ -174,6 +174,14 @@ static uint16_t __read_mostly viridian_major = 6; static uint16_t __read_mostly viridian_minor = 0; static uint32_t __read_mostly viridian_build = 0x1772; +/* + * Maximum number of retries before the guest will notify of failure + * to acquire a spinlock. + */ +static uint32_t __read_mostly viridian_spinlock_retry_count = 2047; +integer_param("viridian-spinlock-retry-count", + viridian_spinlock_retry_count); + void cpuid_viridian_leaves(const struct vcpu *v, uint32_t leaf, uint32_t subleaf, struct cpuid_leaf *res) { @@ -251,7 +259,13 @@ void cpuid_viridian_leaves(const struct vcpu *v, uint32_t leaf, res->a |= CPUID4A_HCALL_REMOTE_TLB_FLUSH; if ( !cpu_has_vmx_apic_reg_virt ) res->a |= CPUID4A_MSR_BASED_APIC; - res->b = 2047; /* long spin count */ + + /* + * This value is the recommended number of attempts to try to + * acquire a spinlock before notifying the hypervisor via the + * HvNotifyLongSpinWait hypercall. + */ + res->b = viridian_spinlock_retry_count; break; case 6: