summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2009-06-15 13:47:49 +0000
committermav <mav@FreeBSD.org>2009-06-15 13:47:49 +0000
commitc4234dfc7eb9855be96c4fc7f7b6ab1dc5274b13 (patch)
tree18c6a630c0cb43a9a423e1fbb62a505e5c6dd323
parentcf1afc177475da72b2247c2c7cdcd6f65e8f2ea7 (diff)
downloadFreeBSD-src-c4234dfc7eb9855be96c4fc7f7b6ab1dc5274b13.zip
FreeBSD-src-c4234dfc7eb9855be96c4fc7f7b6ab1dc5274b13.tar.gz
Forbid multi-vector MSI interrupt vectors migration to another CPU once
allocated. MSI have strict vectors allocation requirements, which are not satisfied now during reallocation. This is not the best possible solution, but better then just broken, as it was. No objections: current@, arch@, jhb@
-rw-r--r--sys/amd64/amd64/msi.c2
-rw-r--r--sys/i386/i386/msi.c2
2 files changed, 4 insertions, 0 deletions
diff --git a/sys/amd64/amd64/msi.c b/sys/amd64/amd64/msi.c
index b34d835..0583541 100644
--- a/sys/amd64/amd64/msi.c
+++ b/sys/amd64/amd64/msi.c
@@ -210,6 +210,8 @@ msi_assign_cpu(struct intsrc *isrc, u_int apic_id)
old_id = msi->msi_cpu;
if (old_vector && old_id == apic_id)
return;
+ if (old_vector && !msi->msi_msix && msi->msi_first->msi_count > 1)
+ return;
/* Allocate IDT vector on this cpu. */
vector = apic_alloc_vector(apic_id, msi->msi_irq);
if (vector == 0)
diff --git a/sys/i386/i386/msi.c b/sys/i386/i386/msi.c
index 8b18a10..e42f3d1 100644
--- a/sys/i386/i386/msi.c
+++ b/sys/i386/i386/msi.c
@@ -210,6 +210,8 @@ msi_assign_cpu(struct intsrc *isrc, u_int apic_id)
old_id = msi->msi_cpu;
if (old_vector && old_id == apic_id)
return;
+ if (old_vector && !msi->msi_msix && msi->msi_first->msi_count > 1)
+ return;
/* Allocate IDT vector on this cpu. */
vector = apic_alloc_vector(apic_id, msi->msi_irq);
if (vector == 0)
OpenPOWER on IntegriCloud