Message ID | 20240701202606.129606-1-wei.liu@kernel.org (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Krzysztof Wilczyński |
Headers | show |
Series | [v3] PCI: hv: Return zero, not garbage, when reading PCI_INTERRUPT_PIN | expand |
On Mon, Jul 01, 2024 at 08:26:05PM +0000, Wei Liu wrote: > The intent of the code snippet is to always return 0 for both > PCI_INTERRUPT_LINE and PCI_INTERRUPT_PIN. > > The check misses PCI_INTERRUPT_PIN. This patch fixes that. > > This is discovered by this call in VFIO: > > pci_read_config_byte(vdev->pdev, PCI_INTERRUPT_PIN, &pin); > > The old code does not set *val to 0 because it misses the check for > PCI_INTERRUPT_PIN. Garbage is returned in that case. > > Fixes: 4daace0d8ce8 ("PCI: hv: Add paravirtual PCI front-end for Microsoft Hyper-V VMs") > Cc: stable@kernel.org > Signed-off-by: Wei Liu <wei.liu@kernel.org> > Reviewed-by: Michael Kelley <mhklinux@outlook.com> Bjorn & other PCI maintainers, do you want to pick this up via your tree? I can pick this up via the hyperv tree if you prefer. Thanks, Wei. > --- > v3: > * Change commit subject line and message per Bjorn's suggestion > v2: > * Change the commit subject line and message > * Change the code according to feedback > --- > drivers/pci/controller/pci-hyperv.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c > index 5992280e8110..cdd5be16021d 100644 > --- a/drivers/pci/controller/pci-hyperv.c > +++ b/drivers/pci/controller/pci-hyperv.c > @@ -1130,8 +1130,8 @@ static void _hv_pcifront_read_config(struct hv_pci_dev *hpdev, int where, > PCI_CAPABILITY_LIST) { > /* ROM BARs are unimplemented */ > *val = 0; > - } else if (where >= PCI_INTERRUPT_LINE && where + size <= > - PCI_INTERRUPT_PIN) { > + } else if ((where >= PCI_INTERRUPT_LINE && where + size <= PCI_INTERRUPT_PIN) || > + (where >= PCI_INTERRUPT_PIN && where + size <= PCI_MIN_GNT)) { > /* > * Interrupt Line and Interrupt PIN are hard-wired to zero > * because this front-end only supports message-signaled > -- > 2.43.0 >
Hello, > > The intent of the code snippet is to always return 0 for both > > PCI_INTERRUPT_LINE and PCI_INTERRUPT_PIN. > > > > The check misses PCI_INTERRUPT_PIN. This patch fixes that. > > > > This is discovered by this call in VFIO: > > > > pci_read_config_byte(vdev->pdev, PCI_INTERRUPT_PIN, &pin); > > > > The old code does not set *val to 0 because it misses the check for > > PCI_INTERRUPT_PIN. Garbage is returned in that case. [...] > > Bjorn & other PCI maintainers, do you want to pick this up via your > tree? > > I can pick this up via the hyperv tree if you prefer. We will pick this up. No worries. Krzysztof
On Wed, Jul 03, 2024 at 05:12:47PM +0900, Krzysztof Wilczyński wrote: > Hello, > > > > The intent of the code snippet is to always return 0 for both > > > PCI_INTERRUPT_LINE and PCI_INTERRUPT_PIN. > > > > > > The check misses PCI_INTERRUPT_PIN. This patch fixes that. > > > > > > This is discovered by this call in VFIO: > > > > > > pci_read_config_byte(vdev->pdev, PCI_INTERRUPT_PIN, &pin); > > > > > > The old code does not set *val to 0 because it misses the check for > > > PCI_INTERRUPT_PIN. Garbage is returned in that case. > [...] > > > > Bjorn & other PCI maintainers, do you want to pick this up via your > > tree? > > > > I can pick this up via the hyperv tree if you prefer. > > We will pick this up. No worries. Thank you very much! > > Krzysztof >
Hello, > The intent of the code snippet is to always return 0 for both > PCI_INTERRUPT_LINE and PCI_INTERRUPT_PIN. > > The check misses PCI_INTERRUPT_PIN. This patch fixes that. > > This is discovered by this call in VFIO: > > pci_read_config_byte(vdev->pdev, PCI_INTERRUPT_PIN, &pin); > > The old code does not set *val to 0 because it misses the check for > PCI_INTERRUPT_PIN. Garbage is returned in that case. Applied to controller/hyperv, thank you! [1/1] PCI: hv: Return zero, not garbage, when reading PCI_INTERRUPT_PIN https://git.kernel.org/pci/pci/c/fea93a3e5d5e Krzysztof
diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c index 5992280e8110..cdd5be16021d 100644 --- a/drivers/pci/controller/pci-hyperv.c +++ b/drivers/pci/controller/pci-hyperv.c @@ -1130,8 +1130,8 @@ static void _hv_pcifront_read_config(struct hv_pci_dev *hpdev, int where, PCI_CAPABILITY_LIST) { /* ROM BARs are unimplemented */ *val = 0; - } else if (where >= PCI_INTERRUPT_LINE && where + size <= - PCI_INTERRUPT_PIN) { + } else if ((where >= PCI_INTERRUPT_LINE && where + size <= PCI_INTERRUPT_PIN) || + (where >= PCI_INTERRUPT_PIN && where + size <= PCI_MIN_GNT)) { /* * Interrupt Line and Interrupt PIN are hard-wired to zero * because this front-end only supports message-signaled