1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-15 10:17:20 +00:00

xen: automatically disable MSI-X interrupt migration

If the hypervisor version is smaller than 4.6.0. Xen commits 74fd00 and
70a3cb are required on the hypervisor side for this to be fixed, and those
are only included in 4.6.0, so stay on the safe side and disable MSI-X
interrupt migration on anything older than 4.6.0.

It should not cause major performance degradation unless a lot of MSI-X
interrupts are allocated.

Sponsored by:		Citrix Systems R&D
MFC after:		3 days
Reviewed by:		jhb
Differential revision:	https://reviews.freebsd.org/D7148
This commit is contained in:
Roger Pau Monné 2016-07-12 08:43:09 +00:00
parent 99e315276a
commit 302244700f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=302635
4 changed files with 38 additions and 5 deletions

View File

@ -149,6 +149,8 @@ extern cpuset_t intr_cpus;
extern struct mtx icu_lock;
extern int elcr_found;
extern int msix_disable_migration;
#ifndef DEV_ATPIC
void atpic_reset(void);
#endif

View File

@ -140,6 +140,8 @@ extern cpuset_t intr_cpus;
extern struct mtx icu_lock;
extern int elcr_found;
extern int msix_disable_migration;
#ifndef DEV_ATPIC
void atpic_reset(void);
#endif

View File

@ -149,12 +149,16 @@ struct pic msi_pic = {
.pic_reprogram_pin = NULL,
};
/*
/**
* Xen hypervisors prior to 4.6.0 do not properly handle updates to
* enabled MSI-X table entries. Allow migration of MSI-X interrupts
* to be disabled via a tunable.
* to be disabled via a tunable. Values have the following meaning:
*
* -1: automatic detection by FreeBSD
* 0: enable migration
* 1: disable migration
*/
static int msix_disable_migration = 0;
int msix_disable_migration = -1;
SYSCTL_INT(_machdep, OID_AUTO, disable_msix_migration, CTLFLAG_RDTUN,
&msix_disable_migration, 0,
"Disable migration of MSI-X interrupts between CPUs");
@ -312,6 +316,11 @@ msi_init(void)
return;
}
if (msix_disable_migration == -1) {
/* The default is to allow migration of MSI-X interrupts. */
msix_disable_migration = 0;
}
msi_enabled = 1;
intr_register_pic(&msi_pic);
mtx_init(&msi_lock, "msi", NULL, MTX_DEF);

View File

@ -134,9 +134,29 @@ xen_hvm_init_hypercall_stubs(enum xen_hvm_init_type init_type)
return (ENXIO);
if (init_type == XEN_HVM_INIT_COLD) {
int major, minor;
do_cpuid(base + 1, regs);
printf("XEN: Hypervisor version %d.%d detected.\n",
regs[0] >> 16, regs[0] & 0xffff);
major = regs[0] >> 16;
minor = regs[0] & 0xffff;
printf("XEN: Hypervisor version %d.%d detected.\n", major,
minor);
if (((major < 4) || (major == 4 && minor <= 5)) &&
msix_disable_migration == -1) {
/*
* Xen hypervisors prior to 4.6.0 do not properly
* handle updates to enabled MSI-X table entries,
* so disable MSI-X interrupt migration in that
* case.
*/
if (bootverbose)
printf(
"Disabling MSI-X interrupt migration due to Xen hypervisor bug.\n"
"Set machdep.msix_disable_migration=0 to forcefully enable it.\n");
msix_disable_migration = 1;
}
}
/*