|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 2/3] x86/msi: don't use cached address and data fields in msi_desc for dump_msi()
On Thu, Mar 06, 2025 at 05:45:27PM +0100, Jan Beulich wrote:
> On 06.03.2025 15:57, Roger Pau Monne wrote:
> > Instead compose a dummy MSI message just for the purpose of getting the
> > delivery attributes, which are the same for all messages. Note that the
> > previous usage of the cached MSI message wasn't fetching the hardware MSI
> > fields either.
>
> This feels not future proof. There's no guarantee special IRQs (HPET, IOMMU)
> would necessarily use msi_compose_msg() (or any open-coded subset thereof).
Hm, even if not using msi_compose_msg() I don't see how any device
would use a different MSI settings from physical delivery and fixed
destination. I think it's unlikely for a device to use anything
different from the current values set by msi_compose_msg().
Otherwise I can see about returning whether the entry needs to be
updated from iommu_update_ire_from_msi() (if the offset into the IRT
for the entry has changed). However that requires adding code to both
AMD and Intel IOMMU implementations, and will need at least a way to
signal that the MSI fields must forcefully be written on resume.
> > --- a/xen/arch/x86/msi.c
> > +++ b/xen/arch/x86/msi.c
> > @@ -1454,6 +1454,16 @@ void __init early_msi_init(void)
> > static void cf_check dump_msi(unsigned char key)
> > {
> > unsigned int irq;
> > + struct msi_msg msg = {};
> > + uint32_t addr, data;
> > +
> > + /*
> > + * Compose a dummy msg message for the purpose of getting the delivery
> > + * attributes.
> > + */
> > + msi_compose_msg(FIRST_DYNAMIC_VECTOR, NULL, &msg);
> > + addr = msg.address_lo;
> > + data = msg.data;
> >
> > printk("MSI information:\n");
> >
> > @@ -1461,7 +1471,7 @@ static void cf_check dump_msi(unsigned char key)
> > {
> > struct irq_desc *desc = irq_to_desc(irq);
> > const struct msi_desc *entry;
> > - u32 addr, data, dest32;
> > + uint32_t dest32;
> > signed char mask;
> > struct msi_attrib attr;
> > unsigned long flags;
> > @@ -1495,8 +1505,6 @@ static void cf_check dump_msi(unsigned char key)
> > break;
> > }
> >
> > - data = entry->msg.data;
> > - addr = entry->msg.address_lo;
> > dest32 = entry->msg.dest32;
> > attr = entry->msi_attrib;
> > if ( entry->msi_attrib.type )
> > @@ -1512,8 +1520,7 @@ static void cf_check dump_msi(unsigned char key)
> > mask = '?';
> > printk(" %-6s%4u vec=%02x%7s%6s%3sassert%5s%7s"
> > " dest=%08x mask=%d/%c%c/%c\n",
> > - type, irq,
> > - (data & MSI_DATA_VECTOR_MASK) >> MSI_DATA_VECTOR_SHIFT,
> > + type, irq, desc->arch.vector,
>
> We've already dropped desc's lock, so shouldn't be de-referencing desc
> anymore.
Right, I need to cache it before dropping the lock.
> > data & MSI_DATA_DELIVERY_LOWPRI ? "lowest" : "fixed",
> > data & MSI_DATA_TRIGGER_LEVEL ? "level" : "edge",
> > data & MSI_DATA_LEVEL_ASSERT ? "" : "de",
>
> To add to the comment at the top, plus taking patch 1 into account: If we
> uniformly used the output of the dummy msi_compose_msg() invocation, why would
> we even bother to log information conditionally upon what is in data/addr?
We could change what's set by msi_compose_msg(), and then the
information here would be incorrect (if hardcoded).
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |