[dpdk-dev] igb_uio: prevent reset for a list of devices
Checks
Commit Message
Some devices are having problem on device reset that happens during DPDK
application exit [1].
Create a static list of devices and exclude them from device reset.
[1]
http://dpdk.org/ml/archives/dev/2017-November/080927.html
Fixes: b58eedfc7dd5 ("igb_uio: issue FLR during open and release of device file")
Cc: stable@dpdk.org
Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
---
Cc: Jianfeng Tan <jianfeng.tan@intel.com>
Cc: Jingjing Wu <jingjing.wu@intel.com>
Cc: Shijith Thotton <shijith.thotton@caviumnetworks.com>
Cc: Gregory Etelson <gregory@weka.io>
Cc: Harish Patil <harish.patil@cavium.com>
Cc: George Prekas <george.prekas@epfl.ch>
Cc: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>
Cc: Rasesh Mody <rasesh.mody@cavium.com>
Cc: Lee Roberts <lee.roberts@hpe.com>
This is alternative approach to
http://dpdk.org/dev/patchwork/patch/31144/
---
lib/librte_eal/linuxapp/igb_uio/compat.h | 19 ++++++++++++++++++-
lib/librte_eal/linuxapp/igb_uio/igb_uio.c | 11 ++++++++++-
2 files changed, 28 insertions(+), 2 deletions(-)
Comments
03/11/2017 23:38, Ferruh Yigit:
> Some devices are having problem on device reset that happens during DPDK
> application exit [1].
>
> Create a static list of devices and exclude them from device reset.
[...]
> This is alternative approach to
> http://dpdk.org/dev/patchwork/patch/31144/
It is better to change the behaviour only for the misbehaving device,
as it is done with this alternative.
However as far as I understand, the change is removing a long delay due
to the reset, but re-enable a security hole due to the lack of reset.
So I think we must have a compilation option anyway, in order to let
the packager (or distribution) make this difficult decision.
The compilation option could be something like
RTE_BNX2X_PREFER_SECURITY_HOLE_THAN_LONG_RESTART
Feel free to find a better name :)
> From: Ferruh Yigit [mailto:ferruh.yigit@intel.com]
> Sent: Friday, November 03, 2017 3:38 PM
>
> Some devices are having problem on device reset that happens during DPDK
> application exit [1].
>
> Create a static list of devices and exclude them from device reset.
>
> [1]
> http://dpdk.org/ml/archives/dev/2017-November/080927.html
>
> Fixes: b58eedfc7dd5 ("igb_uio: issue FLR during open and release of device
> file")
> Cc: stable@dpdk.org
>
> Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
> ---
> Cc: Jianfeng Tan <jianfeng.tan@intel.com>
> Cc: Jingjing Wu <jingjing.wu@intel.com>
> Cc: Shijith Thotton <shijith.thotton@caviumnetworks.com>
> Cc: Gregory Etelson <gregory@weka.io>
> Cc: Harish Patil <harish.patil@cavium.com>
> Cc: George Prekas <george.prekas@epfl.ch>
> Cc: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>
> Cc: Rasesh Mody <rasesh.mody@cavium.com>
> Cc: Lee Roberts <lee.roberts@hpe.com>
>
> This is alternative approach to
> http://dpdk.org/dev/patchwork/patch/31144/
This patch is working.
Thanks!
-Rasesh
@@ -133,4 +133,21 @@ static bool pci_check_and_mask_intx(struct pci_dev *pdev)
#define HAVE_PCI_MSI_MASK_IRQ 1
#endif
-
+#define BROADCOM_PCI_VENDOR_ID 0x14E4
+static const struct pci_device_id no_reset_pci_tbl[] = {
+ { PCI_DEVICE(BROADCOM_PCI_VENDOR_ID, 0x168a) }, /* 57800 */
+ { PCI_DEVICE(BROADCOM_PCI_VENDOR_ID, 0x164f) }, /* 57711 */
+ { PCI_DEVICE(BROADCOM_PCI_VENDOR_ID, 0x168e) }, /* 57810 */
+ { PCI_DEVICE(BROADCOM_PCI_VENDOR_ID, 0x163d) }, /* 57811 */
+ { PCI_DEVICE(BROADCOM_PCI_VENDOR_ID, 0x168d) }, /* 57840_OBS */
+ { PCI_DEVICE(BROADCOM_PCI_VENDOR_ID, 0x16a1) }, /* 57840_4_10 */
+ { PCI_DEVICE(BROADCOM_PCI_VENDOR_ID, 0x16a2) }, /* 57840_2_20 */
+ { PCI_DEVICE(BROADCOM_PCI_VENDOR_ID, 0x16ae) }, /* 57810_MF */
+ { PCI_DEVICE(BROADCOM_PCI_VENDOR_ID, 0x163e) }, /* 57811_MF */
+ { PCI_DEVICE(BROADCOM_PCI_VENDOR_ID, 0x16a4) }, /* 57840_MF */
+ { PCI_DEVICE(BROADCOM_PCI_VENDOR_ID, 0x16a9) }, /* 57800_VF */
+ { PCI_DEVICE(BROADCOM_PCI_VENDOR_ID, 0x16af) }, /* 57810_VF */
+ { PCI_DEVICE(BROADCOM_PCI_VENDOR_ID, 0x163f) }, /* 57811_VF */
+ { PCI_DEVICE(BROADCOM_PCI_VENDOR_ID, 0x16ad) }, /* 57840_VF */
+ { 0 },
+};
@@ -348,6 +348,14 @@ igbuio_pci_open(struct uio_info *info, struct inode *inode)
return 0;
}
+static int is_device_excluded_from_reset(struct pci_dev *pdev)
+{
+ if (pci_match_id(no_reset_pci_tbl, pdev))
+ return 1;
+
+ return 0;
+}
+
static int
igbuio_pci_release(struct uio_info *info, struct inode *inode)
{
@@ -360,7 +368,8 @@ igbuio_pci_release(struct uio_info *info, struct inode *inode)
/* stop the device from further DMA */
pci_clear_master(dev);
- pci_reset_function(dev);
+ if (!is_device_excluded_from_reset(dev))
+ pci_reset_function(dev);
return 0;
}