From 4865020e2c4741426b9ee966ca24450438281463 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Thu, 12 Nov 2020 08:30:43 +1100 Subject: [PATCH] [core] refactor unlocked codepath into it's own function --- src/vendor-reset-dev.c | 28 ++++++++++++++++++++++++++++ src/vendor-reset-dev.h | 1 + src/vendor-reset.c | 34 ++++++++-------------------------- 3 files changed, 37 insertions(+), 26 deletions(-) diff --git a/src/vendor-reset-dev.c b/src/vendor-reset-dev.c index a8f5073..39a6df2 100644 --- a/src/vendor-reset-dev.c +++ b/src/vendor-reset-dev.c @@ -69,3 +69,31 @@ long vendor_reset_dev_locked(struct vendor_reset_cfg *cfg, struct pci_dev *dev) return ret; } + +long vendor_reset_dev(struct vendor_reset_cfg *cfg, struct pci_dev *dev) +{ + int ret; + + if (!pci_cfg_access_trylock(dev)) + { + pci_warn(dev, "Could not acquire cfg lock\n"); + ret = -EAGAIN; + goto err; + } + + if (!device_trylock(&dev->dev)) + { + pci_warn(dev, "Could not acquire device lock\n"); + ret = -EAGAIN; + goto unlock; + } + + ret = vendor_reset_dev_locked(cfg, dev); + device_unlock(&dev->dev); + +unlock: + pci_cfg_access_unlock(dev); + +err: + return ret; +} diff --git a/src/vendor-reset-dev.h b/src/vendor-reset-dev.h index 7400db8..56e8fea 100644 --- a/src/vendor-reset-dev.h +++ b/src/vendor-reset-dev.h @@ -63,5 +63,6 @@ struct vendor_reset_cfg * vendor_reset_cfg_find(unsigned int vendor, /* perform the device reset */ long vendor_reset_dev_locked(struct vendor_reset_cfg *cfg, struct pci_dev *dev); +long vendor_reset_dev(struct vendor_reset_cfg *cfg, struct pci_dev *dev); #endif diff --git a/src/vendor-reset.c b/src/vendor-reset.c index 2181264..e24c699 100644 --- a/src/vendor-reset.c +++ b/src/vendor-reset.c @@ -38,47 +38,29 @@ module_param(install_hook, bool, 0); static long vendor_reset_ioctl_reset(struct file * filp, unsigned long arg) { - struct vendor_reset_ioctl dev; + struct vendor_reset_ioctl iodev; struct vendor_reset_cfg *cfg; - struct pci_dev * pcidev; + struct pci_dev * dev; int ret; - if (copy_from_user(&dev, (void __user *)arg, sizeof(dev))) + if (copy_from_user(&iodev, (void __user *)arg, sizeof(iodev))) return -EFAULT; - pcidev = pci_get_domain_bus_and_slot(dev.domain, dev.bus, dev.devfn); - if (!pcidev) + dev = pci_get_domain_bus_and_slot(iodev.domain, iodev.bus, iodev.devfn); + if (!dev) return -ENODEV; - cfg = vendor_reset_cfg_find(pcidev->vendor, pcidev->device); + cfg = vendor_reset_cfg_find(dev->vendor, dev->device); if (!cfg) { ret = -EOPNOTSUPP; goto err; } - /* we probably always want to lock the device */ - if (!pci_cfg_access_trylock(pcidev)) - { - pci_warn(pcidev, "Could not acquire cfg lock\n"); - ret = -EAGAIN; - goto err; - } - - if (!device_trylock(&pcidev->dev)) - { - pci_warn(pcidev, "Could not acquire device lock\n"); - ret = -EAGAIN; - goto unlock; - } - - ret = vendor_reset_dev_locked(cfg, pcidev); - device_unlock(&pcidev->dev); + ret = vendor_reset_dev(cfg, dev); -unlock: - pci_cfg_access_unlock(pcidev); err: - pci_dev_put(pcidev); + pci_dev_put(dev); return ret; }