Skip to content

Commit

Permalink
Merge tag 'vfio-v5.2-rc1' of git://github.com/awilliam/linux-vfio
Browse files Browse the repository at this point in the history
Pull VFIO updates from Alex Williamson:

 - Improve dev_printk() usage (Bjorn Helgaas)

 - Fix issue with blocking in !TASK_RUNNING state while waiting for
   userspace to release devices (Farhan Ali)

 - Fix error path cleanup in nvlink setup (Greg Kurz)

 - mdev-core cleanups and fixes in preparation for more use cases (Parav
   Pandit)

 - Cornelia has volunteered as an official vfio reviewer (Cornelia Huck)

* tag 'vfio-v5.2-rc1' of git://github.com/awilliam/linux-vfio:
  vfio: Add Cornelia Huck as reviewer
  vfio/mdev: Avoid inline get and put parent helpers
  vfio/mdev: Fix aborting mdev child device removal if one fails
  vfio/mdev: Follow correct remove sequence
  vfio/mdev: Avoid masking error code to EBUSY
  vfio/mdev: Drop redundant extern for exported symbols
  vfio/mdev: Removed unused kref
  vfio/mdev: Avoid release parent reference during error path
  vfio-pci/nvlink2: Fix potential VMA leak
  vfio: Fix WARNING "do not call blocking ops when !TASK_RUNNING"
  vfio: Use dev_printk() when possible
  • Loading branch information
torvalds committed May 11, 2019
2 parents c367dc8 + 15c80c1 commit 6fe567d
Show file tree
Hide file tree
Showing 12 changed files with 81 additions and 95 deletions.
1 change: 1 addition & 0 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -16557,6 +16557,7 @@ F: fs/fat/

VFIO DRIVER
M: Alex Williamson <[email protected]>
R: Cornelia Huck <[email protected]>
L: [email protected]
T: git git://github.com/awilliam/linux-vfio.git
S: Maintained
Expand Down
18 changes: 8 additions & 10 deletions drivers/vfio/mdev/mdev_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,15 +88,15 @@ static void mdev_release_parent(struct kref *kref)
put_device(dev);
}

static inline struct mdev_parent *mdev_get_parent(struct mdev_parent *parent)
static struct mdev_parent *mdev_get_parent(struct mdev_parent *parent)
{
if (parent)
kref_get(&parent->ref);

return parent;
}

static inline void mdev_put_parent(struct mdev_parent *parent)
static void mdev_put_parent(struct mdev_parent *parent)
{
if (parent)
kref_put(&parent->ref, mdev_release_parent);
Expand Down Expand Up @@ -141,18 +141,18 @@ static int mdev_device_remove_ops(struct mdev_device *mdev, bool force_remove)
*/
ret = parent->ops->remove(mdev);
if (ret && !force_remove)
return -EBUSY;
return ret;

sysfs_remove_groups(&mdev->dev.kobj, parent->ops->mdev_attr_groups);
return 0;
}

static int mdev_device_remove_cb(struct device *dev, void *data)
{
if (!dev_is_mdev(dev))
return 0;
if (dev_is_mdev(dev))
mdev_device_remove(dev, true);

return mdev_device_remove(dev, data ? *(bool *)data : true);
return 0;
}

