[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 2/5] x86/ioapic: RTE modifications must use ioapic_write_entry
On 18.07.2023 14:43, Roger Pau Monne wrote: > --- a/xen/arch/x86/io_apic.c > +++ b/xen/arch/x86/io_apic.c > @@ -269,15 +269,15 @@ void __ioapic_write_entry( > { > union entry_union eu = { .entry = e }; > > - if ( raw ) > + if ( raw || !iommu_intremap ) > { > __io_apic_write(apic, 0x11 + 2 * pin, eu.w2); > __io_apic_write(apic, 0x10 + 2 * pin, eu.w1); > } > else > { > - io_apic_write(apic, 0x11 + 2 * pin, eu.w2); > - io_apic_write(apic, 0x10 + 2 * pin, eu.w1); > + iommu_update_ire_from_apic(apic, 0x11 + 2 * pin, eu.w2); > + iommu_update_ire_from_apic(apic, 0x10 + 2 * pin, eu.w1); > } > } I think __ioapic_read_entry() wants updating similarly, so that both remain consistent. > @@ -433,16 +433,17 @@ static void modify_IO_APIC_irq(unsigned int irq, > unsigned int enable, > unsigned int disable) > { > struct irq_pin_list *entry = irq_2_pin + irq; > - unsigned int pin, reg; > > for (;;) { > - pin = entry->pin; > + unsigned int pin = entry->pin; > + struct IO_APIC_route_entry rte; > + > if (pin == -1) > break; > - reg = io_apic_read(entry->apic, 0x10 + pin*2); > - reg &= ~disable; > - reg |= enable; > - io_apic_modify(entry->apic, 0x10 + pin*2, reg); > + rte = __ioapic_read_entry(entry->apic, pin, false); > + rte.raw &= ~(uint64_t)disable; > + rte.raw |= enable; > + __ioapic_write_entry(entry->apic, pin, false, rte); While this isn't going to happen overly often, ... > @@ -584,16 +585,16 @@ set_ioapic_affinity_irq(struct irq_desc *desc, const > cpumask_t *mask) > dest = SET_APIC_LOGICAL_ID(dest); > entry = irq_2_pin + irq; > for (;;) { > - unsigned int data; > + struct IO_APIC_route_entry rte; > + > pin = entry->pin; > if (pin == -1) > break; > > - io_apic_write(entry->apic, 0x10 + 1 + pin*2, dest); > - data = io_apic_read(entry->apic, 0x10 + pin*2); > - data &= ~IO_APIC_REDIR_VECTOR_MASK; > - data |= MASK_INSR(desc->arch.vector, IO_APIC_REDIR_VECTOR_MASK); > - io_apic_modify(entry->apic, 0x10 + pin*2, data); > + rte = __ioapic_read_entry(entry->apic, pin, false); > + rte.dest.dest32 = dest; > + rte.vector = desc->arch.vector; > + __ioapic_write_entry(entry->apic, pin, false, rte); ... this makes me wonder whether there shouldn't be an __ioapic_modify_entry() capable of suppressing one of the two writes (but still being handed the full RTE). Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |