get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 19619,
    "url": "http://patches.dpdk.org/api/patches/19619/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1484663828-55868-1-git-send-email-shahafs@mellanox.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": "<1484663828-55868-1-git-send-email-shahafs@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1484663828-55868-1-git-send-email-shahafs@mellanox.com",
    "date": "2017-01-17T14:37:08",
    "name": "[dpdk-dev,v4] net/mlx5: support extended statistics",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "ab0170351d5fc3ae5e1c19c44ef19fef1f210273",
    "submitter": {
        "id": 634,
        "url": "http://patches.dpdk.org/api/people/634/?format=api",
        "name": "Shahaf Shuler",
        "email": "shahafs@mellanox.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1484663828-55868-1-git-send-email-shahafs@mellanox.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/19619/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/19619/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 8A2D511DE;\n\tTue, 17 Jan 2017 15:37:17 +0100 (CET)",
            "from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129])\n\tby dpdk.org (Postfix) with ESMTP id 59E211094\n\tfor <dev@dpdk.org>; Tue, 17 Jan 2017 15:37:16 +0100 (CET)",
            "from Internal Mail-Server by MTLPINE1 (envelope-from\n\tshahafs@mellanox.com)\n\twith ESMTPS (AES256-SHA encrypted); 17 Jan 2017 16:37:12 +0200",
            "from arch010.mtl.labs.mlnx (arch010.mtl.labs.mlnx [10.7.12.210])\n\tby labmailer.mlnx (8.13.8/8.13.8) with ESMTP id v0HEbCHp021239;\n\tTue, 17 Jan 2017 16:37:12 +0200",
            "from arch010.mtl.labs.mlnx (localhost [127.0.0.1])\n\tby arch010.mtl.labs.mlnx (8.14.7/8.14.7) with ESMTP id v0HEbC0t055906;\n\tTue, 17 Jan 2017 16:37:12 +0200",
            "(from root@localhost)\n\tby arch010.mtl.labs.mlnx (8.14.7/8.14.7/Submit) id v0HEb81i055904;\n\tTue, 17 Jan 2017 16:37:08 +0200"
        ],
        "From": "Shahaf Shuler <shahafs@mellanox.com>",
        "To": "adrien.mazarguil@6wind.com",
        "Cc": "dev@dpdk.org, Elad Persiko <eladpe@mellanox.com>",
        "Date": "Tue, 17 Jan 2017 16:37:08 +0200",
        "Message-Id": "<1484663828-55868-1-git-send-email-shahafs@mellanox.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1484573439-10752-1-git-send-email-shahafs@mellanox.com>",
        "References": "<1484573439-10752-1-git-send-email-shahafs@mellanox.com>",
        "Subject": "[dpdk-dev] [PATCH v4] net/mlx5: support extended statistics",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <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": "Implement extended statistics callbacks.\n\nSuggested-by: Hanoch Haim <hhaim@cisco.com>\nSigned-off-by: Shahaf Shuler <shahafs@mellanox.com>\nSigned-off-by: Elad Persiko <eladpe@mellanox.com>\nAcked-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>\n---\non v4:\n * fix compilation issue with clang\n * coding style adjustments\n * replace strcpy with strncpy\n\non v3:\n * change commit log\n * add const to mlx5_counters_init\n * change warning message for unrecognized counter\n\n---\n drivers/net/mlx5/mlx5.c         |   3 +\n drivers/net/mlx5/mlx5.h         |  15 ++\n drivers/net/mlx5/mlx5_defs.h    |   3 +\n drivers/net/mlx5/mlx5_stats.c   | 328 ++++++++++++++++++++++++++++++++++++++++\n drivers/net/mlx5/mlx5_trigger.c |   1 +\n 5 files changed, 350 insertions(+)",
    "diff": "diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c\nindex 55c5b87..11ef301 100644\n--- a/drivers/net/mlx5/mlx5.c\n+++ b/drivers/net/mlx5/mlx5.c\n@@ -202,6 +202,9 @@\n \t.link_update = mlx5_link_update,\n \t.stats_get = mlx5_stats_get,\n \t.stats_reset = mlx5_stats_reset,\n+\t.xstats_get = mlx5_xstats_get,\n+\t.xstats_reset = mlx5_xstats_reset,\n+\t.xstats_get_names = mlx5_xstats_get_names,\n \t.dev_infos_get = mlx5_dev_infos_get,\n \t.dev_supported_ptypes_get = mlx5_dev_supported_ptypes_get,\n \t.vlan_filter_set = mlx5_vlan_filter_set,\ndiff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex a163983..27bb01c 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -89,6 +89,14 @@ enum {\n \tPCI_DEVICE_ID_MELLANOX_CONNECTX5EXVF = 0x101a,\n };\n \n+struct mlx5_xstats_ctrl {\n+\t/* Number of device stats. */\n+\tuint16_t stats_n;\n+\t/* Index in the device counters table. */\n+\tuint16_t dev_table_idx[MLX5_MAX_XSTATS];\n+\tuint64_t base[MLX5_MAX_XSTATS];\n+};\n+\n struct priv {\n \tstruct rte_eth_dev *dev; /* Ethernet device. */\n \tstruct ibv_context *ctx; /* Verbs context. */\n@@ -143,6 +151,7 @@ struct priv {\n \tstruct fdir_queue *fdir_drop_queue; /* Flow director drop queue. */\n \tLIST_HEAD(mlx5_flows, rte_flow) flows; /* RTE Flow rules. */\n \tuint32_t link_speed_capa; /* Link speed capabilities. */\n+\tstruct mlx5_xstats_ctrl xstats_ctrl; /* Extended stats control. */\n \trte_spinlock_t lock; /* Lock for control functions. */\n };\n \n@@ -251,8 +260,14 @@ int mlx5_dev_rss_reta_update(struct rte_eth_dev *,\n \n /* mlx5_stats.c */\n \n+void priv_xstats_init(struct priv *);\n void mlx5_stats_get(struct rte_eth_dev *, struct rte_eth_stats *);\n void mlx5_stats_reset(struct rte_eth_dev *);\n+int mlx5_xstats_get(struct rte_eth_dev *,\n+\t\t    struct rte_eth_xstat *, unsigned int);\n+void mlx5_xstats_reset(struct rte_eth_dev *);\n+int mlx5_xstats_get_names(struct rte_eth_dev *,\n+\t\t\t  struct rte_eth_xstat_name *, unsigned int);\n \n /* mlx5_vlan.c */\n \ndiff --git a/drivers/net/mlx5/mlx5_defs.h b/drivers/net/mlx5/mlx5_defs.h\nindex b32816e..beabb70 100644\n--- a/drivers/net/mlx5/mlx5_defs.h\n+++ b/drivers/net/mlx5/mlx5_defs.h\n@@ -79,4 +79,7 @@\n /* Alarm timeout. */\n #define MLX5_ALARM_TIMEOUT_US 100000\n \n+/* Maximum number of extended statistics counters. */\n+#define MLX5_MAX_XSTATS 32\n+\n #endif /* RTE_PMD_MLX5_DEFS_H_ */\ndiff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c\nindex f2b5781..20c957e 100644\n--- a/drivers/net/mlx5/mlx5_stats.c\n+++ b/drivers/net/mlx5/mlx5_stats.c\n@@ -31,11 +31,16 @@\n  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n  */\n \n+#include <linux/sockios.h>\n+#include <linux/ethtool.h>\n+\n /* DPDK headers don't like -pedantic. */\n #ifdef PEDANTIC\n #pragma GCC diagnostic ignored \"-Wpedantic\"\n #endif\n #include <rte_ethdev.h>\n+#include <rte_common.h>\n+#include <rte_malloc.h>\n #ifdef PEDANTIC\n #pragma GCC diagnostic error \"-Wpedantic\"\n #endif\n@@ -44,6 +49,252 @@\n #include \"mlx5_rxtx.h\"\n #include \"mlx5_defs.h\"\n \n+struct mlx5_counter_ctrl {\n+\t/* Name of the counter. */\n+\tchar dpdk_name[RTE_ETH_XSTATS_NAME_SIZE];\n+\t/* Name of the counter on the device table. */\n+\tchar ctr_name[RTE_ETH_XSTATS_NAME_SIZE];\n+};\n+\n+static const struct mlx5_counter_ctrl mlx5_counters_init[] = {\n+\t{\n+\t\t.dpdk_name = \"rx_port_unicast_bytes\",\n+\t\t.ctr_name = \"rx_vport_unicast_bytes\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_port_multicast_bytes\",\n+\t\t.ctr_name = \"rx_vport_multicast_bytes\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_port_broadcast_bytes\",\n+\t\t.ctr_name = \"rx_vport_broadcast_bytes\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_port_unicast_packets\",\n+\t\t.ctr_name = \"rx_vport_unicast_packets\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_port_multicast_packets\",\n+\t\t.ctr_name = \"rx_vport_multicast_packets\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_port_broadcast_packets\",\n+\t\t.ctr_name = \"rx_vport_broadcast_packets\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_port_unicast_bytes\",\n+\t\t.ctr_name = \"tx_vport_unicast_bytes\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_port_multicast_bytes\",\n+\t\t.ctr_name = \"tx_vport_multicast_bytes\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_port_broadcast_bytes\",\n+\t\t.ctr_name = \"tx_vport_broadcast_bytes\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_port_unicast_packets\",\n+\t\t.ctr_name = \"tx_vport_unicast_packets\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_port_multicast_packets\",\n+\t\t.ctr_name = \"tx_vport_multicast_packets\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_port_broadcast_packets\",\n+\t\t.ctr_name = \"tx_vport_broadcast_packets\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_wqe_err\",\n+\t\t.ctr_name = \"rx_wqe_err\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_crc_errors_phy\",\n+\t\t.ctr_name = \"rx_crc_errors_phy\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_in_range_len_errors_phy\",\n+\t\t.ctr_name = \"rx_in_range_len_errors_phy\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"rx_symbol_err_phy\",\n+\t\t.ctr_name = \"rx_symbol_err_phy\",\n+\t},\n+\t{\n+\t\t.dpdk_name = \"tx_errors_phy\",\n+\t\t.ctr_name = \"tx_errors_phy\",\n+\t},\n+};\n+\n+static const unsigned int xstats_n = RTE_DIM(mlx5_counters_init);\n+\n+/**\n+ * Read device counters table.\n+ *\n+ * @param priv\n+ *   Pointer to private structure.\n+ * @param[out] stats\n+ *   Counters table output buffer.\n+ *\n+ * @return\n+ *   0 on success and stats is filled, negative on error.\n+ */\n+static int\n+priv_read_dev_counters(struct priv *priv, uint64_t *stats)\n+{\n+\tstruct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl;\n+\tunsigned int i;\n+\tstruct ifreq ifr;\n+\tunsigned int stats_sz = (xstats_ctrl->stats_n * sizeof(uint64_t)) +\n+\t\t\t\t sizeof(struct ethtool_stats);\n+\tstruct ethtool_stats et_stats[(stats_sz + (\n+\t\t\t\t      sizeof(struct ethtool_stats) - 1)) /\n+\t\t\t\t      sizeof(struct ethtool_stats)];\n+\n+\tet_stats->cmd = ETHTOOL_GSTATS;\n+\tet_stats->n_stats = xstats_ctrl->stats_n;\n+\tifr.ifr_data = (caddr_t)et_stats;\n+\tif (priv_ifreq(priv, SIOCETHTOOL, &ifr) != 0) {\n+\t\tWARN(\"unable to read statistic values from device\");\n+\t\treturn -1;\n+\t}\n+\tfor (i = 0; i != xstats_n; ++i)\n+\t\tstats[i] = (uint64_t)\n+\t\t\t   et_stats->data[xstats_ctrl->dev_table_idx[i]];\n+\treturn 0;\n+}\n+\n+/**\n+ * Init the structures to read device counters.\n+ *\n+ * @param priv\n+ *   Pointer to private structure.\n+ */\n+void\n+priv_xstats_init(struct priv *priv)\n+{\n+\tstruct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl;\n+\tunsigned int i;\n+\tunsigned int j;\n+\tchar ifname[IF_NAMESIZE];\n+\tstruct ifreq ifr;\n+\tstruct ethtool_drvinfo drvinfo;\n+\tstruct ethtool_gstrings *strings = NULL;\n+\tunsigned int dev_stats_n;\n+\tunsigned int str_sz;\n+\n+\tif (priv_get_ifname(priv, &ifname)) {\n+\t\tWARN(\"unable to get interface name\");\n+\t\treturn;\n+\t}\n+\t/* How many statistics are available. */\n+\tdrvinfo.cmd = ETHTOOL_GDRVINFO;\n+\tifr.ifr_data = (caddr_t)&drvinfo;\n+\tif (priv_ifreq(priv, SIOCETHTOOL, &ifr) != 0) {\n+\t\tWARN(\"unable to get driver info\");\n+\t\treturn;\n+\t}\n+\tdev_stats_n = drvinfo.n_stats;\n+\tif (dev_stats_n < 1) {\n+\t\tWARN(\"no extended statistics available\");\n+\t\treturn;\n+\t}\n+\txstats_ctrl->stats_n = dev_stats_n;\n+\t/* Allocate memory to grab stat names and values. */\n+\tstr_sz = dev_stats_n * ETH_GSTRING_LEN;\n+\tstrings = (struct ethtool_gstrings *)\n+\t\t  rte_malloc(\"xstats_strings\",\n+\t\t\t     str_sz + sizeof(struct ethtool_gstrings), 0);\n+\tif (!strings) {\n+\t\tWARN(\"unable to allocate memory for xstats\");\n+\t\treturn;\n+\t}\n+\tstrings->cmd = ETHTOOL_GSTRINGS;\n+\tstrings->string_set = ETH_SS_STATS;\n+\tstrings->len = dev_stats_n;\n+\tifr.ifr_data = (caddr_t)strings;\n+\tif (priv_ifreq(priv, SIOCETHTOOL, &ifr) != 0) {\n+\t\tWARN(\"unable to get statistic names\");\n+\t\tgoto free;\n+\t}\n+\tfor (j = 0; j != xstats_n; ++j)\n+\t\txstats_ctrl->dev_table_idx[j] = dev_stats_n;\n+\tfor (i = 0; i != dev_stats_n; ++i) {\n+\t\tconst char *curr_string = (const char *)\n+\t\t\t&strings->data[i * ETH_GSTRING_LEN];\n+\n+\t\tfor (j = 0; j != xstats_n; ++j) {\n+\t\t\tif (!strcmp(mlx5_counters_init[j].ctr_name,\n+\t\t\t\t    curr_string)) {\n+\t\t\t\txstats_ctrl->dev_table_idx[j] = i;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\t}\n+\tfor (j = 0; j != xstats_n; ++j) {\n+\t\tif (xstats_ctrl->dev_table_idx[j] >= dev_stats_n) {\n+\t\t\tWARN(\"counter \\\"%s\\\" is not recognized\",\n+\t\t\t     mlx5_counters_init[j].dpdk_name);\n+\t\t\tgoto free;\n+\t\t}\n+\t}\n+\t/* Copy to base at first time. */\n+\tassert(xstats_n <= MLX5_MAX_XSTATS);\n+\tpriv_read_dev_counters(priv, xstats_ctrl->base);\n+free:\n+\trte_free(strings);\n+}\n+\n+/**\n+ * Get device extended statistics.\n+ *\n+ * @param priv\n+ *   Pointer to private structure.\n+ * @param[out] stats\n+ *   Pointer to rte extended stats table.\n+ *\n+ * @return\n+ *   Number of extended stats on success and stats is filled,\n+ *   negative on error.\n+ */\n+static int\n+priv_xstats_get(struct priv *priv, struct rte_eth_xstat *stats)\n+{\n+\tstruct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl;\n+\tunsigned int i;\n+\tunsigned int n = xstats_n;\n+\tuint64_t counters[n];\n+\n+\tif (priv_read_dev_counters(priv, counters) < 0)\n+\t\treturn -1;\n+\tfor (i = 0; i != xstats_n; ++i) {\n+\t\tstats[i].id = i;\n+\t\tstats[i].value = (counters[i] - xstats_ctrl->base[i]);\n+\t}\n+\treturn n;\n+}\n+\n+/**\n+ * Reset device extended statistics.\n+ *\n+ * @param priv\n+ *   Pointer to private structure.\n+ */\n+static void\n+priv_xstats_reset(struct priv *priv)\n+{\n+\tstruct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl;\n+\tunsigned int i;\n+\tunsigned int n = xstats_n;\n+\tuint64_t counters[n];\n+\n+\tif (priv_read_dev_counters(priv, counters) < 0)\n+\t\treturn;\n+\tfor (i = 0; i != n; ++i)\n+\t\txstats_ctrl->base[i] = counters[i];\n+}\n+\n /**\n  * DPDK callback to get device statistics.\n  *\n@@ -142,3 +393,80 @@\n #endif\n \tpriv_unlock(priv);\n }\n+\n+/**\n+ * DPDK callback to get extended device statistics.\n+ *\n+ * @param dev\n+ *   Pointer to Ethernet device structure.\n+ * @param[out] stats\n+ *   Stats table output buffer.\n+ * @param n\n+ *   The size of the stats table.\n+ *\n+ * @return\n+ *   Number of xstats on success, negative on failure.\n+ */\n+int\n+mlx5_xstats_get(struct rte_eth_dev *dev,\n+\t\tstruct rte_eth_xstat *stats, unsigned int n)\n+{\n+\tstruct priv *priv = mlx5_get_priv(dev);\n+\tint ret = xstats_n;\n+\n+\tif (n >= xstats_n && stats) {\n+\t\tpriv_lock(priv);\n+\t\tret = priv_xstats_get(priv, stats);\n+\t\tpriv_unlock(priv);\n+\t}\n+\treturn ret;\n+}\n+\n+/**\n+ * DPDK callback to clear device extended statistics.\n+ *\n+ * @param dev\n+ *   Pointer to Ethernet device structure.\n+ */\n+void\n+mlx5_xstats_reset(struct rte_eth_dev *dev)\n+{\n+\tstruct priv *priv = mlx5_get_priv(dev);\n+\n+\tpriv_lock(priv);\n+\tpriv_xstats_reset(priv);\n+\tpriv_unlock(priv);\n+}\n+\n+/**\n+ * DPDK callback to retrieve names of extended device statistics\n+ *\n+ * @param dev\n+ *   Pointer to Ethernet device structure.\n+ * @param[out] xstats_names\n+ *   Buffer to insert names into.\n+ * @param n\n+ *   Number of names.\n+ *\n+ * @return\n+ *   Number of xstats names.\n+ */\n+int\n+mlx5_xstats_get_names(struct rte_eth_dev *dev,\n+\t\tstruct rte_eth_xstat_name *xstats_names, unsigned int n)\n+{\n+\tstruct priv *priv = mlx5_get_priv(dev);\n+\tunsigned int i;\n+\n+\tif (n >= xstats_n && xstats_names) {\n+\t\tpriv_lock(priv);\n+\t\tfor (i = 0; i != xstats_n; ++i) {\n+\t\t\tstrncpy(xstats_names[i].name,\n+\t\t\t\tmlx5_counters_init[i].dpdk_name,\n+\t\t\t\tRTE_ETH_XSTATS_NAME_SIZE);\n+\t\t\txstats_names[i].name[RTE_ETH_XSTATS_NAME_SIZE - 1] = 0;\n+\t\t}\n+\t\tpriv_unlock(priv);\n+\t}\n+\treturn xstats_n;\n+}\ndiff --git a/drivers/net/mlx5/mlx5_trigger.c b/drivers/net/mlx5/mlx5_trigger.c\nindex 2399243..30addd2 100644\n--- a/drivers/net/mlx5/mlx5_trigger.c\n+++ b/drivers/net/mlx5/mlx5_trigger.c\n@@ -91,6 +91,7 @@\n \t\tpriv_fdir_enable(priv);\n \tpriv_dev_interrupt_handler_install(priv, dev);\n \terr = priv_flow_start(priv);\n+\tpriv_xstats_init(priv);\n \tpriv_unlock(priv);\n \treturn -err;\n }\n",
    "prefixes": [
        "dpdk-dev",
        "v4"
    ]
}