/*
Expand Down Expand Up @@ -181,6 +181,7 @@ int mdev_register_device(struct device *dev, const struct mdev_parent_ops *ops)
/* Check for duplicate */
parent = __find_parent_device(dev);
if (parent) {
parent = NULL;
ret = -EEXIST;
goto add_dev_err;
}
Expand Down Expand Up @@ -239,7 +240,6 @@ EXPORT_SYMBOL(mdev_register_device);
void mdev_unregister_device(struct device *dev)
{
struct mdev_parent *parent;
bool force_remove = true;

mutex_lock(&parent_list_lock);
parent = __find_parent_device(dev);
Expand All @@ -253,8 +253,7 @@ void mdev_unregister_device(struct device *dev)
list_del(&parent->next);
class_compat_remove_link(mdev_bus_compat_class, dev, NULL);

device_for_each_child(dev, (void *)&force_remove,
mdev_device_remove_cb);
device_for_each_child(dev, NULL, mdev_device_remove_cb);

parent_remove_sysfs_files(parent);

Expand Down Expand Up @@ -310,7 +309,6 @@ int mdev_device_create(struct kobject *kobj,
mutex_unlock(&mdev_list_lock);

mdev->parent = parent;
kref_init(&mdev->ref);

mdev->dev.parent = dev;
mdev->dev.bus = &mdev_bus_type;
Expand Down
1 change: 0 additions & 1 deletion drivers/vfio/mdev/mdev_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ struct mdev_device {
struct mdev_parent *parent;
guid_t uuid;
void *driver_data;
struct kref ref;
struct list_head next;
struct kobject *type_kobj;
bool active;
Expand Down
2 changes: 1 addition & 1 deletion drivers/vfio/mdev/mdev_sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ int mdev_create_sysfs_files(struct device *dev, struct mdev_type *type)

void mdev_remove_sysfs_files(struct device *dev, struct mdev_type *type)
{
sysfs_remove_files(&dev->kobj, mdev_device_attrs);
sysfs_remove_link(&dev->kobj, "mdev_type");
sysfs_remove_link(type->devices_kobj, dev_name(dev));
sysfs_remove_files(&dev->kobj, mdev_device_attrs);
}
23 changes: 10 additions & 13 deletions drivers/vfio/pci/vfio_pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
*/

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#define dev_fmt pr_fmt

#include <linux/device.h>
#include <linux/eventfd.h>
Expand Down Expand Up @@ -287,12 +288,11 @@ static int vfio_pci_enable(struct vfio_pci_device *vdev)
pci_save_state(pdev);
vdev->pci_saved_state = pci_store_saved_state(pdev);
if (!vdev->pci_saved_state)
pr_debug("%s: Couldn't store %s saved state\n",
__func__, dev_name(&pdev->dev));
pci_dbg(pdev, "%s: Couldn't store saved state\n", __func__);

if (likely(!nointxmask)) {
if (vfio_pci_nointx(pdev)) {
dev_info(&pdev->dev, "Masking broken INTx support\n");
pci_info(pdev, "Masking broken INTx support\n");
vdev->nointx = true;
pci_intx(pdev, 0);
} else
Expand Down Expand Up @@ -336,8 +336,7 @@ static int vfio_pci_enable(struct vfio_pci_device *vdev)
IS_ENABLED(CONFIG_VFIO_PCI_IGD)) {
ret = vfio_pci_igd_init(vdev);
if (ret) {
dev_warn(&vdev->pdev->dev,
"Failed to setup Intel IGD regions\n");
pci_warn(pdev, "Failed to setup Intel IGD regions\n");
goto disable_exit;
}
}
Expand All @@ -346,8 +345,7 @@ static int vfio_pci_enable(struct vfio_pci_device *vdev)
IS_ENABLED(CONFIG_VFIO_PCI_NVLINK2)) {
ret = vfio_pci_nvdia_v100_nvlink2_init(vdev);
if (ret && ret != -ENODEV) {
dev_warn(&vdev->pdev->dev,
"Failed to setup NVIDIA NV2 RAM region\n");
pci_warn(pdev, "Failed to setup NVIDIA NV2 RAM region\n");
goto disable_exit;
}
}
Expand All @@ -356,8 +354,7 @@ static int vfio_pci_enable(struct vfio_pci_device *vdev)
IS_ENABLED(CONFIG_VFIO_PCI_NVLINK2)) {
ret = vfio_pci_ibm_npu2_init(vdev);
if (ret && ret != -ENODEV) {
dev_warn(&vdev->pdev->dev,
"Failed to setup NVIDIA NV2 ATSD region\n");
pci_warn(pdev, "Failed to setup NVIDIA NV2 ATSD region\n");
goto disable_exit;
}
}
Expand Down Expand Up @@ -429,8 +426,7 @@ static void vfio_pci_disable(struct vfio_pci_device *vdev)
* is just busy work.
*/
if (pci_load_and_free_saved_state(pdev, &vdev->pci_saved_state)) {
pr_info("%s: Couldn't reload %s saved state\n",
__func__, dev_name(&pdev->dev));
pci_info(pdev, "%s: Couldn't reload saved state\n", __func__);

if (!vdev->reset_works)
goto out;
Expand Down Expand Up @@ -1255,17 +1251,18 @@ static int vfio_pci_mmap(void *device_data, struct vm_area_struct *vma)
static void vfio_pci_request(void *device_data, unsigned int count)
{
struct vfio_pci_device *vdev = device_data;
struct pci_dev *pdev = vdev->pdev;

mutex_lock(&vdev->igate);

if (vdev->req_trigger) {
if (!(count % 10))
dev_notice_ratelimited(&vdev->pdev->dev,
pci_notice_ratelimited(pdev,
"Relaying device request to user (#%u)\n",
count);
eventfd_signal(vdev->req_trigger, 1);
} else if (count == 0) {
dev_warn(&vdev->pdev->dev,
pci_warn(pdev,
"No device request channel registered, blocked until released by user\n");
}

Expand Down
29 changes: 13 additions & 16 deletions drivers/vfio/pci/vfio_pci_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -412,8 +412,7 @@ static void vfio_bar_restore(struct vfio_pci_device *vdev)
if (pdev->is_virtfn)
return;

pr_info("%s: %s reset recovery - restoring bars\n",
__func__, dev_name(&pdev->dev));
pci_info(pdev, "%s: reset recovery - restoring BARs\n", __func__);

for (i = PCI_BASE_ADDRESS_0; i <= PCI_BASE_ADDRESS_5; i += 4, rbar++)
pci_user_write_config_dword(pdev, i, *rbar);
Expand Down Expand Up @@ -1298,8 +1297,8 @@ static int vfio_cap_len(struct vfio_pci_device *vdev, u8 cap, u8 pos)
else
return PCI_SATA_SIZEOF_SHORT;
default:
pr_warn("%s: %s unknown length for pci cap 0x%x@0x%x\n",
dev_name(&pdev->dev), __func__, cap, pos);
pci_warn(pdev, "%s: unknown length for PCI cap %#x@%#x\n",
__func__, cap, pos);
}

return 0;
Expand Down Expand Up @@ -1372,8 +1371,8 @@ static int vfio_ext_cap_len(struct vfio_pci_device *vdev, u16 ecap, u16 epos)
}
return PCI_TPH_BASE_SIZEOF;
default:
pr_warn("%s: %s unknown length for pci ecap 0x%x@0x%x\n",
dev_name(&pdev->dev), __func__, ecap, epos);
pci_warn(pdev, "%s: unknown length for PCI ecap %#x@%#x\n",
__func__, ecap, epos);
}

return 0;
Expand Down Expand Up @@ -1474,8 +1473,8 @@ static int vfio_cap_init(struct vfio_pci_device *vdev)
}

if (!len) {
pr_info("%s: %s hiding cap 0x%x\n",
__func__, dev_name(&pdev->dev), cap);
pci_info(pdev, "%s: hiding cap %#x@%#x\n", __func__,
cap, pos);
*prev = next;
pos = next;
continue;
Expand All @@ -1486,9 +1485,8 @@ static int vfio_cap_init(struct vfio_pci_device *vdev)
if (likely(map[pos + i] == PCI_CAP_ID_INVALID))
continue;

pr_warn("%s: %s pci config conflict @0x%x, was cap 0x%x now cap 0x%x\n",
__func__, dev_name(&pdev->dev),
pos + i, map[pos + i], cap);
pci_warn(pdev, "%s: PCI config conflict @%#x, was cap %#x now cap %#x\n",
__func__, pos + i, map[pos + i], cap);
}

BUILD_BUG_ON(PCI_CAP_ID_MAX >= PCI_CAP_ID_INVALID_VIRT);
Expand Down Expand Up @@ -1549,8 +1547,8 @@ static int vfio_ecap_init(struct vfio_pci_device *vdev)
}

