igb_uio: cast private data to correct struct type
authorFerruh Yigit <ferruh.yigit@intel.com>
Thu, 3 Mar 2016 17:08:19 +0000 (17:08 +0000)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Mon, 7 Mar 2016 22:27:40 +0000 (23:27 +0100)
This was working fine because addresses of two structs are same:

struct A {
struct B b;
} a;

As above sample "a" and "b" has same address.

Now casting private data back to the correct struct type, to the one
stored.

Fixes: af75078fece3 ("first public release")

Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
lib/librte_eal/linuxapp/igb_uio/igb_uio.c

index 7091b6b..a3ad912 100644 (file)
@@ -561,24 +561,17 @@ fail_free:
 static void
 igbuio_pci_remove(struct pci_dev *dev)
 {
 static void
 igbuio_pci_remove(struct pci_dev *dev)
 {
-       struct uio_info *info = pci_get_drvdata(dev);
-       struct rte_uio_pci_dev *udev;
-
-       if (info->priv == NULL) {
-               pr_notice("Not igbuio device\n");
-               return;
-       }
-       udev = info->priv;
+       struct rte_uio_pci_dev *udev = pci_get_drvdata(dev);
 
        sysfs_remove_group(&dev->dev.kobj, &dev_attr_grp);
 
        sysfs_remove_group(&dev->dev.kobj, &dev_attr_grp);
-       uio_unregister_device(info);
-       igbuio_pci_release_iomem(info);
+       uio_unregister_device(&udev->info);
+       igbuio_pci_release_iomem(&udev->info);
        if (udev->mode == RTE_INTR_MODE_MSIX)
                pci_disable_msix(dev);
        pci_release_regions(dev);
        pci_disable_device(dev);
        pci_set_drvdata(dev, NULL);
        if (udev->mode == RTE_INTR_MODE_MSIX)
                pci_disable_msix(dev);
        pci_release_regions(dev);
        pci_disable_device(dev);
        pci_set_drvdata(dev, NULL);
-       kfree(info);
+       kfree(udev);
 }
 
 static int
 }
 
 static int