Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F137597113
D17977.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D17977.diff
View Options
Index: head/sys/x86/include/intr_machdep.h
===================================================================
--- head/sys/x86/include/intr_machdep.h
+++ head/sys/x86/include/intr_machdep.h
@@ -58,11 +58,11 @@
* the minimum IRQ value for MSI interrupts to attempt to leave 255
* unused since 255 is used in PCI to indicate an invalid INTx IRQ.
*/
-#define NUM_MSI_INTS 512
#define MINIMUM_MSI_INT 256
extern u_int first_msi_irq;
extern u_int num_io_irqs;
+extern u_int num_msi_irqs;
/*
* Default base address for MSI messages on x86 platforms.
Index: head/sys/x86/x86/msi.c
===================================================================
--- head/sys/x86/x86/msi.c
+++ head/sys/x86/x86/msi.c
@@ -44,6 +44,7 @@
#include <sys/param.h>
#include <sys/bus.h>
#include <sys/kernel.h>
+#include <sys/limits.h>
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/mutex.h>
@@ -153,6 +154,10 @@
u_int first_msi_irq;
+u_int num_msi_irqs = 512;
+SYSCTL_UINT(_machdep, OID_AUTO, num_msi_irqs, CTLFLAG_RDTUN, &num_msi_irqs, 0,
+ "Number of IRQs reserved for MSI and MSI-X interrupts");
+
#ifdef SMP
/**
* Xen hypervisors prior to 4.6.0 do not properly handle updates to
@@ -331,8 +336,13 @@
}
#endif
+ if (num_msi_irqs == 0)
+ return;
+
first_msi_irq = max(MINIMUM_MSI_INT, num_io_irqs);
- num_io_irqs = first_msi_irq + NUM_MSI_INTS;
+ if (num_msi_irqs > UINT_MAX - first_msi_irq)
+ panic("num_msi_irq too high");
+ num_io_irqs = first_msi_irq + num_msi_irqs;
msi_enabled = 1;
intr_register_pic(&msi_pic);
@@ -346,7 +356,7 @@
u_int irq;
mtx_lock(&msi_lock);
- if (msi_last_irq >= NUM_MSI_INTS) {
+ if (msi_last_irq >= num_msi_irqs) {
mtx_unlock(&msi_lock);
return;
}
@@ -390,7 +400,7 @@
/* Try to find 'count' free IRQs. */
cnt = 0;
- for (i = first_msi_irq; i < first_msi_irq + NUM_MSI_INTS; i++) {
+ for (i = first_msi_irq; i < first_msi_irq + num_msi_irqs; i++) {
msi = (struct msi_intsrc *)intr_lookup_source(i);
/* End of allocated sources, so break. */
@@ -409,7 +419,7 @@
/* Do we need to create some new sources? */
if (cnt < count) {
/* If we would exceed the max, give up. */
- if (i + (count - cnt) > first_msi_irq + NUM_MSI_INTS) {
+ if (i + (count - cnt) > first_msi_irq + num_msi_irqs) {
mtx_unlock(&msi_lock);
free(mirqs, M_MSI);
return (ENXIO);
@@ -585,7 +595,7 @@
#ifdef ACPI_DMAR
if (!msi->msi_msix) {
for (k = msi->msi_count - 1, i = first_msi_irq; k > 0 &&
- i < first_msi_irq + NUM_MSI_INTS; i++) {
+ i < first_msi_irq + num_msi_irqs; i++) {
if (i == msi->msi_irq)
continue;
msi1 = (struct msi_intsrc *)intr_lookup_source(i);
@@ -635,7 +645,7 @@
mtx_lock(&msi_lock);
/* Find a free IRQ. */
- for (i = first_msi_irq; i < first_msi_irq + NUM_MSI_INTS; i++) {
+ for (i = first_msi_irq; i < first_msi_irq + num_msi_irqs; i++) {
msi = (struct msi_intsrc *)intr_lookup_source(i);
/* End of allocated sources, so break. */
@@ -648,7 +658,7 @@
}
/* Are all IRQs in use? */
- if (i == first_msi_irq + NUM_MSI_INTS) {
+ if (i == first_msi_irq + num_msi_irqs) {
mtx_unlock(&msi_lock);
return (ENXIO);
}
Index: head/sys/x86/xen/xen_intr.c
===================================================================
--- head/sys/x86/xen/xen_intr.c
+++ head/sys/x86/xen/xen_intr.c
@@ -690,6 +690,8 @@
xen_intr_alloc_irqs(void)
{
+ if (num_io_irqs > UINT_MAX - NR_EVENT_CHANNELS)
+ panic("IRQ allocation overflow (num_msi_irqs too high?)");
first_evtchn_irq = num_io_irqs;
num_io_irqs += NR_EVENT_CHANNELS;
}
Index: head/sys/x86/xen/xen_msi.c
===================================================================
--- head/sys/x86/xen/xen_msi.c
+++ head/sys/x86/xen/xen_msi.c
@@ -30,6 +30,7 @@
#include <sys/param.h>
#include <sys/bus.h>
#include <sys/kernel.h>
+#include <sys/limits.h>
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/mutex.h>
@@ -57,7 +58,9 @@
MPASS(num_io_irqs > 0);
first_msi_irq = min(MINIMUM_MSI_INT, num_io_irqs);
- num_io_irqs = first_msi_irq + NUM_MSI_INTS;
+ if (num_msi_irqs > UINT_MAX - first_msi_irq)
+ panic("num_msi_irq too high");
+ num_io_irqs = first_msi_irq + num_msi_irqs;
mtx_init(&msi_lock, "msi", NULL, MTX_DEF);
}
@@ -73,7 +76,7 @@
mtx_lock(&msi_lock);
/* If we would exceed the max, give up. */
- if ((msi_last_irq + count) > NUM_MSI_INTS) {
+ if (msi_last_irq + count > num_msi_irqs) {
mtx_unlock(&msi_lock);
return (ENXIO);
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Nov 25, 12:58 PM (6 h, 3 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
26135158
Default Alt Text
D17977.diff (4 KB)
Attached To
Mode
D17977: Convert the number of MSI IRQs on x86 from a constant to a tunable.
Attached
Detach File
Event Timeline
Log In to Comment