qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 3/8] pci/msix: Implement PBA writes


From: Nicholas Piggin
Subject: Re: [PATCH 3/8] pci/msix: Implement PBA writes
Date: Wed, 18 Dec 2024 11:44:50 +1000

On Fri Dec 13, 2024 at 3:14 PM AEST, Akihiko Odaki wrote:
> On 2024/12/12 17:34, Nicholas Piggin wrote:
> > Implement MMIO PBA writes, 1 to trigger and 0 to clear.
> > 
> > This functionality is used by some qtests, which keep the msix irq
> > masked and test irq pending via the PBA bits, for simplicity. Some
> > tests expect to be able to clear the irq with a store, so a side-effect
> > of this is that qpci_msix_pending() would actually clear the pending
> > bit where it previously did not. This actually causes some [possibly
> > buggy] tests to fail. So to avoid breakage until tests are re-examined,
> > prior behavior of qpci_msix_pending() is kept by changing it to avoid
> > clearing PBA.
> > 
> > A new function qpci_msix_test_clear_pending() is added for tests that
> > do want the PBA clearing, and it will be used by XHCI and e1000e/igb
> > tests in subsequent changes.
>
> The specification says software should never write Pending Bits and its 
> result is undefined. Tests should have an alternative method to clear 
> Pending Bits.

Thanks for correcting me. I guess qpci_msix_pending() should not be
trying to write to the PBA either then.

> A possible solution is to unmask the interrupt, wait until the Pending 
> Bits get cleared, and mask it again.

PCI spec says

  If a masked vector has its Pending bit set, and the associated
  underlying interrupt events are somehow satisfied (usually by software
  though the exact manner is function-specific), the function must clear
  the Pending bit, to avoid sending a spurious interrupt message later
  when software unmasks the vector. However, if a subsequent interrupt
  event occurs while the vector is still masked, the function must again
  set the Pending bit.

It looks like e1000e acutally does that with e1000e_msix_clear{_one}.
So perhaps this will work just with the e1000e ICR clearing patch. I
will test.

e1000e and igb are the only devices that call msix_clr_pending. Does
that mean many others probably do not implement this behaviour
correctly?

Thanks,
Nick



reply via email to

[Prev in Thread] Current Thread [Next in Thread]