if (!len) {
pr_info("%s: %s hiding ecap 0x%x@0x%x\n",
__func__, dev_name(&pdev->dev), ecap, epos);
pci_info(pdev, "%s: hiding ecap %#x@%#x\n",
__func__, ecap, epos);

/* If not the first in the chain, we can skip over it */
if (prev) {
Expand All @@ -1572,9 +1570,8 @@ static int vfio_ecap_init(struct vfio_pci_device *vdev)
if (likely(map[epos + i] == PCI_CAP_ID_INVALID))
continue;

pr_warn("%s: %s pci config conflict @0x%x, was ecap 0x%x now ecap 0x%x\n",
__func__, dev_name(&pdev->dev),
epos + i, map[epos + i], ecap);
pci_warn(pdev, "%s: PCI config conflict @%#x, was ecap %#x now ecap %#x\n",
__func__, epos + i, map[epos + i], ecap);
}

/*
Expand Down
2 changes: 2 additions & 0 deletions drivers/vfio/pci/vfio_pci_nvlink2.c
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,8 @@ int vfio_pci_ibm_npu2_init(struct vfio_pci_device *vdev)
return 0;

free_exit:
if (data->base)
memunmap(data->base);
kfree(data);

return ret;
Expand Down
5 changes: 3 additions & 2 deletions drivers/vfio/platform/reset/vfio_platform_amdxgbe.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@ static int vfio_platform_amdxgbe_reset(struct vfio_platform_device *vdev)
} while ((pcs_value & MDIO_CTRL1_RESET) && --count);

if (pcs_value & MDIO_CTRL1_RESET)
pr_warn("%s XGBE PHY reset timeout\n", __func__);
dev_warn(vdev->device, "%s: XGBE PHY reset timeout\n",
__func__);

/* disable auto-negotiation */
value = xmdio_read(xpcs_regs->ioaddr, MDIO_MMD_AN, MDIO_CTRL1);
Expand All @@ -114,7 +115,7 @@ static int vfio_platform_amdxgbe_reset(struct vfio_platform_device *vdev)
usleep_range(500, 600);

if (!count)
pr_warn("%s MAC SW reset failed\n", __func__);
dev_warn(vdev->device, "%s: MAC SW reset failed\n", __func__);

return 0;
}
Expand Down
12 changes: 7 additions & 5 deletions drivers/vfio/platform/vfio_platform_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
* GNU General Public License for more details.
*/

