[PATCH 1/2] vgaarb: Fix return value of notifier callback
Abel Wu
abel.w at icloud.com
Fri Jan 29 10:19:43 UTC 2021
If it's not a vga device, just don't care (NOTIFY_DONE). Otherwise
return NOTIFY_OK after processing done.
Signed-off-by: Abel Wu <abel.w at icloud.com>
---
drivers/gpu/vga/vgaarb.c | 31 ++++++++++++++++++++-----------
1 file changed, 20 insertions(+), 11 deletions(-)
diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c
index 5180c5687ee5..2879d4223bf1 100644
--- a/drivers/gpu/vga/vgaarb.c
+++ b/drivers/gpu/vga/vgaarb.c
@@ -644,6 +644,11 @@ static void vga_arbiter_check_bridge_sharing(struct vga_device *vgadev)
}
}
+static inline bool vga_class(struct pci_dev *pdev)
+{
+ return (pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA;
+}
+
/*
* Currently, we assume that the "initial" setup of the system is
* not sane, that is we come up with conflicting devices and let
@@ -658,10 +663,6 @@ static bool vga_arbiter_add_pci_device(struct pci_dev *pdev)
struct pci_dev *bridge;
u16 cmd;
- /* Only deal with VGA class devices */
- if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
- return false;
-
/* Allocate structure */
vgadev = kzalloc(sizeof(struct vga_device), GFP_KERNEL);
if (vgadev == NULL) {
@@ -1420,6 +1421,9 @@ static int pci_notify(struct notifier_block *nb, unsigned long action,
vgaarb_dbg(dev, "%s\n", __func__);
+ if (!vga_class(pdev))
+ return NOTIFY_DONE;
+
/* For now we're only intereted in devices added and removed. I didn't
* test this thing here, so someone needs to double check for the
* cases of hotplugable vga cards. */
@@ -1430,7 +1434,8 @@ static int pci_notify(struct notifier_block *nb, unsigned long action,
if (notify)
vga_arbiter_notify_clients();
- return 0;
+
+ return NOTIFY_OK;
}
static struct notifier_block pci_notifier = {
@@ -1533,7 +1538,7 @@ static void __init vga_arb_select_default_device(void)
static int __init vga_arb_device_init(void)
{
int rc;
- struct pci_dev *pdev;
+ struct pci_dev *pdev = NULL;
struct vga_device *vgadev;
rc = misc_register(&vga_arb_device);
@@ -1544,11 +1549,15 @@ static int __init vga_arb_device_init(void)
/* We add all PCI devices satisfying VGA class in the arbiter by
* default */
- pdev = NULL;
- while ((pdev =
- pci_get_subsys(PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
- PCI_ANY_ID, pdev)) != NULL)
- vga_arbiter_add_pci_device(pdev);
+ while (1) {
+ pdev = pci_get_subsys(PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
+ PCI_ANY_ID, pdev);
+ if (!pdev)
+ break;
+
+ if (vga_class(pdev))
+ vga_arbiter_add_pci_device(pdev);
+ }
list_for_each_entry(vgadev, &vga_list, list) {
struct device *dev = &vgadev->pdev->dev;
--
2.27.0
More information about the dri-devel
mailing list