mirror of
https://github.com/opnsense/src.git
synced 2026-06-08 16:22:46 -04:00
Add a tunable to disable migration of MSI-X interrupts.
The new 'machdep.disable_msix_migration' tunable can be set to 1 to disable migration of MSI-X interrupts. Xen versions prior to 4.6.0 do not properly handle updates to MSI-X table entries after the initial write. In particular, the operation to unmask a table entry after updating it during migration is not propagated to the "real" table for passthrough devices causing the interrupt to remain masked. At least some systems in EC2 are affected by this bug when using SRIOV. The tunable can be set in loader.conf as a workaround. Submitted by: Jeremiah Lott <jlott@averesystems.com> (original patch) Approved by: re (marius) MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D6947
This commit is contained in:
parent
39ba705baf
commit
be0319fd19
1 changed files with 14 additions and 0 deletions
|
|
@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
|
|||
#include <sys/malloc.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/systm.h>
|
||||
#include <x86/apicreg.h>
|
||||
#include <machine/cputypes.h>
|
||||
|
|
@ -148,6 +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.
|
||||
*/
|
||||
static int msix_disable_migration = 0;
|
||||
SYSCTL_INT(_machdep, OID_AUTO, disable_msix_migration, CTLFLAG_RDTUN,
|
||||
&msix_disable_migration, 0,
|
||||
"Disable migration of MSI-X interrupts between CPUs");
|
||||
|
||||
static int msi_enabled;
|
||||
static int msi_last_irq;
|
||||
static struct mtx msi_lock;
|
||||
|
|
@ -226,6 +237,9 @@ msi_assign_cpu(struct intsrc *isrc, u_int apic_id)
|
|||
if (msi->msi_first != msi)
|
||||
return (EINVAL);
|
||||
|
||||
if (msix_disable_migration && msi->msi_msix)
|
||||
return (EINVAL);
|
||||
|
||||
/* Store information to free existing irq. */
|
||||
old_vector = msi->msi_vector;
|
||||
old_id = msi->msi_cpu;
|
||||
|
|
|
|||
Loading…
Reference in a new issue