diff mbox series

[v2] vfio-pci: Mask cap zero

Message ID 158871758778.17183.9778359960687348692.stgit@gimli.home (mailing list archive)
State New, archived
Headers show
Series [v2] vfio-pci: Mask cap zero | expand

Commit Message

Alex Williamson May 5, 2020, 10:27 p.m. UTC
The PCI Code and ID Assignment Specification changed capability ID 0
from reserved to a NULL capability in the v1.1 revision.  The NULL
capability is defined to include only the 16-bit capability header,
ie. only the ID and next pointer.  Unfortunately vfio-pci creates a
map of config space, where ID 0 is used to reserve the standard type
0 header.  Finding an actual capability with this ID therefore results
in a bogus range marked in that map and conflicts with subsequent
capabilities.  As this seems to be a dummy capability anyway and we
already support dropping capabilities, let's hide this one rather than
delving into the potentially subtle dependencies within our map.

Seen on an NVIDIA Tesla T4.

Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
---
 drivers/vfio/pci/vfio_pci_config.c |    7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

Comments

Cornelia Huck May 6, 2020, 11:26 a.m. UTC | #1
On Tue, 05 May 2020 16:27:01 -0600
Alex Williamson <alex.williamson@redhat.com> wrote:

> The PCI Code and ID Assignment Specification changed capability ID 0
> from reserved to a NULL capability in the v1.1 revision.  The NULL
> capability is defined to include only the 16-bit capability header,
> ie. only the ID and next pointer.  Unfortunately vfio-pci creates a
> map of config space, where ID 0 is used to reserve the standard type
> 0 header.  Finding an actual capability with this ID therefore results
> in a bogus range marked in that map and conflicts with subsequent
> capabilities.  As this seems to be a dummy capability anyway and we
> already support dropping capabilities, let's hide this one rather than
> delving into the potentially subtle dependencies within our map.
> 
> Seen on an NVIDIA Tesla T4.
> 
> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
> ---
>  drivers/vfio/pci/vfio_pci_config.c |    7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)

Reviewed-by: Cornelia Huck <cohuck@redhat.com>
diff mbox series

Patch

diff --git a/drivers/vfio/pci/vfio_pci_config.c b/drivers/vfio/pci/vfio_pci_config.c
index 3dcddbd572e6..0d110e268094 100644
--- a/drivers/vfio/pci/vfio_pci_config.c
+++ b/drivers/vfio/pci/vfio_pci_config.c
@@ -1486,7 +1486,12 @@  static int vfio_cap_init(struct vfio_pci_device *vdev)
 		if (ret)
 			return ret;
 
-		if (cap <= PCI_CAP_ID_MAX) {
+		/*
+		 * ID 0 is a NULL capability, conflicting with our fake
+		 * PCI_CAP_ID_BASIC.  As it has no content, consider it
+		 * hidden for now.
+		 */
+		if (cap && cap <= PCI_CAP_ID_MAX) {
 			len = pci_cap_length[cap];
 			if (len == 0xFF) { /* Variable length */
 				len = vfio_cap_len(vdev, cap, pos);