Damien Zammit, le sam. 12 juil. 2025 11:30:01 +0000, a ecrit:
> Also, do the lapic eoi before the ioapic eoi.
Why?
> Add code for conditioning on TMR bit, but keep it disabled for now.
>
> TESTED: on SMP and UP+apic: receives a large file over rumpnet.
>
> ---
> i386/i386/irq.c | 23 +++++++++++++++--------
> i386/i386at/ioapic.c | 26 +++++++++++++++++++-------
> 2 files changed, 34 insertions(+), 15 deletions(-)
>
> diff --git a/i386/i386/irq.c b/i386/i386/irq.c
> index 30457a3d..9d96578e 100644
> --- a/i386/i386/irq.c
> +++ b/i386/i386/irq.c
> /* Each array elem fits in a cache line */
> struct nested_irq {
> simple_lock_irq_data_t irq_lock;
> @@ -41,6 +33,21 @@ struct nested_irq {
> uint32_t unused[14];
> } __attribute__((packed)) nested_irqs[NINTR];
>
> +static void
> +irq_eoi (struct irqdev *dev, int id)
> +{
> +#ifdef APIC
> + int irq_nr = dev->irq[id];
> + struct nested_irq *nirq = &nested_irqs[irq_nr];
> +
> + spl_t s = simple_lock_irq(&nirq->irq_lock);
That doesn't protect more than what we already protect thanks to
ioapic_lock.
> + ioapic_irq_eoi (irq_nr);
> +
> + simple_unlock_irq(s, &nirq->irq_lock);
> +#endif
> +}
> +
> void
> init_irqs (void)
> {
Samuel