#define dev_fmt(fmt) "VFIO: " fmt

#include <linux/device.h>
#include <linux/acpi.h>
#include <linux/iommu.h>
Expand Down Expand Up @@ -63,7 +65,7 @@ static int vfio_platform_acpi_probe(struct vfio_platform_device *vdev,

adev = ACPI_COMPANION(dev);
if (!adev) {
pr_err("VFIO: ACPI companion device not found for %s\n",
dev_err(dev, "ACPI companion device not found for %s\n",
vdev->name);
return -ENODEV;
}
Expand Down Expand Up @@ -638,7 +640,7 @@ static int vfio_platform_of_probe(struct vfio_platform_device *vdev,
ret = device_property_read_string(dev, "compatible",
&vdev->compat);
if (ret)
pr_err("VFIO: Cannot retrieve compat for %s\n", vdev->name);
dev_err(dev, "Cannot retrieve compat for %s\n", vdev->name);

return ret;
}
Expand Down Expand Up @@ -680,14 +682,14 @@ int vfio_platform_probe_common(struct vfio_platform_device *vdev,

ret = vfio_platform_get_reset(vdev);
if (ret && vdev->reset_required) {
pr_err("VFIO: No reset function found for device %s\n",
vdev->name);
dev_err(dev, "No reset function found for device %s\n",
vdev->name);
return ret;
}

group = vfio_iommu_group_get(dev);
if (!group) {
pr_err("VFIO: No IOMMU group for device %s\n", vdev->name);
dev_err(dev, "No IOMMU group for device %s\n", vdev->name);
ret = -EINVAL;
goto put_reset;
}
Expand Down
Loading

0 comments on commit 6fe567d

Please sign in to comment.