diff mbox series

[v2] PCI: hv: fix reading of PCI_INTERRUPT_PIN

Message ID 20240621210018.350429-1-wei.liu@kernel.org
State New
Headers show
Series [v2] PCI: hv: fix reading of PCI_INTERRUPT_PIN | expand

Commit Message

Wei Liu June 21, 2024, 9 p.m. UTC
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.

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>
---
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(-)

Comments

Michael Kelley June 23, 2024, 10:05 p.m. UTC | #1
From: Wei Liu <wei.liu@kernel.org> Sent: Friday, June 21, 2024 2:00 PM
> 
> 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.
> 
> 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>
> ---
> 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
> 

Reviewed-by: Michael Kelley <mhklinux@outlook.com>
Bjorn Helgaas June 26, 2024, 3:10 p.m. UTC | #2
1) Capitalize subject to match history
2) Say something more specific than "fix reading ..."

Apparently this returns garbage in some case where you want to return
zero?

On Fri, Jun 21, 2024 at 09:00:18PM +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.
> 
> 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>
> ---
> 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
>
Wei Liu July 1, 2024, 6:16 a.m. UTC | #3
On Wed, Jun 26, 2024 at 10:10:39AM -0500, Bjorn Helgaas wrote:
> 1) Capitalize subject to match history

What do you mean here? I got the "PCI: hv: ..." format from recent
commits. "PCI" is capitalized. You want to to capitalize "fix"?

> 2) Say something more specific than "fix reading ..."
> 
> Apparently this returns garbage in some case where you want to return
> zero?

Yes. *val is not changed in the old code, so garbage is returned.

Here is the updated commit message. I can resend once you confirm you're
happy with it.

    PCI: hv: Fix reading of PCI_INTERRUPT_PIN

    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 this 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>

Thanks,
Wei.


> 
> On Fri, Jun 21, 2024 at 09:00:18PM +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.
> > 
> > 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>
> > ---
> > 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
> >
Bjorn Helgaas July 1, 2024, 5:20 p.m. UTC | #4
On Mon, Jul 01, 2024 at 06:16:18AM +0000, Wei Liu wrote:
> On Wed, Jun 26, 2024 at 10:10:39AM -0500, Bjorn Helgaas wrote:
> > 1) Capitalize subject to match history
> 
> What do you mean here? I got the "PCI: hv: ..." format from recent
> commits. "PCI" is capitalized. You want to to capitalize "fix"?

Yes.  Look at the history:

  $ git log --oneline --no-merges drivers/pci/controller/pci-hyperv.c
  b5ff74c1ef50 PCI: hv: Fix ring buffer size calculation
  07e8f88568f5 x86/apic: Drop apic::delivery_mode
  f741bcadfe52 PCI: hv: Annotate struct hv_dr_state with __counted_by
  04bbe863241a PCI: hv: Fix a crash in hv_pci_restore_msi_msg() during hibernation
  067d6ec7ed5b PCI: hv: Add a per-bus mutex state_lock
  a847234e24d0 Revert "PCI: hv: Fix a timing issue which causes kdump to fail occasionally"
  add9195e69c9 PCI: hv: Remove the useless hv_pcichild_state from struct hv_pci_dev
  2738d5ab7929 PCI: hv: Fix a race condition in hv_irq_unmask() that can cause panic
  ...

> > 2) Say something more specific than "fix reading ..."
> > 
> > Apparently this returns garbage in some case where you want to return
> > zero?
> 
> Yes. *val is not changed in the old code, so garbage is returned.
> 
> Here is the updated commit message. I can resend once you confirm you're
> happy with it.
> 
>     PCI: hv: Fix reading of PCI_INTERRUPT_PIN

Maybe:

  PCI: hv: Return zero, not garbage, when reading PCI_INTERRUPT_PIN

>     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 this 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>

Looks fine.
Wei Liu July 1, 2024, 8:01 p.m. UTC | #5
On Mon, Jul 01, 2024 at 12:20:53PM -0500, Bjorn Helgaas wrote:
> On Mon, Jul 01, 2024 at 06:16:18AM +0000, Wei Liu wrote:
> > On Wed, Jun 26, 2024 at 10:10:39AM -0500, Bjorn Helgaas wrote:
> > > 1) Capitalize subject to match history
> > 
> > What do you mean here? I got the "PCI: hv: ..." format from recent
> > commits. "PCI" is capitalized. You want to to capitalize "fix"?
> 
> Yes.  Look at the history:
> 
>   $ git log --oneline --no-merges drivers/pci/controller/pci-hyperv.c
>   b5ff74c1ef50 PCI: hv: Fix ring buffer size calculation
>   07e8f88568f5 x86/apic: Drop apic::delivery_mode
>   f741bcadfe52 PCI: hv: Annotate struct hv_dr_state with __counted_by
>   04bbe863241a PCI: hv: Fix a crash in hv_pci_restore_msi_msg() during hibernation
>   067d6ec7ed5b PCI: hv: Add a per-bus mutex state_lock
>   a847234e24d0 Revert "PCI: hv: Fix a timing issue which causes kdump to fail occasionally"
>   add9195e69c9 PCI: hv: Remove the useless hv_pcichild_state from struct hv_pci_dev
>   2738d5ab7929 PCI: hv: Fix a race condition in hv_irq_unmask() that can cause panic
>   ...
> 
> > > 2) Say something more specific than "fix reading ..."
> > > 
> > > Apparently this returns garbage in some case where you want to return
> > > zero?
> > 
> > Yes. *val is not changed in the old code, so garbage is returned.
> > 
> > Here is the updated commit message. I can resend once you confirm you're
> > happy with it.
> > 
> >     PCI: hv: Fix reading of PCI_INTERRUPT_PIN
> 
> Maybe:
> 
>   PCI: hv: Return zero, not garbage, when reading PCI_INTERRUPT_PIN
> 
> >     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 this 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>
> 
> Looks fine.

Thanks. I will resend with the updated commit message.
diff mbox series

Patch

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