On 2025-10-15 08:59, Jan Beulich wrote:
On 14.10.2025 09:37, Roger Pau Monné wrote:
On Mon, Oct 13, 2025 at 05:11:06PM -0400, Jason Andryuk wrote:
io_apic_level_ack_pending() will end up in an infinite loop if
entry->pin == -1.  entry does not change, so it will keep reading -1.

Do you know how you end up with an entry with pin == -1 on the
irq_pin_list? Are there systems with gaps in the GSI space between
IO-APICs?  So far everything I saw had the IO-APIC in contiguous GSI
space.

Convert to a proper for loop so that continue works.  Add a new helper,
next_entry(), to handle advancing to the next irq_pin_list entry.

Fixes: f821102450a1 ("x86: IRQ Migration logic enhancement.")
Signed-off-by: Jason Andryuk <[email protected]>
---
v2:
continue (not break) for pin == -1.

I added the next_entry() helper since putting the expression in the for
loop is a little cluttered.  The helper can also be re-used for other
instances within the file.

Would this intention ...

--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -1586,14 +1586,21 @@ static int __init cf_check setup_ioapic_ack(const char 
*s)
  }
  custom_param("ioapic_ack", setup_ioapic_ack);
+static struct irq_pin_list *next_entry(struct irq_pin_list *entry)

I think you can make the entry parameter const?

... possibly conflict with such a change?

I changed only the parameter to const, and the return value is still non-const. So I think that will be re-usable.

I placed next_entry() immediately before its use in io_apic_level_ack_pending(). It would need to be earlier in the file to be used more. Should I move its addition earlier?

And another Minor question. Roger asked for ~Linux style in the for loop. But in next_entry() I have Xen style:
    if ( !entry->next )

Should I switch to:
    if (!entry->next)

?

Thanks,
Jason

Reply via email to