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
This commit is contained in:
parent
eb33d8ce3e
commit
f36411145e
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=332735
@ -404,7 +404,7 @@ msi_alloc(device_t dev, int count, int maxcount, int *irqs)
|
||||
/* 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 @@ msix_alloc(device_t dev, int *irq)
|
||||
/* 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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user