get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 35073,
    "url": "http://patches.dpdk.org/api/patches/35073/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20180208163538.22407-1-adrien.mazarguil@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": "<20180208163538.22407-1-adrien.mazarguil@6wind.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20180208163538.22407-1-adrien.mazarguil@6wind.com",
    "date": "2018-02-08T16:37:06",
    "name": "[dpdk-dev,v1] net/mlx: control netdevices through ioctl only",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "a57a3b9f0d3213c2b2d312ef27354ab2b563ba62",
    "submitter": {
        "id": 165,
        "url": "http://patches.dpdk.org/api/people/165/?format=api",
        "name": "Adrien Mazarguil",
        "email": "adrien.mazarguil@6wind.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/20180208163538.22407-1-adrien.mazarguil@6wind.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/35073/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/35073/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 [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 5DE831B7EB;\n\tThu,  8 Feb 2018 17:37:22 +0100 (CET)",
            "from mail-wr0-f196.google.com (mail-wr0-f196.google.com\n\t[209.85.128.196]) by dpdk.org (Postfix) with ESMTP id 893EC1B7CB\n\tfor <dev@dpdk.org>; Thu,  8 Feb 2018 17:37:20 +0100 (CET)",
            "by mail-wr0-f196.google.com with SMTP id b52so5359304wrd.10\n\tfor <dev@dpdk.org>; Thu, 08 Feb 2018 08:37:20 -0800 (PST)",
            "from 6wind.com (host.78.145.23.62.rev.coltfrance.com.\n\t[62.23.145.78]) by smtp.gmail.com with ESMTPSA id\n\tk125sm340250wmd.48.2018.02.08.08.37.19\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tThu, 08 Feb 2018 08:37:19 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=6wind-com.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:mime-version:content-disposition;\n\tbh=jGYEJmGMGZM8Qa4df+YI4mvQVf/1ALo7BxP7w3gywbc=;\n\tb=fEish5tdb7YdpbJmKHGLLwZyNbiUZYt2Gk+xizE0OAQUy39FQmMBWe+YPr65ttmh45\n\t6UZM1tKtaTUiwKUlcMbK2RiuIq9tiEu71BgkVd3KhNLUoaLWEjkeu2HWDGW0RdtsWSsA\n\tWl37G5H7LoAsLebA0JSpxkdLZwhR2a/0eXp47bVmHcsg30YWyTn7YK2VzVEKDPVuMsd5\n\t9xhbXFt5CeZ5uf5Nw2+Ss0RZ8iB77wBJ+sdiuZ13iScy0FbBLmG0JkAG2DrI0Nm1VxKX\n\tuVep7v7Bo/Fpu9D90zjRsy5cUKAUjtsZD58m2vBK96netNedqsK9N90iFwK6Z9Tdudcu\n\taOsQ==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:mime-version\n\t:content-disposition;\n\tbh=jGYEJmGMGZM8Qa4df+YI4mvQVf/1ALo7BxP7w3gywbc=;\n\tb=V0GQFtJj4FEzmcd+ug5uQGfLpXwkfbPGm548RzPAhT+LgMApE4c7bffozNhD+cyetM\n\tAOXAsK2ZBWeMGDgXHfVkuU7jOCFwOdKzEuzZ9q8KXD71Aol1h8iXTavVYfjnm1lVziXS\n\tlhRDDLHrVmL6XIcsKpqgukoTBzIGLpbFXX3BbDcxrNyffg0Bnf+9fGgd8CHP1a11fw8Z\n\tSZnq8hrnX/I4NmeaIBLTEkpcS8xy7LFJVQhW8dAITQ7XnGs/8FK04Wj48BfAkF2H4Oi7\n\tnh2BFBEe0cPowj3L1HkU2vsF0TMxI7580iPTS7Bh/MoccLeJnIRsE3uuevWW+z5thryC\n\t54HQ==",
        "X-Gm-Message-State": "APf1xPBJzR+yCmCMraSXRoma/a8xDGAIrBAZK1tr3J6ssidbg92SVBHK\n\txsCVG/78+Y6HRSbxleu3TypLvA==",
        "X-Google-Smtp-Source": "AH8x224TbDpX5s0sWWndl37kavU3eEGqy7K3pL66fBHncVysKEstzbKDTZJj/N4rOnwS1xLeVHovfw==",
        "X-Received": "by 10.223.187.72 with SMTP id x8mr1442252wrg.179.1518107839931; \n\tThu, 08 Feb 2018 08:37:19 -0800 (PST)",
        "Date": "Thu, 8 Feb 2018 17:37:06 +0100",
        "From": "Adrien Mazarguil <adrien.mazarguil@6wind.com>",
        "To": "Shahaf Shuler <shahafs@mellanox.com>",
        "Cc": "Nelio Laranjeiro <nelio.laranjeiro@6wind.com>,\n\tYongseok Koh <yskoh@mellanox.com>, dev@dpdk.org",
        "Message-ID": "<20180208163538.22407-1-adrien.mazarguil@6wind.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=us-ascii",
        "Content-Disposition": "inline",
        "X-Mailer": "git-send-email 2.11.0",
        "Subject": "[dpdk-dev] [PATCH v1] net/mlx: control netdevices through ioctl only",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://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": "<https://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": "Several control operations implemented by these PMDs affect netdevices\nthrough sysfs, itself subject to file system permission checks enforced by\nthe kernel, which limits their use for most purposes to applications\nrunning with root privileges.\n\nSince performing the same operations through ioctl() requires fewer\ncapabilities (only CAP_NET_ADMIN) and given the remaining operations are\nalready implemented this way, this patch standardizes on ioctl() and gets\nrid of redundant code.\n\nSigned-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>\n---\n drivers/net/mlx4/mlx4_ethdev.c | 192 ++-------------------------\n drivers/net/mlx5/mlx5.h        |   2 -\n drivers/net/mlx5/mlx5_ethdev.c | 255 ++++--------------------------------\n drivers/net/mlx5/mlx5_stats.c  |  28 +++-\n 4 files changed, 63 insertions(+), 414 deletions(-)",
    "diff": "diff --git a/drivers/net/mlx4/mlx4_ethdev.c b/drivers/net/mlx4/mlx4_ethdev.c\nindex 3bc692731..fbeef16c8 100644\n--- a/drivers/net/mlx4/mlx4_ethdev.c\n+++ b/drivers/net/mlx4/mlx4_ethdev.c\n@@ -132,167 +132,6 @@ mlx4_get_ifname(const struct priv *priv, char (*ifname)[IF_NAMESIZE])\n }\n \n /**\n- * Read from sysfs entry.\n- *\n- * @param[in] priv\n- *   Pointer to private structure.\n- * @param[in] entry\n- *   Entry name relative to sysfs path.\n- * @param[out] buf\n- *   Data output buffer.\n- * @param size\n- *   Buffer size.\n- *\n- * @return\n- *   Number of bytes read on success, negative errno value otherwise and\n- *   rte_errno is set.\n- */\n-static int\n-mlx4_sysfs_read(const struct priv *priv, const char *entry,\n-\t\tchar *buf, size_t size)\n-{\n-\tchar ifname[IF_NAMESIZE];\n-\tFILE *file;\n-\tint ret;\n-\n-\tret = mlx4_get_ifname(priv, &ifname);\n-\tif (ret)\n-\t\treturn ret;\n-\n-\tMKSTR(path, \"%s/device/net/%s/%s\", priv->ctx->device->ibdev_path,\n-\t      ifname, entry);\n-\n-\tfile = fopen(path, \"rb\");\n-\tif (file == NULL) {\n-\t\trte_errno = errno;\n-\t\treturn -rte_errno;\n-\t}\n-\tret = fread(buf, 1, size, file);\n-\tif ((size_t)ret < size && ferror(file)) {\n-\t\trte_errno = EIO;\n-\t\tret = -rte_errno;\n-\t} else {\n-\t\tret = size;\n-\t}\n-\tfclose(file);\n-\treturn ret;\n-}\n-\n-/**\n- * Write to sysfs entry.\n- *\n- * @param[in] priv\n- *   Pointer to private structure.\n- * @param[in] entry\n- *   Entry name relative to sysfs path.\n- * @param[in] buf\n- *   Data buffer.\n- * @param size\n- *   Buffer size.\n- *\n- * @return\n- *   Number of bytes written on success, negative errno value otherwise and\n- *   rte_errno is set.\n- */\n-static int\n-mlx4_sysfs_write(const struct priv *priv, const char *entry,\n-\t\t char *buf, size_t size)\n-{\n-\tchar ifname[IF_NAMESIZE];\n-\tFILE *file;\n-\tint ret;\n-\n-\tret = mlx4_get_ifname(priv, &ifname);\n-\tif (ret)\n-\t\treturn ret;\n-\n-\tMKSTR(path, \"%s/device/net/%s/%s\", priv->ctx->device->ibdev_path,\n-\t      ifname, entry);\n-\n-\tfile = fopen(path, \"wb\");\n-\tif (file == NULL) {\n-\t\trte_errno = errno;\n-\t\treturn -rte_errno;\n-\t}\n-\tret = fwrite(buf, 1, size, file);\n-\tif ((size_t)ret < size || ferror(file)) {\n-\t\trte_errno = EIO;\n-\t\tret = -rte_errno;\n-\t} else {\n-\t\tret = size;\n-\t}\n-\tfclose(file);\n-\treturn ret;\n-}\n-\n-/**\n- * Get unsigned long sysfs property.\n- *\n- * @param priv\n- *   Pointer to private structure.\n- * @param[in] name\n- *   Entry name relative to sysfs path.\n- * @param[out] value\n- *   Value output buffer.\n- *\n- * @return\n- *   0 on success, negative errno value otherwise and rte_errno is set.\n- */\n-static int\n-mlx4_get_sysfs_ulong(struct priv *priv, const char *name, unsigned long *value)\n-{\n-\tint ret;\n-\tunsigned long value_ret;\n-\tchar value_str[32];\n-\n-\tret = mlx4_sysfs_read(priv, name, value_str, (sizeof(value_str) - 1));\n-\tif (ret < 0) {\n-\t\tDEBUG(\"cannot read %s value from sysfs: %s\",\n-\t\t      name, strerror(rte_errno));\n-\t\treturn ret;\n-\t}\n-\tvalue_str[ret] = '\\0';\n-\terrno = 0;\n-\tvalue_ret = strtoul(value_str, NULL, 0);\n-\tif (errno) {\n-\t\trte_errno = errno;\n-\t\tDEBUG(\"invalid %s value `%s': %s\", name, value_str,\n-\t\t      strerror(rte_errno));\n-\t\treturn -rte_errno;\n-\t}\n-\t*value = value_ret;\n-\treturn 0;\n-}\n-\n-/**\n- * Set unsigned long sysfs property.\n- *\n- * @param priv\n- *   Pointer to private structure.\n- * @param[in] name\n- *   Entry name relative to sysfs path.\n- * @param value\n- *   Value to set.\n- *\n- * @return\n- *   0 on success, negative errno value otherwise and rte_errno is set.\n- */\n-static int\n-mlx4_set_sysfs_ulong(struct priv *priv, const char *name, unsigned long value)\n-{\n-\tint ret;\n-\tMKSTR(value_str, \"%lu\", value);\n-\n-\tret = mlx4_sysfs_write(priv, name, value_str, (sizeof(value_str) - 1));\n-\tif (ret < 0) {\n-\t\tDEBUG(\"cannot write %s `%s' (%lu) to sysfs: %s\",\n-\t\t      name, value_str, value, strerror(rte_errno));\n-\t\treturn ret;\n-\t}\n-\treturn 0;\n-}\n-\n-/**\n  * Perform ifreq ioctl() on associated Ethernet device.\n  *\n  * @param[in] priv\n@@ -361,12 +200,12 @@ mlx4_get_mac(struct priv *priv, uint8_t (*mac)[ETHER_ADDR_LEN])\n int\n mlx4_mtu_get(struct priv *priv, uint16_t *mtu)\n {\n-\tunsigned long ulong_mtu = 0;\n-\tint ret = mlx4_get_sysfs_ulong(priv, \"mtu\", &ulong_mtu);\n+\tstruct ifreq request;\n+\tint ret = mlx4_ifreq(priv, SIOCGIFMTU, &request);\n \n \tif (ret)\n \t\treturn ret;\n-\t*mtu = ulong_mtu;\n+\t*mtu = request.ifr_mtu;\n \treturn 0;\n }\n \n@@ -385,20 +224,13 @@ int\n mlx4_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)\n {\n \tstruct priv *priv = dev->data->dev_private;\n-\tuint16_t new_mtu;\n-\tint ret = mlx4_set_sysfs_ulong(priv, \"mtu\", mtu);\n+\tstruct ifreq request = { .ifr_mtu = mtu, };\n+\tint ret = mlx4_ifreq(priv, SIOCSIFMTU, &request);\n \n \tif (ret)\n \t\treturn ret;\n-\tret = mlx4_mtu_get(priv, &new_mtu);\n-\tif (ret)\n-\t\treturn ret;\n-\tif (new_mtu == mtu) {\n-\t\tpriv->mtu = mtu;\n-\t\treturn 0;\n-\t}\n-\trte_errno = EINVAL;\n-\treturn -rte_errno;\n+\tpriv->mtu = mtu;\n+\treturn 0;\n }\n \n /**\n@@ -417,14 +249,14 @@ mlx4_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)\n static int\n mlx4_set_flags(struct priv *priv, unsigned int keep, unsigned int flags)\n {\n-\tunsigned long tmp = 0;\n-\tint ret = mlx4_get_sysfs_ulong(priv, \"flags\", &tmp);\n+\tstruct ifreq request;\n+\tint ret = mlx4_ifreq(priv, SIOCGIFFLAGS, &request);\n \n \tif (ret)\n \t\treturn ret;\n-\ttmp &= keep;\n-\ttmp |= (flags & (~keep));\n-\treturn mlx4_set_sysfs_ulong(priv, \"flags\", tmp);\n+\trequest.ifr_flags &= keep;\n+\trequest.ifr_flags |= flags & ~keep;\n+\treturn mlx4_ifreq(priv, SIOCSIFFLAGS, &request);\n }\n \n /**\ndiff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex 965c19f21..da44faaf4 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -209,8 +209,6 @@ struct priv *mlx5_get_priv(struct rte_eth_dev *dev);\n int mlx5_is_secondary(void);\n int priv_get_ifname(const struct priv *, char (*)[IF_NAMESIZE]);\n int priv_ifreq(const struct priv *, int req, struct ifreq *);\n-int priv_is_ib_cntr(const char *);\n-int priv_get_cntr_sysfs(struct priv *, const char *, uint64_t *);\n int priv_get_num_vfs(struct priv *, uint16_t *);\n int priv_get_mtu(struct priv *, uint16_t *);\n int priv_set_flags(struct priv *, unsigned int, unsigned int);\ndiff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c\nindex 666507691..b73cb53df 100644\n--- a/drivers/net/mlx5/mlx5_ethdev.c\n+++ b/drivers/net/mlx5/mlx5_ethdev.c\n@@ -7,6 +7,7 @@\n \n #include <stddef.h>\n #include <assert.h>\n+#include <inttypes.h>\n #include <unistd.h>\n #include <stdint.h>\n #include <stdio.h>\n@@ -173,181 +174,6 @@ priv_get_ifname(const struct priv *priv, char (*ifname)[IF_NAMESIZE])\n }\n \n /**\n- * Check if the counter is located on ib counters file.\n- *\n- * @param[in] cntr\n- *   Counter name.\n- *\n- * @return\n- *   1 if counter is located on ib counters file , 0 otherwise.\n- */\n-int\n-priv_is_ib_cntr(const char *cntr)\n-{\n-\tif (!strcmp(cntr, \"out_of_buffer\"))\n-\t\treturn 1;\n-\treturn 0;\n-}\n-\n-/**\n- * Read from sysfs entry.\n- *\n- * @param[in] priv\n- *   Pointer to private structure.\n- * @param[in] entry\n- *   Entry name relative to sysfs path.\n- * @param[out] buf\n- *   Data output buffer.\n- * @param size\n- *   Buffer size.\n- *\n- * @return\n- *   0 on success, -1 on failure and errno is set.\n- */\n-static int\n-priv_sysfs_read(const struct priv *priv, const char *entry,\n-\t\tchar *buf, size_t size)\n-{\n-\tchar ifname[IF_NAMESIZE];\n-\tFILE *file;\n-\tint ret;\n-\tint err;\n-\n-\tif (priv_get_ifname(priv, &ifname))\n-\t\treturn -1;\n-\n-\tif (priv_is_ib_cntr(entry)) {\n-\t\tMKSTR(path, \"%s/ports/1/hw_counters/%s\",\n-\t\t      priv->ibdev_path, entry);\n-\t\tfile = fopen(path, \"rb\");\n-\t} else {\n-\t\tMKSTR(path, \"%s/device/net/%s/%s\",\n-\t\t      priv->ibdev_path, ifname, entry);\n-\t\tfile = fopen(path, \"rb\");\n-\t}\n-\tif (file == NULL)\n-\t\treturn -1;\n-\tret = fread(buf, 1, size, file);\n-\terr = errno;\n-\tif (((size_t)ret < size) && (ferror(file)))\n-\t\tret = -1;\n-\telse\n-\t\tret = size;\n-\tfclose(file);\n-\terrno = err;\n-\treturn ret;\n-}\n-\n-/**\n- * Write to sysfs entry.\n- *\n- * @param[in] priv\n- *   Pointer to private structure.\n- * @param[in] entry\n- *   Entry name relative to sysfs path.\n- * @param[in] buf\n- *   Data buffer.\n- * @param size\n- *   Buffer size.\n- *\n- * @return\n- *   0 on success, -1 on failure and errno is set.\n- */\n-static int\n-priv_sysfs_write(const struct priv *priv, const char *entry,\n-\t\t char *buf, size_t size)\n-{\n-\tchar ifname[IF_NAMESIZE];\n-\tFILE *file;\n-\tint ret;\n-\tint err;\n-\n-\tif (priv_get_ifname(priv, &ifname))\n-\t\treturn -1;\n-\n-\tMKSTR(path, \"%s/device/net/%s/%s\", priv->ibdev_path, ifname, entry);\n-\n-\tfile = fopen(path, \"wb\");\n-\tif (file == NULL)\n-\t\treturn -1;\n-\tret = fwrite(buf, 1, size, file);\n-\terr = errno;\n-\tif (((size_t)ret < size) || (ferror(file)))\n-\t\tret = -1;\n-\telse\n-\t\tret = size;\n-\tfclose(file);\n-\terrno = err;\n-\treturn ret;\n-}\n-\n-/**\n- * Get unsigned long sysfs property.\n- *\n- * @param priv\n- *   Pointer to private structure.\n- * @param[in] name\n- *   Entry name relative to sysfs path.\n- * @param[out] value\n- *   Value output buffer.\n- *\n- * @return\n- *   0 on success, -1 on failure and errno is set.\n- */\n-static int\n-priv_get_sysfs_ulong(struct priv *priv, const char *name, unsigned long *value)\n-{\n-\tint ret;\n-\tunsigned long value_ret;\n-\tchar value_str[32];\n-\n-\tret = priv_sysfs_read(priv, name, value_str, (sizeof(value_str) - 1));\n-\tif (ret == -1) {\n-\t\tDEBUG(\"cannot read %s value from sysfs: %s\",\n-\t\t      name, strerror(errno));\n-\t\treturn -1;\n-\t}\n-\tvalue_str[ret] = '\\0';\n-\terrno = 0;\n-\tvalue_ret = strtoul(value_str, NULL, 0);\n-\tif (errno) {\n-\t\tDEBUG(\"invalid %s value `%s': %s\", name, value_str,\n-\t\t      strerror(errno));\n-\t\treturn -1;\n-\t}\n-\t*value = value_ret;\n-\treturn 0;\n-}\n-\n-/**\n- * Set unsigned long sysfs property.\n- *\n- * @param priv\n- *   Pointer to private structure.\n- * @param[in] name\n- *   Entry name relative to sysfs path.\n- * @param value\n- *   Value to set.\n- *\n- * @return\n- *   0 on success, -1 on failure and errno is set.\n- */\n-static int\n-priv_set_sysfs_ulong(struct priv *priv, const char *name, unsigned long value)\n-{\n-\tint ret;\n-\tMKSTR(value_str, \"%lu\", value);\n-\n-\tret = priv_sysfs_write(priv, name, value_str, (sizeof(value_str) - 1));\n-\tif (ret == -1) {\n-\t\tDEBUG(\"cannot write %s `%s' (%lu) to sysfs: %s\",\n-\t\t      name, value_str, value, strerror(errno));\n-\t\treturn -1;\n-\t}\n-\treturn 0;\n-}\n-\n-/**\n  * Perform ifreq ioctl() on associated Ethernet device.\n  *\n  * @param[in] priv\n@@ -390,20 +216,25 @@ priv_get_num_vfs(struct priv *priv, uint16_t *num_vfs)\n {\n \t/* The sysfs entry name depends on the operating system. */\n \tconst char **name = (const char *[]){\n-\t\t\"device/sriov_numvfs\",\n-\t\t\"device/mlx5_num_vfs\",\n+\t\t\"sriov_numvfs\",\n+\t\t\"mlx5_num_vfs\",\n \t\tNULL,\n \t};\n-\tint ret;\n \n \tdo {\n-\t\tunsigned long ulong_num_vfs;\n+\t\tint n;\n+\t\tFILE *file;\n+\t\tMKSTR(path, \"%s/device/%s\", priv->ibdev_path, *name);\n \n-\t\tret = priv_get_sysfs_ulong(priv, *name, &ulong_num_vfs);\n-\t\tif (!ret)\n-\t\t\t*num_vfs = ulong_num_vfs;\n-\t} while (*(++name) && ret);\n-\treturn ret;\n+\t\tfile = fopen(path, \"rb\");\n+\t\tif (!file)\n+\t\t\tcontinue;\n+\t\tn = fscanf(file, \"%\" SCNu16, num_vfs);\n+\t\tfclose(file);\n+\t\tif (n == 1)\n+\t\t\treturn 0;\n+\t} while (*(++name));\n+\treturn -1;\n }\n \n /**\n@@ -420,35 +251,12 @@ priv_get_num_vfs(struct priv *priv, uint16_t *num_vfs)\n int\n priv_get_mtu(struct priv *priv, uint16_t *mtu)\n {\n-\tunsigned long ulong_mtu;\n+\tstruct ifreq request;\n+\tint ret = priv_ifreq(priv, SIOCGIFMTU, &request);\n \n-\tif (priv_get_sysfs_ulong(priv, \"mtu\", &ulong_mtu) == -1)\n-\t\treturn -1;\n-\t*mtu = ulong_mtu;\n-\treturn 0;\n-}\n-\n-/**\n- * Read device counter from sysfs.\n- *\n- * @param priv\n- *   Pointer to private structure.\n- * @param name\n- *   Counter name.\n- * @param[out] cntr\n- *   Counter output buffer.\n- *\n- * @return\n- *   0 on success, -1 on failure and errno is set.\n- */\n-int\n-priv_get_cntr_sysfs(struct priv *priv, const char *name, uint64_t *cntr)\n-{\n-\tunsigned long ulong_ctr;\n-\n-\tif (priv_get_sysfs_ulong(priv, name, &ulong_ctr) == -1)\n-\t\treturn -1;\n-\t*cntr = ulong_ctr;\n+\tif (ret)\n+\t\treturn ret;\n+\t*mtu = request.ifr_mtu;\n \treturn 0;\n }\n \n@@ -466,15 +274,9 @@ priv_get_cntr_sysfs(struct priv *priv, const char *name, uint64_t *cntr)\n static int\n priv_set_mtu(struct priv *priv, uint16_t mtu)\n {\n-\tuint16_t new_mtu;\n+\tstruct ifreq request = { .ifr_mtu = mtu, };\n \n-\tif (priv_set_sysfs_ulong(priv, \"mtu\", mtu) ||\n-\t    priv_get_mtu(priv, &new_mtu))\n-\t\treturn -1;\n-\tif (new_mtu == mtu)\n-\t\treturn 0;\n-\terrno = EINVAL;\n-\treturn -1;\n+\treturn priv_ifreq(priv, SIOCSIFMTU, &request);\n }\n \n /**\n@@ -493,13 +295,14 @@ priv_set_mtu(struct priv *priv, uint16_t mtu)\n int\n priv_set_flags(struct priv *priv, unsigned int keep, unsigned int flags)\n {\n-\tunsigned long tmp;\n+\tstruct ifreq request;\n+\tint ret = priv_ifreq(priv, SIOCGIFFLAGS, &request);\n \n-\tif (priv_get_sysfs_ulong(priv, \"flags\", &tmp) == -1)\n-\t\treturn -1;\n-\ttmp &= keep;\n-\ttmp |= (flags & (~keep));\n-\treturn priv_set_sysfs_ulong(priv, \"flags\", tmp);\n+\tif (ret)\n+\t\treturn ret;\n+\trequest.ifr_flags &= keep;\n+\trequest.ifr_flags |= flags & ~keep;\n+\treturn priv_ifreq(priv, SIOCSIFFLAGS, &request);\n }\n \n /**\ndiff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c\nindex 378472a70..eb9c65dcc 100644\n--- a/drivers/net/mlx5/mlx5_stats.c\n+++ b/drivers/net/mlx5/mlx5_stats.c\n@@ -3,8 +3,11 @@\n  * Copyright 2015 Mellanox.\n  */\n \n+#include <inttypes.h>\n #include <linux/sockios.h>\n #include <linux/ethtool.h>\n+#include <stdint.h>\n+#include <stdio.h>\n \n #include <rte_ethdev_driver.h>\n #include <rte_common.h>\n@@ -19,6 +22,7 @@ struct mlx5_counter_ctrl {\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+\tuint32_t ib:1; /**< Nonzero for IB counters. */\n };\n \n static const struct mlx5_counter_ctrl mlx5_counters_init[] = {\n@@ -93,6 +97,7 @@ static const struct mlx5_counter_ctrl mlx5_counters_init[] = {\n \t{\n \t\t.dpdk_name = \"rx_out_of_buffer\",\n \t\t.ctr_name = \"out_of_buffer\",\n+\t\t.ib = 1,\n \t},\n \t{\n \t\t.dpdk_name = \"tx_packets_phy\",\n@@ -143,13 +148,24 @@ priv_read_dev_counters(struct priv *priv, uint64_t *stats)\n \t\treturn -1;\n \t}\n \tfor (i = 0; i != xstats_n; ++i) {\n-\t\tif (priv_is_ib_cntr(mlx5_counters_init[i].ctr_name))\n-\t\t\tpriv_get_cntr_sysfs(priv,\n-\t\t\t\t\t    mlx5_counters_init[i].ctr_name,\n-\t\t\t\t\t    &stats[i]);\n-\t\telse\n+\t\tif (mlx5_counters_init[i].ib) {\n+\t\t\tFILE *file;\n+\t\t\tMKSTR(path, \"%s/ports/1/hw_counters/%s\",\n+\t\t\t      priv->ibdev_path,\n+\t\t\t      mlx5_counters_init[i].ctr_name);\n+\n+\t\t\tfile = fopen(path, \"rb\");\n+\t\t\tif (file) {\n+\t\t\t\tint n = fscanf(file, \"%\" SCNu64, &stats[i]);\n+\n+\t\t\t\tfclose(file);\n+\t\t\t\tif (n != 1)\n+\t\t\t\t\tstats[i] = 0;\n+\t\t\t}\n+\t\t} else {\n \t\t\tstats[i] = (uint64_t)\n \t\t\t\tet_stats->data[xstats_ctrl->dev_table_idx[i]];\n+\t\t}\n \t}\n \treturn 0;\n }\n@@ -232,7 +248,7 @@ priv_xstats_init(struct priv *priv)\n \t\t}\n \t}\n \tfor (j = 0; j != xstats_n; ++j) {\n-\t\tif (priv_is_ib_cntr(mlx5_counters_init[j].ctr_name))\n+\t\tif (mlx5_counters_init[j].ib)\n \t\t\tcontinue;\n \t\tif (xstats_ctrl->dev_table_idx[j] >= dev_stats_n) {\n \t\t\tWARN(\"counter \\\"%s\\\" is not recognized\",\n",
    "prefixes": [
        "dpdk-dev",
        "v1"
    ]
}