[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 2/2] Do not access /dev/mem in MSI-X PCI passthrough on Xen
On Wed, Nov 16, 2022 at 10:40:02PM +0100, Marek Marczykowski-Górecki wrote: > On Wed, Nov 16, 2022 at 02:15:22PM -0500, Jason Andryuk wrote: > > On Mon, Nov 14, 2022 at 2:21 PM Marek Marczykowski-Górecki > > <marmarek@xxxxxxxxxxxxxxxxxxxxxx> wrote: > > > > > > The /dev/mem is used for two purposes: > > > - reading PCI_MSIX_ENTRY_CTRL_MASKBIT > > > - reading Pending Bit Array (PBA) > > > > > > The first one was originally done because when Xen did not send all > > > vector ctrl writes to the device model, so QEMU might have outdated old > > > register value. This has been changed in Xen, so QEMU can now use its > > > cached value of the register instead. > > > > > > The Pending Bit Array (PBA) handling is for the case where it lives on > > > the same page as the MSI-X table itself. Xen has been extended to handle > > > this case too (as well as other registers that may live on those pages), > > > so QEMU handling is not necessary anymore. > > > > > > Removing /dev/mem access is useful to work within stubdomain, and > > > necessary when dom0 kernel runs in lockdown mode. > > > > > > Signed-off-by: Marek Marczykowski-Górecki > > > <marmarek@xxxxxxxxxxxxxxxxxxxxxx> > > > > I put the Xen, QEMU, and xen-pciback patches into OpenXT and gave a > > little test. When pci_permissive=0, iwlwifi fails to load its > > firmware. With pci_permissive=1, it looks like MSI-X is enabled. (I > > previously included your libxl allow_interrupt_control patch - that > > seemed to get regular MSIs working prior to the MSI-X patches.) I > > also removed the OpenXT equivalent of 0005-Disable-MSI-X-caps.patch. > > I am testing with Linux 5.4.y, so that could be another factor. > > Can you confirm the allow_interrupt_control is set by libxl? Also, > vanilla 5.4 doesn't have the allow_interrupt_control patch at all, and you > may have an earlier version that had "allow_msi_enable" as the sysfs > file name. Ok, I found what is wrong. Enabling MSI-X is refused, because INTx isn't disabled at this point yet. And apparently I was testing this with permissive=1... Linux does this: https://github.com/torvalds/linux/blob/master/drivers/pci/msi/msi.c#L611 In short: 1. Enable MSI-X with MASKALL=1 2. Setup MSI-X table 3. Disable INTx 4. Set MASKALL=0 This patch on top should fix this: ----8<---- diff --git a/drivers/xen/xen-pciback/conf_space_capability.c b/drivers/xen/xen-pciback/conf_space_capability.c index 097316a74126..f4c4381de76e 100644 --- a/drivers/xen/xen-pciback/conf_space_capability.c +++ b/drivers/xen/xen-pciback/conf_space_capability.c @@ -235,7 +235,7 @@ static int msi_msix_flags_write(struct pci_dev *dev, int offset, u16 new_value, (new_value ^ old_value) & ~field_config->allowed_bits) return PCIBIOS_SET_FAILED; - if (new_value & field_config->enable_bit) { + if ((new_value & field_config->allowed_bits) == field_config->enable_bit) { /* don't allow enabling together with other interrupt types */ int int_type = xen_pcibk_get_interrupt_type(dev); ----8<---- Jan, is the above safe? It should prevent clearing MASKALL if INTx isn't disabled, unless I missed something? But also, it will allow enabling MSI-X with MASKALL=1 together with MSI, which I'm not sure if should be allowed. Alternatively to the above patch, I could allow specifically setting MSIX_FLAGS_ENABLE + MSIX_FLAGS_MASKALL while INTx isn't disabled as a single exception, but at this point I'm not sure if some other driver or OS wouldn't approach this in yet another way. -- Best Regards, Marek Marczykowski-Górecki Invisible Things Lab Attachment:
signature.asc
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |