get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/17176/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 17176,
    "url": "http://patches.dpdk.org/api/patches/17176/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1479808257-8725-1-git-send-email-olivier.matz@6wind.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1479808257-8725-1-git-send-email-olivier.matz@6wind.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1479808257-8725-1-git-send-email-olivier.matz@6wind.com",
    "date": "2016-11-22T09:50:57",
    "name": "[dpdk-dev,v2] drivers: advertise kmod dependencies in pmdinfo",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "9f007551c5ce239e901adfa54c587ae220290afe",
    "submitter": {
        "id": 8,
        "url": "http://patches.dpdk.org/api/people/8/?format=api",
        "name": "Olivier Matz",
        "email": "olivier.matz@6wind.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1479808257-8725-1-git-send-email-olivier.matz@6wind.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/17176/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/17176/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id 083CC5582;\n\tTue, 22 Nov 2016 10:51:14 +0100 (CET)",
            "from proxy.6wind.com (host.76.145.23.62.rev.coltfrance.com\n\t[62.23.145.76]) by dpdk.org (Postfix) with ESMTP id 1A7DB47D2\n\tfor <dev@dpdk.org>; Tue, 22 Nov 2016 10:51:10 +0100 (CET)",
            "from glumotte.dev.6wind.com (unknown [10.16.0.195])\n\tby proxy.6wind.com (Postfix) with ESMTP id 12B102A942;\n\tTue, 22 Nov 2016 10:51:06 +0100 (CET)"
        ],
        "From": "Olivier Matz <olivier.matz@6wind.com>",
        "To": "dev@dpdk.org",
        "Cc": "nhorman@tuxdriver.com, thomas.monjalon@6wind.com, vido@cesnet.cz,\n\tfiona.trahe@intel.com, stephen@networkplumber.org",
        "Date": "Tue, 22 Nov 2016 10:50:57 +0100",
        "Message-Id": "<1479808257-8725-1-git-send-email-olivier.matz@6wind.com>",
        "X-Mailer": "git-send-email 2.8.1",
        "In-Reply-To": "<1473949355-6787-1-git-send-email-olivier.matz@6wind.com>",
        "References": "<1473949355-6787-1-git-send-email-olivier.matz@6wind.com>",
        "Subject": "[dpdk-dev] [PATCH v2] drivers: advertise kmod dependencies in\n\tpmdinfo",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Add a new macro RTE_PMD_REGISTER_KMOD_DEP() that allows a driver to\ndeclare the list of kernel modules required to run properly.\n\nToday, most PCI drivers require uio/vfio.\n\nSigned-off-by: Olivier Matz <olivier.matz@6wind.com>\nAcked-by: Fiona Trahe <fiona.trahe@intel.com>\n---\n\nv1 -> v2:                                                                                                \n- do not advertise uio_pci_generic for vf drivers\n- rebase on top of head: use new driver names and prefix\n  macro with RTE_                                                                                       \n\nrfc -> v1:\n- the kmod information can be per-device using a modalias-like\n  pattern\n- change syntax to use '&' and '|' instead of ',' and ':'\n- remove useless prerequisites in kmod lis: no need to\n  specify both uio and uio_pci_generic, only the latter is\n  required\n- update kmod list in szedata2 driver\n- remove kmod list in qat driver: it requires more than just loading\n  a kmod, which is described in documentation\n\n\n buildtools/pmdinfogen/pmdinfogen.c      |  1 +\n buildtools/pmdinfogen/pmdinfogen.h      |  1 +\n drivers/net/bnx2x/bnx2x_ethdev.c        |  2 ++\n drivers/net/bnxt/bnxt_ethdev.c          |  1 +\n drivers/net/cxgbe/cxgbe_ethdev.c        |  1 +\n drivers/net/e1000/em_ethdev.c           |  1 +\n drivers/net/e1000/igb_ethdev.c          |  2 ++\n drivers/net/ena/ena_ethdev.c            |  1 +\n drivers/net/enic/enic_ethdev.c          |  1 +\n drivers/net/fm10k/fm10k_ethdev.c        |  1 +\n drivers/net/i40e/i40e_ethdev.c          |  1 +\n drivers/net/i40e/i40e_ethdev_vf.c       |  1 +\n drivers/net/ixgbe/ixgbe_ethdev.c        |  2 ++\n drivers/net/mlx4/mlx4.c                 |  1 +\n drivers/net/mlx5/mlx5.c                 |  1 +\n drivers/net/nfp/nfp_net.c               |  1 +\n drivers/net/qede/qede_ethdev.c          |  2 ++\n drivers/net/szedata2/rte_eth_szedata2.c |  2 ++\n drivers/net/thunderx/nicvf_ethdev.c     |  1 +\n drivers/net/virtio/virtio_ethdev.c      |  1 +\n drivers/net/vmxnet3/vmxnet3_ethdev.c    |  1 +\n lib/librte_eal/common/include/rte_dev.h | 25 +++++++++++++++++++++++++\n tools/dpdk-pmdinfo.py                   |  5 ++++-\n 23 files changed, 55 insertions(+), 1 deletion(-)\n\n--\n2.8.1",
    "diff": "diff --git a/buildtools/pmdinfogen/pmdinfogen.c b/buildtools/pmdinfogen/pmdinfogen.c\nindex 59ab956..5129c57 100644\n--- a/buildtools/pmdinfogen/pmdinfogen.c\n+++ b/buildtools/pmdinfogen/pmdinfogen.c\n@@ -269,6 +269,7 @@ struct opt_tag {\n \n static const struct opt_tag opt_tags[] = {\n \t{\"_param_string_export\", \"params\"},\n+\t{\"_kmod_dep_export\", \"kmod\"},\n };\n \n static int complete_pmd_entry(struct elf_info *info, struct pmd_driver *drv)\ndiff --git a/buildtools/pmdinfogen/pmdinfogen.h b/buildtools/pmdinfogen/pmdinfogen.h\nindex 1da2966..2fab2aa 100644\n--- a/buildtools/pmdinfogen/pmdinfogen.h\n+++ b/buildtools/pmdinfogen/pmdinfogen.h\n@@ -85,6 +85,7 @@ else \\\n \n enum opt_params {\n \tPMD_PARAM_STRING = 0,\n+\tPMD_KMOD_DEP,\n \tPMD_OPT_MAX\n };\n \ndiff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c\nindex 0eae433..0f1e4a2 100644\n--- a/drivers/net/bnx2x/bnx2x_ethdev.c\n+++ b/drivers/net/bnx2x/bnx2x_ethdev.c\n@@ -643,5 +643,7 @@ static struct eth_driver rte_bnx2xvf_pmd = {\n \n RTE_PMD_REGISTER_PCI(net_bnx2x, rte_bnx2x_pmd.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_bnx2x, pci_id_bnx2x_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_bnx2x, \"* igb_uio | uio_pci_generic | vfio\");\n RTE_PMD_REGISTER_PCI(net_bnx2xvf, rte_bnx2xvf_pmd.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_bnx2xvf, pci_id_bnx2xvf_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_bnx2xvf, \"* igb_uio | vfio\");\ndiff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c\nindex 035fe07..a24e153 100644\n--- a/drivers/net/bnxt/bnxt_ethdev.c\n+++ b/drivers/net/bnxt/bnxt_ethdev.c\n@@ -1173,3 +1173,4 @@ static struct eth_driver bnxt_rte_pmd = {\n \n RTE_PMD_REGISTER_PCI(net_bnxt, bnxt_rte_pmd.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_bnxt, bnxt_pci_id_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_bnxt, \"* igb_uio | uio_pci_generic | vfio\");\ndiff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c\nindex b7f28eb..317598d 100644\n--- a/drivers/net/cxgbe/cxgbe_ethdev.c\n+++ b/drivers/net/cxgbe/cxgbe_ethdev.c\n@@ -1050,3 +1050,4 @@ static struct eth_driver rte_cxgbe_pmd = {\n \n RTE_PMD_REGISTER_PCI(net_cxgbe, rte_cxgbe_pmd.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_cxgbe, cxgb4_pci_tbl);\n+RTE_PMD_REGISTER_KMOD_DEP(net_cxgbe, \"* igb_uio | uio_pci_generic | vfio\");\ndiff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c\nindex aee3d34..866a5cf 100644\n--- a/drivers/net/e1000/em_ethdev.c\n+++ b/drivers/net/e1000/em_ethdev.c\n@@ -1807,3 +1807,4 @@ eth_em_set_mc_addr_list(struct rte_eth_dev *dev,\n \n RTE_PMD_REGISTER_PCI(net_e1000_em, rte_em_pmd.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_e1000_em, pci_id_em_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_e1000_em, \"* igb_uio | uio_pci_generic | vfio\");\ndiff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c\nindex 2fddf0c..08f2a68 100644\n--- a/drivers/net/e1000/igb_ethdev.c\n+++ b/drivers/net/e1000/igb_ethdev.c\n@@ -5240,5 +5240,7 @@ eth_igb_configure_msix_intr(struct rte_eth_dev *dev)\n \n RTE_PMD_REGISTER_PCI(net_e1000_igb, rte_igb_pmd.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_e1000_igb, pci_id_igb_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_e1000_igb, \"* igb_uio | uio_pci_generic | vfio\");\n RTE_PMD_REGISTER_PCI(net_e1000_igb_vf, rte_igbvf_pmd.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_e1000_igb_vf, pci_id_igbvf_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_e1000_igb_vf, \"* igb_uio | vfio\");\ndiff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c\nindex ab9a178..555fb31 100644\n--- a/drivers/net/ena/ena_ethdev.c\n+++ b/drivers/net/ena/ena_ethdev.c\n@@ -1716,3 +1716,4 @@ static struct eth_driver rte_ena_pmd = {\n \n RTE_PMD_REGISTER_PCI(net_ena, rte_ena_pmd.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_ena, pci_id_ena_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_ena, \"* igb_uio | uio_pci_generic | vfio\");\ndiff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c\nindex 2b154ec..f997302 100644\n--- a/drivers/net/enic/enic_ethdev.c\n+++ b/drivers/net/enic/enic_ethdev.c\n@@ -645,3 +645,4 @@ static struct eth_driver rte_enic_pmd = {\n \n RTE_PMD_REGISTER_PCI(net_enic, rte_enic_pmd.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_enic, pci_id_enic_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_enic, \"* igb_uio | uio_pci_generic | vfio\");\ndiff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c\nindex 923690c..fe74f6d 100644\n--- a/drivers/net/fm10k/fm10k_ethdev.c\n+++ b/drivers/net/fm10k/fm10k_ethdev.c\n@@ -3074,3 +3074,4 @@ static struct eth_driver rte_pmd_fm10k = {\n \n RTE_PMD_REGISTER_PCI(net_fm10k, rte_pmd_fm10k.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_fm10k, pci_id_fm10k_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_fm10k, \"* igb_uio | uio_pci_generic | vfio\");\ndiff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c\nindex 67778ba..b0c0fbf 100644\n--- a/drivers/net/i40e/i40e_ethdev.c\n+++ b/drivers/net/i40e/i40e_ethdev.c\n@@ -711,6 +711,7 @@ rte_i40e_dev_atomic_write_link_status(struct rte_eth_dev *dev,\n \n RTE_PMD_REGISTER_PCI(net_i40e, rte_i40e_pmd.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_i40e, pci_id_i40e_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_i40e, \"* igb_uio | uio_pci_generic | vfio\");\n \n #ifndef I40E_GLQF_ORT\n #define I40E_GLQF_ORT(_i)    (0x00268900 + ((_i) * 4))\ndiff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c\nindex aa306d6..7869b9b 100644\n--- a/drivers/net/i40e/i40e_ethdev_vf.c\n+++ b/drivers/net/i40e/i40e_ethdev_vf.c\n@@ -1539,6 +1539,7 @@ static struct eth_driver rte_i40evf_pmd = {\n \n RTE_PMD_REGISTER_PCI(net_i40e_vf, rte_i40evf_pmd.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_i40e_vf, pci_id_i40evf_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_i40e_vf, \"* igb_uio | vfio\");\n \n static int\n i40evf_dev_configure(struct rte_eth_dev *dev)\ndiff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c\nindex edc9b22..baffc71 100644\n--- a/drivers/net/ixgbe/ixgbe_ethdev.c\n+++ b/drivers/net/ixgbe/ixgbe_ethdev.c\n@@ -7594,5 +7594,7 @@ ixgbevf_dev_interrupt_handler(__rte_unused struct rte_intr_handle *handle,\n \n RTE_PMD_REGISTER_PCI(net_ixgbe, rte_ixgbe_pmd.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_ixgbe, pci_id_ixgbe_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_ixgbe, \"* igb_uio | uio_pci_generic | vfio\");\n RTE_PMD_REGISTER_PCI(net_ixgbe_vf, rte_ixgbevf_pmd.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_ixgbe_vf, pci_id_ixgbevf_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_ixgbe_vf, \"* igb_uio | vfio\");\ndiff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c\nindex da61a85..a0065bf 100644\n--- a/drivers/net/mlx4/mlx4.c\n+++ b/drivers/net/mlx4/mlx4.c\n@@ -5937,3 +5937,4 @@ rte_mlx4_pmd_init(void)\n \n RTE_PMD_EXPORT_NAME(net_mlx4, __COUNTER__);\n RTE_PMD_REGISTER_PCI_TABLE(net_mlx4, mlx4_pci_id_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_mlx4, \"* igb_uio | uio_pci_generic | vfio\");\ndiff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c\nindex 90cc35e..b0343f3 100644\n--- a/drivers/net/mlx5/mlx5.c\n+++ b/drivers/net/mlx5/mlx5.c\n@@ -759,3 +759,4 @@ rte_mlx5_pmd_init(void)\n \n RTE_PMD_EXPORT_NAME(net_mlx5, __COUNTER__);\n RTE_PMD_REGISTER_PCI_TABLE(net_mlx5, mlx5_pci_id_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_mlx5, \"* igb_uio | uio_pci_generic | vfio\");\ndiff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c\nindex c6b1587..707be8b 100644\n--- a/drivers/net/nfp/nfp_net.c\n+++ b/drivers/net/nfp/nfp_net.c\n@@ -2481,6 +2481,7 @@ static struct eth_driver rte_nfp_net_pmd = {\n \n RTE_PMD_REGISTER_PCI(net_nfp, rte_nfp_net_pmd.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_nfp, pci_id_nfp_net_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_nfp, \"* igb_uio | uio_pci_generic | vfio\");\n \n /*\n  * Local variables:\ndiff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c\nindex d106dd0..001166a 100644\n--- a/drivers/net/qede/qede_ethdev.c\n+++ b/drivers/net/qede/qede_ethdev.c\n@@ -1668,5 +1668,7 @@ static struct eth_driver rte_qede_pmd = {\n \n RTE_PMD_REGISTER_PCI(net_qede, rte_qede_pmd.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_qede, pci_id_qede_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_qede, \"* igb_uio | uio_pci_generic | vfio\");\n RTE_PMD_REGISTER_PCI(net_qede_vf, rte_qedevf_pmd.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_qede_vf, pci_id_qedevf_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_qede_vf, \"* igb_uio | vfio\");\ndiff --git a/drivers/net/szedata2/rte_eth_szedata2.c b/drivers/net/szedata2/rte_eth_szedata2.c\nindex f3cd52d..677ba9f 100644\n--- a/drivers/net/szedata2/rte_eth_szedata2.c\n+++ b/drivers/net/szedata2/rte_eth_szedata2.c\n@@ -1583,3 +1583,5 @@ static struct eth_driver szedata2_eth_driver = {\n \n RTE_PMD_REGISTER_PCI(RTE_SZEDATA2_DRIVER_NAME, szedata2_eth_driver.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(RTE_SZEDATA2_DRIVER_NAME, rte_szedata2_pci_id_table);\n+RTE_PMD_REGISTER_KMOD_DEP(RTE_SZEDATA2_DRIVER_NAME,\n+\t\"* combo6core & combov3 & szedata2 & szedata2_cv3\");\ndiff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c\nindex 466e49c..db03fa8 100644\n--- a/drivers/net/thunderx/nicvf_ethdev.c\n+++ b/drivers/net/thunderx/nicvf_ethdev.c\n@@ -2121,3 +2121,4 @@ static struct eth_driver rte_nicvf_pmd = {\n \n RTE_PMD_REGISTER_PCI(net_thunderx, rte_nicvf_pmd.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_thunderx, pci_id_nicvf_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_thunderx, \"* igb_uio | uio_pci_generic | vfio\");\ndiff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c\nindex 079fd6c..1bd60e9 100644\n--- a/drivers/net/virtio/virtio_ethdev.c\n+++ b/drivers/net/virtio/virtio_ethdev.c\n@@ -1669,3 +1669,4 @@ __rte_unused uint8_t is_rx)\n \n RTE_PMD_EXPORT_NAME(net_virtio, __COUNTER__);\n RTE_PMD_REGISTER_PCI_TABLE(net_virtio, pci_id_virtio_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_virtio, \"* igb_uio | uio_pci_generic | vfio\");\ndiff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c\nindex 8bb13e5..93c9ac9 100644\n--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c\n+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c\n@@ -962,3 +962,4 @@ vmxnet3_process_events(struct vmxnet3_hw *hw)\n \n RTE_PMD_REGISTER_PCI(net_vmxnet3, rte_vmxnet3_pmd.pci_drv);\n RTE_PMD_REGISTER_PCI_TABLE(net_vmxnet3, pci_id_vmxnet3_map);\n+RTE_PMD_REGISTER_KMOD_DEP(net_vmxnet3, \"* igb_uio | uio_pci_generic | vfio\");\ndiff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h\nindex 8840380..1708244 100644\n--- a/lib/librte_eal/common/include/rte_dev.h\n+++ b/lib/librte_eal/common/include/rte_dev.h\n@@ -239,6 +239,31 @@ RTE_STR(table)\n static const char DRV_EXP_TAG(name, param_string_export)[] \\\n __attribute__((used)) = str\n \n+/**\n+ * Advertise the list of kernel modules required to run this driver\n+ *\n+ * This string lists the kernel modules required for the devices\n+ * associated to a PMD. The format of each line of the string is:\n+ * \"<device-pattern> <kmod-expression>\".\n+ *\n+ * The possible formats for the device pattern are:\n+ *   \"*\"                     all devices supported by this driver\n+ *   \"pci:*\"                 all PCI devices supported by this driver\n+ *   \"pci:v8086:d*:sv*:sd*\"  all PCI devices supported by this driver\n+ *                           whose vendor id is 0x8086.\n+ *\n+ * The format of the kernel modules list is a parenthesed expression\n+ * containing logical-and (&) and logical-or (|).\n+ *\n+ * The device pattern and the kmod expression are separated by a space.\n+ *\n+ * Example:\n+ * - \"* igb_uio | uio_pci_generic | vfio\"\n+ */\n+#define RTE_PMD_REGISTER_KMOD_DEP(name, str) \\\n+static const char DRV_EXP_TAG(name, kmod_dep_export)[] \\\n+__attribute__((used)) = str\n+\n #ifdef __cplusplus\n }\n #endif\ndiff --git a/tools/dpdk-pmdinfo.py b/tools/dpdk-pmdinfo.py\nindex 3db9819..17bfed4 100755\n--- a/tools/dpdk-pmdinfo.py\n+++ b/tools/dpdk-pmdinfo.py\n@@ -312,7 +312,10 @@ def parse_pmd_info_string(self, mystring):\n         global raw_output\n         global pcidb\n \n-        optional_pmd_info = [{'id': 'params', 'tag': 'PMD PARAMETERS'}]\n+        optional_pmd_info = [\n+            {'id': 'params', 'tag': 'PMD PARAMETERS'},\n+            {'id': 'kmod', 'tag': 'PMD KMOD DEPENDENCIES'}\n+        ]\n \n         i = mystring.index(\"=\")\n         mystring = mystring[i + 2:]\n",
    "prefixes": [
        "dpdk-dev",
        "v2"
    ]
}