svn commit: r332735 - head/sys/x86/x86
John Baldwin
jhb at FreeBSD.org
Wed Apr 18 18:45:35 UTC 2018
Author: jhb
Date: Wed Apr 18 18:45:34 2018
New Revision: 332735
URL: https://svnweb.freebsd.org/changeset/base/332735
Log:
Fix two off-by-one errors when allocating MSI and MSI-X interrupts.
x86 enforces an (arbitray) limit on the number of available MSI and
MSI-X interrupts to simplify code (in particular, interrupt_source[]
is statically sized). This means that an attempt to allocate an MSI
vector needs to fail if it would go beyond the limit, but the checks
for exceeding the limit had an off-by-one error. In the case of MSI-X
which allocates interrupts one at a time this meant that IRQ 768 kept
getting handed out multiple times for msix_alloc() instead of failing
because all MSI IRQs were in use.
Tested by: lidl
MFC after: 1 week
Modified:
head/sys/x86/x86/msi.c
Modified: head/sys/x86/x86/msi.c
==============================================================================
--- head/sys/x86/x86/msi.c Wed Apr 18 18:45:04 2018 (r332734)
+++ head/sys/x86/x86/msi.c Wed Apr 18 18:45:34 2018 (r332735)
@@ -404,7 +404,7 @@ again:
/* 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_INT + NUM_MSI_INTS) {
+ if (i + (count - cnt) >= FIRST_MSI_INT + NUM_MSI_INTS) {
mtx_unlock(&msi_lock);
free(mirqs, M_MSI);
return (ENXIO);
@@ -645,7 +645,7 @@ again:
/* Do we need to create a new source? */
if (msi == NULL) {
/* If we would exceed the max, give up. */
- if (i + 1 > FIRST_MSI_INT + NUM_MSI_INTS) {
+ if (i + 1 >= FIRST_MSI_INT + NUM_MSI_INTS) {
mtx_unlock(&msi_lock);
return (ENXIO);
}
More information about the svn-src-head
mailing list