get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 34755,
    "url": "https://patches.dpdk.org/api/patches/34755/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20180131091318.7894-5-shreyansh.jain@nxp.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<20180131091318.7894-5-shreyansh.jain@nxp.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20180131091318.7894-5-shreyansh.jain@nxp.com",
    "date": "2018-01-31T09:13:12",
    "name": "[dpdk-dev,v4,04/10] rawdev: support for extended stats",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "45cfa920321f71eedaa3cbe51714e5c7ba8b0687",
    "submitter": {
        "id": 497,
        "url": "https://patches.dpdk.org/api/people/497/?format=api",
        "name": "Shreyansh Jain",
        "email": "shreyansh.jain@nxp.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20180131091318.7894-5-shreyansh.jain@nxp.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/34755/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/34755/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 AFB991B752;\n\tWed, 31 Jan 2018 09:59:21 +0100 (CET)",
            "from EUR01-VE1-obe.outbound.protection.outlook.com\n\t(mail-ve1eur01on0083.outbound.protection.outlook.com [104.47.1.83])\n\tby dpdk.org (Postfix) with ESMTP id 817091B745\n\tfor <dev@dpdk.org>; Wed, 31 Jan 2018 09:59:07 +0100 (CET)",
            "from Tophie.ap.freescale.net (192.88.169.1) by\n\tVI1PR0401MB2462.eurprd04.prod.outlook.com (2603:10a6:800:55::17) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.444.14;\n\tWed, 31 Jan 2018 08:58:59 +0000"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version;\n\tbh=TD8OUduDy53RZ5BqrQoZ7ow6ZOitmf5ScX8hqrAxi0c=;\n\tb=AaYq/bJ498Hz5yxZCFiq/fWgxvFUvTZdiA2YjZ4rh5JsoE/uvvjRTvguWoM8lJt5YmTdWftVuSnlLixWY/XMpuNG3ILSTEja2d4HBX/tczc3Ih7+At4VhHgyVWkEVFYCGGNLIiHpc7vFTxo2UELVlSt8rMPhYRkFzXKNv0S2JjM=",
        "Authentication-Results": "spf=none (sender IP is )\n\tsmtp.mailfrom=shreyansh.jain@nxp.com; ",
        "From": "Shreyansh Jain <shreyansh.jain@nxp.com>",
        "To": "thomas@monjalon.net",
        "Cc": "dev@dpdk.org, hemant.agrawal@nxp.com, fiona.trahe@intel.com,\n\trosen.xu@intel.com, Shreyansh Jain <shreyansh.jain@nxp.com>",
        "Date": "Wed, 31 Jan 2018 14:43:12 +0530",
        "Message-Id": "<20180131091318.7894-5-shreyansh.jain@nxp.com>",
        "X-Mailer": "git-send-email 2.14.1",
        "In-Reply-To": "<20180131091318.7894-1-shreyansh.jain@nxp.com>",
        "References": "<20180130145710.24757-1-shreyansh.jain@nxp.com>\n\t<20180131091318.7894-1-shreyansh.jain@nxp.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[192.88.169.1]",
        "X-ClientProxiedBy": "HK2PR02CA0168.apcprd02.prod.outlook.com\n\t(2603:1096:201:1f::28) To VI1PR0401MB2462.eurprd04.prod.outlook.com\n\t(2603:10a6:800:55::17)",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-HT": "Tenant",
        "X-MS-Office365-Filtering-Correlation-Id": "e9bf84fa-f59d-4662-93bc-08d56888e0cc",
        "X-Microsoft-Antispam": "UriScan:; BCL:0; PCL:0;\n\tRULEID:(7020095)(4652020)(4534165)(4627221)(201703031133081)(201702281549075)(48565401081)(5600026)(4604075)(2017052603307)(7153060)(7193020);\n\tSRVR:VI1PR0401MB2462; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; VI1PR0401MB2462;\n\t3:XaIHKckrP+RjoDjc28Z7zJTuwo0/fqaRvjXQlyimP7IGIYRPbNmI6s0m4Ec6yi9VvURrKCQ+e0FhqZzOx4IRZGg19KyLpVWgK5uwTT10dXQWos25aELP/sAr1g154ZP2Iimdcdf2cze9E+JWTP2jk7kYEZNzRtbNzeEvReFVQZ3c6+u8eFLfTEqHXwymAYZUO1LAlTBqIB2bb69OkwbrmmiXj4v6v/Ar5FepQSa+NmCesCn/enwb2JIg4Rzv6tvF;\n\t25:yqhKW9Vx1v2g3Eokr+PrUZxhmpZmEY0tq3/Y/a/abCTL+sdjkumWjcpl/NrH5wHab2jvMpeqmjwoZvLO2GGb8Hffw62EfGDct4htXX3oKuP7M3Yxvdtybj4ieKnmRhoEgOt0zaZx124jl1lH3cW/US4JPhBHgbSCxeEj2UKGuQtP6SoNqm327CHU9v1hAqFjSDt28mK92I1lclr9kBr7DuUnwszxLO3XW3JTOAFABwSMcsqEKLORXA/xtjAW/v4V99tUoUr5SRMcjsH08IqTuBa85/qNzrnRJPFnCzQ6//K7uxxsWMJqcmS94rAcKJ0gH1XqgQbZUwTFfQ8L+zzqUA==;\n\t31:EflBN+bx6yTtxhYJmyKzV2mnDUf5+DHCmnXjHnWWiH5jj6NAhbqfNI8QIIxTBdRTD8+sWjU+XgYiP0d9fz5bChZ6W2VDU9ObY9uS3ZCR5zHy6AfN5Fi4aVxzydDB+Fp5TBWCnHeukVgX7MTMyZth6LhlFS8WERH37AHsKGeM2o6Dkmggntp34UUzkX5E8WAc9fYJ4ng7xliY1zfzY0uHQC9IzBvw/fgCiAUNySQjLic=",
            "1; VI1PR0401MB2462;\n\t20:jLFRml3TqNGna9qfPWzKFOq+BBXtlPxNnbsHLsPFhN54I/1IWxMiVVViIO3JoJPaPxGn+N5JyJ0wNecUIniRhSt6k+8tJb+H4GRHx6hrPJtM0zu2W9eD6U03sGlZERKAM4V7z1ylx4FQjRmUv63F8GsDkTNRSlEDuIVqsEQVXYN+M45SM1Fj7GwfV4nfq68x+E1wmaCDy2Q4pN6TvFrBdKY5OuFyWjqY3+YpM9UVporc4pWET2qgB7MHY5tuEVmvmeMQo+kXgeyjufCs8QD1VNPU2MJq3gOD7V27iIGR0JvcKXgpShUalZ8rH1TFYyhnh8yLNPV2nalTfO/3J4mTLuiVvJ4+89wMFemR8XvIoBDSnfavKbbaoaMyrPCThLD+kuhpHJBFZGrbbEhD4lrtgztn94nL6AH7kXGH4H4CWEXzBrF/l7KTcOjxQ5RpJ6Azsz5RabANt/cn5XPmbyg6dNkap92Yq0R80BFfbtmkrzuWWqXjG07VJpvnmPQCkwPT;\n\t4:PjO0WX7QhyAj7cBLASzBM+fLxLkOfDQ5U0p4bqfk51H3l7JXZIlfLkj6UW6J1Pg+0QPAAvERUULftkRuS0WZrMlg5RUhDbKNlDsBk0IXMp816TNxtvz+8O2veMzywOttrsYJBBKJYaU4T1QgGb/xVy697ZPc9hEJs6tEW/FF6SGgL/zgHGoccjYjpaRdu0AUeMy9MDm7NFIGWRXJMiFa0kHqGhnNkKpdD4M6fU8ZyjWeMAzz9JUGT5SKmbwagoDXOuqFRXwdKYWx50YgS9T2UJCbCFUbyrP2aBgr/+WGl/esp3Kgn+BBgVFH139Lp9xe",
            "=?us-ascii?Q?1; VI1PR0401MB2462;\n\t23:PYyyUAbjWsBYbZ7jYIR/H3UqFUyFD7mcPl97/CM?=\n\tb5kg6wHpa0QejygZi/N9VVW/YhOlL8ioXthtzbWoUFUPWJzUo34Eqm4piN7Kq2ScEWpDxlv/dLvu9LuXNrlf4LyJhFSUniucvNn3pgiH97r3tVBN2e46s3xGQOxjMxjZ1QF6gMM+Azr8r4J9KxpoeUG7Eo7JEUz/8buuktF6DrriBZ+0Fcu7aRA1qwlFcB9sBvdFzizH4Mk4lGfgkKFCZReB4AMJy+QtlqpaAE3gs4IrRCiXQumxKX2Xvl4kRSowk+QV/lkx8OKjYlin9BXmT5e1LSNfV8mfJFEEFpd3N7USHnky4Z5zrDPsJRR/bK9KRwX6UA5gpdyeTwkMQz027FC5T6m5/67L/vveFx7JDD6unOgl5qZk+UswHPAV3zkUgV1bSJOcrDIuL4dekqKSJb9h6b3LgcJqIkcOmPBir/aZW4k/RE10jdN6aMEVrXTEmzTqwOCL9TC8OoRJFyrwUqqCkQATVu8cz4GzC5EP+NQBLvIyZ01/KfHrAr7kaKWyVox53VYHCGIcuVIC70WGhK4Uv1ws970xSLFrNY5fb/yzZB+o2XeVI4uCBKUSMMac9QVoz9MXWWzPvELeby+l4xpIzd2Ep8ywPMNCpyi9r+SNxxUS/NYITZ9exIwxJky9ZhDpjA1gvzyCPhdFXCqw+gsha+hfaqqnTfjgTWXMohdeUlhwLwpCkyIDsZkWrgvJkqdipSUl3Vx8llnRi7/thyihNcnYGidE5yAIVLMIzhH9cJukPdUh7O5GRFMAmuaNAAYQ41/4Yu/41obts2xKaAFuFERGsPst+oVke19ducTfz3FZJRJ/Rs1bBVTp1ya8MSHyCVDkLFDqzNoufI/RKFil3F4ZbjstL3zzzZn0uTAFHl1g62WqII00P5SSOcXtYEecZaBGtrXyiAZjLIH05SzbGvXPuU30Wixosss05q7iVMidfN79cY8YdG/rTo6ogPLE8amlQZat8P41hHS8TdqypphlHbSTucKC2YJDWAWGs8hL3Hm59Vn8hvLYuua7/EeWBYP0tz3+yKXjJWbgXLPacpcDTD9EP2sEsst83lxnylYcwV63BD+V0kunlGEMFCpRKYAtY2LA5ckkXKq1/0OGGrfHwAr6RCnAiHiWIbi0ZKpJKs1mk8eYo2KDC+yfdDZkFSfdeMVf2p1QtslowaxEe",
            "1; VI1PR0401MB2462;\n\t6:7lKfkqYS4UK1j2DonkgZQJhqLO3YELu9T3dE52RqNDEOmSrWix+F9WXEORKftin7kYJH0SVHxKwKCxTnnb3Ct1FmYST2vGuGPNRtW/iYsfs1s+rSivkgcktaf2oUi8kOpBBx/asmyU1cuJj6HFp7lYP8kg7FFw4Dp3qD1NjEIrqS5QHFC7BiriU16UgJDjcWsXq4JUh+9ubXLItlndaeOcpK6uewjkT9H5OS8e781sg1cm04w9b62CR4l8gnDzzH0OxUz3/f8B32eItvUNSS9xSm04ZUqMI8S6/4uzaYbx6Aufpn3XPTGMHNqfdfQnNjXle7RLrchSJxRuoMf0XpcCbEM/+NwQxv9Q8xf9JcBvs=;\n\t5:EPqv/2MpuP3BfHq/vBdSqjgtuBlJYNO2KZM76oBVVBkfbPtEUHoGNLtlRA4tOUcMK8YnECX/Ysxp/6jVCUkeWRSumWt9Rc9F68wYBlvI/ik2k4ym7eI5482ULcy4e0XUui2EtV7T9f0f685RWgvrxwRLIPqaxJIEnY2uw2phcA8=;\n\t24:vHcMGew8zG+98bjSttjZk9UrcjTKL2cqorC15N505/5zRuoxu/B4056IWWa9UmaWII4JgkNqOr/uaNqJQ02+IGOu9+QCZ/1LjBzId0ut5GM=;\n\t7:s0D3KvF0PwBUqmLenX8RXPWwl4A9Vw49ZtnD5iPLhn9H4EuQSraL2FkaFDd53aYE0fnXL+agTxQ6DLfENqrIfi+tKkldNBzRzO0UGN/f6LnKHvKwbfasbkbKxkovKatJmeujy59TOuIGe7mypgZSupUFJO04wd/QS6ytCS+hj4Swg6+0fkSkz1Pne8GslpovTu1FLSJU3skK+POBOebnQ+zQmOsq16gPEnnLACWOEVKrFeDag+R7LrF8GcGVIfVl"
        ],
        "X-MS-TrafficTypeDiagnostic": "VI1PR0401MB2462:",
        "X-Microsoft-Antispam-PRVS": "<VI1PR0401MB2462D82210C5E7BB5A8E311490FB0@VI1PR0401MB2462.eurprd04.prod.outlook.com>",
        "X-Exchange-Antispam-Report-Test": "UriScan:(185117386973197);",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(3231101)(2400082)(944501161)(93006095)(93001095)(10201501046)(6055026)(6041288)(20161123562045)(20161123560045)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(6072148)(201708071742011);\n\tSRVR:VI1PR0401MB2462; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0401MB2462; ",
        "X-Forefront-PRVS": "056929CBB8",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(10009020)(396003)(39380400002)(376002)(366004)(346002)(39860400002)(199004)(189003)(6486002)(6512007)(50226002)(8676002)(48376002)(4326008)(81156014)(316002)(8936002)(66066001)(6666003)(2950100002)(81166006)(6916009)(53936002)(16526019)(5660300001)(47776003)(186003)(26005)(106356001)(2361001)(97736004)(16586007)(305945005)(478600001)(51416003)(386003)(575784001)(36756003)(86362001)(105586002)(68736007)(2351001)(76176011)(1076002)(52116002)(2906002)(6506007)(25786009)(3846002)(6116002)(50466002)(59450400001)(7736002);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR0401MB2462;\n\tH:Tophie.ap.freescale.net; \n\tFPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; ",
        "Received-SPF": "None (protection.outlook.com: nxp.com does not designate\n\tpermitted sender hosts)",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-OriginatorOrg": "nxp.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "31 Jan 2018 08:58:59.8043\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "e9bf84fa-f59d-4662-93bc-08d56888e0cc",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "686ea1d3-bc2b-4c6f-a92c-d99c5c301635",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "VI1PR0401MB2462",
        "Subject": "[dpdk-dev] [PATCH v4 04/10] rawdev: support for extended stats",
        "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": "Generic rawdev library cannot define a pre-defined set of stats\nfor devices which are yet to be defined.\n\nThis patch introduces the xstats support for rawdev so that any\nimplementation can create its own statistics.\n\nSigned-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>\n---\n lib/librte_rawdev/rte_rawdev.c           |  75 ++++++++++++++++++++++\n lib/librte_rawdev/rte_rawdev.h           | 105 +++++++++++++++++++++++++++++++\n lib/librte_rawdev/rte_rawdev_pmd.h       |  72 +++++++++++++++++++++\n lib/librte_rawdev/rte_rawdev_version.map |   4 ++\n 4 files changed, 256 insertions(+)",
    "diff": "diff --git a/lib/librte_rawdev/rte_rawdev.c b/lib/librte_rawdev/rte_rawdev.c\nindex a6d937c34..d6c284554 100644\n--- a/lib/librte_rawdev/rte_rawdev.c\n+++ b/lib/librte_rawdev/rte_rawdev.c\n@@ -245,6 +245,81 @@ rte_rawdev_dump(uint16_t dev_id, FILE *f)\n \treturn (*dev->dev_ops->dump)(dev, f);\n }\n \n+static int\n+xstats_get_count(uint16_t dev_id)\n+{\n+\tstruct rte_rawdev *dev = &rte_rawdevs[dev_id];\n+\n+\tRTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->xstats_get_names, -ENOTSUP);\n+\treturn (*dev->dev_ops->xstats_get_names)(dev, NULL, 0);\n+}\n+\n+int __rte_experimental\n+rte_rawdev_xstats_names_get(uint16_t dev_id,\n+\t\tstruct rte_rawdev_xstats_name *xstats_names,\n+\t\tunsigned int size)\n+{\n+\tconst struct rte_rawdev *dev;\n+\tint cnt_expected_entries;\n+\n+\tRTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -ENODEV);\n+\n+\tcnt_expected_entries = xstats_get_count(dev_id);\n+\n+\tif (xstats_names == NULL || cnt_expected_entries < 0 ||\n+\t    (int)size < cnt_expected_entries || size <= 0)\n+\t\treturn cnt_expected_entries;\n+\n+\tdev = &rte_rawdevs[dev_id];\n+\n+\tRTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->xstats_get_names, -ENOTSUP);\n+\treturn (*dev->dev_ops->xstats_get_names)(dev, xstats_names, size);\n+}\n+\n+/* retrieve rawdev extended statistics */\n+int __rte_experimental\n+rte_rawdev_xstats_get(uint16_t dev_id,\n+\t\t      const unsigned int ids[],\n+\t\t      uint64_t values[],\n+\t\t      unsigned int n)\n+{\n+\tRTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -ENODEV);\n+\tconst struct rte_rawdev *dev = &rte_rawdevs[dev_id];\n+\n+\tRTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->xstats_get, -ENOTSUP);\n+\treturn (*dev->dev_ops->xstats_get)(dev, ids, values, n);\n+}\n+\n+uint64_t __rte_experimental\n+rte_rawdev_xstats_by_name_get(uint16_t dev_id,\n+\t\t\t      const char *name,\n+\t\t\t      unsigned int *id)\n+{\n+\tRTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, 0);\n+\tconst struct rte_rawdev *dev = &rte_rawdevs[dev_id];\n+\tunsigned int temp = -1;\n+\n+\tif (id != NULL)\n+\t\t*id = (unsigned int)-1;\n+\telse\n+\t\tid = &temp; /* driver never gets a NULL value */\n+\n+\t/* implemented by driver */\n+\tRTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->xstats_get_by_name, -ENOTSUP);\n+\treturn (*dev->dev_ops->xstats_get_by_name)(dev, name, id);\n+}\n+\n+int __rte_experimental\n+rte_rawdev_xstats_reset(uint16_t dev_id,\n+\t\t\tconst uint32_t ids[], uint32_t nb_ids)\n+{\n+\tRTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);\n+\tstruct rte_rawdev *dev = &rte_rawdevs[dev_id];\n+\n+\tRTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->xstats_reset, -ENOTSUP);\n+\treturn (*dev->dev_ops->xstats_reset)(dev, ids, nb_ids);\n+}\n+\n int __rte_experimental\n rte_rawdev_start(uint16_t dev_id)\n {\ndiff --git a/lib/librte_rawdev/rte_rawdev.h b/lib/librte_rawdev/rte_rawdev.h\nindex 3820ff08d..28bf9e0ff 100644\n--- a/lib/librte_rawdev/rte_rawdev.h\n+++ b/lib/librte_rawdev/rte_rawdev.h\n@@ -420,6 +420,111 @@ rte_rawdev_dequeue_buffers(uint16_t dev_id,\n \t\t\t   unsigned int count,\n \t\t\t   rte_rawdev_obj_t context);\n \n+/** Maximum name length for extended statistics counters */\n+#define RTE_RAW_DEV_XSTATS_NAME_SIZE 64\n+\n+/**\n+ * A name-key lookup element for extended statistics.\n+ *\n+ * This structure is used to map between names and ID numbers\n+ * for extended ethdev statistics.\n+ */\n+struct rte_rawdev_xstats_name {\n+\tchar name[RTE_RAW_DEV_XSTATS_NAME_SIZE];\n+};\n+\n+/**\n+ * Retrieve names of extended statistics of a raw device.\n+ *\n+ * @param dev_id\n+ *   The identifier of the raw device.\n+ * @param[out] xstats_names\n+ *   Block of memory to insert names into. Must be at least size in capacity.\n+ *   If set to NULL, function returns required capacity.\n+ * @param size\n+ *   Capacity of xstats_names (number of names).\n+ * @return\n+ *   - positive value lower or equal to size: success. The return value\n+ *     is the number of entries filled in the stats table.\n+ *   - positive value higher than size: error, the given statistics table\n+ *     is too small. The return value corresponds to the size that should\n+ *     be given to succeed. The entries in the table are not valid and\n+ *     shall not be used by the caller.\n+ *   - negative value on error:\n+ *        -ENODEV for invalid *dev_id*\n+ *        -ENOTSUP if the device doesn't support this function.\n+ */\n+int __rte_experimental\n+rte_rawdev_xstats_names_get(uint16_t dev_id,\n+\t\t\t    struct rte_rawdev_xstats_name *xstats_names,\n+\t\t\t    unsigned int size);\n+\n+/**\n+ * Retrieve extended statistics of a raw device.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device.\n+ * @param ids\n+ *   The id numbers of the stats to get. The ids can be got from the stat\n+ *   position in the stat list from rte_rawdev_get_xstats_names(), or\n+ *   by using rte_rawdev_get_xstats_by_name()\n+ * @param[out] values\n+ *   The values for each stats request by ID.\n+ * @param n\n+ *   The number of stats requested\n+ * @return\n+ *   - positive value: number of stat entries filled into the values array\n+ *   - negative value on error:\n+ *        -ENODEV for invalid *dev_id*\n+ *        -ENOTSUP if the device doesn't support this function.\n+ */\n+int __rte_experimental\n+rte_rawdev_xstats_get(uint16_t dev_id,\n+\t\t      const unsigned int ids[],\n+\t\t      uint64_t values[],\n+\t\t      unsigned int n);\n+\n+/**\n+ * Retrieve the value of a single stat by requesting it by name.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device\n+ * @param name\n+ *   The stat name to retrieve\n+ * @param[out] id\n+ *   If non-NULL, the numerical id of the stat will be returned, so that further\n+ *   requests for the stat can be got using rte_rawdev_xstats_get, which will\n+ *   be faster as it doesn't need to scan a list of names for the stat.\n+ *   If the stat cannot be found, the id returned will be (unsigned)-1.\n+ * @return\n+ *   - positive value or zero: the stat value\n+ *   - negative value: -EINVAL if stat not found, -ENOTSUP if not supported.\n+ */\n+uint64_t __rte_experimental\n+rte_rawdev_xstats_by_name_get(uint16_t dev_id,\n+\t\t\t      const char *name,\n+\t\t\t      unsigned int *id);\n+\n+/**\n+ * Reset the values of the xstats of the selected component in the device.\n+ *\n+ * @param dev_id\n+ *   The identifier of the device\n+ * @param ids\n+ *   Selects specific statistics to be reset. When NULL, all statistics\n+ *   will be reset. If non-NULL, must point to array of at least\n+ *   *nb_ids* size.\n+ * @param nb_ids\n+ *   The number of ids available from the *ids* array. Ignored when ids is NULL.\n+ * @return\n+ *   - zero: successfully reset the statistics to zero\n+ *   - negative value: -EINVAL invalid parameters, -ENOTSUP if not supported.\n+ */\n+int __rte_experimental\n+rte_rawdev_xstats_reset(uint16_t dev_id,\n+\t\t\tconst uint32_t ids[],\n+\t\t\tuint32_t nb_ids);\n+\n #ifdef __cplusplus\n }\n #endif\ndiff --git a/lib/librte_rawdev/rte_rawdev_pmd.h b/lib/librte_rawdev/rte_rawdev_pmd.h\nindex fe9cc6722..abc7c15c5 100644\n--- a/lib/librte_rawdev/rte_rawdev_pmd.h\n+++ b/lib/librte_rawdev/rte_rawdev_pmd.h\n@@ -353,6 +353,69 @@ typedef int (*rawdev_set_attr_t)(struct rte_rawdev *dev,\n \t\t\t\t const char *attr_name,\n \t\t\t\t const uint64_t attr_value);\n \n+/**\n+ * Retrieve a set of statistics from device.\n+ * Note: Being a raw device, the stats are specific to the device being\n+ * implemented thus represented as xstats.\n+ *\n+ * @param dev\n+ *   Raw device pointer\n+ * @param ids\n+ *   The stat ids to retrieve\n+ * @param values\n+ *   The returned stat values\n+ * @param n\n+ *   The number of id values and entries in the values array\n+ * @return\n+ *   The number of stat values successfully filled into the values array\n+ */\n+typedef int (*rawdev_xstats_get_t)(const struct rte_rawdev *dev,\n+\t\tconst unsigned int ids[], uint64_t values[], unsigned int n);\n+\n+/**\n+ * Resets the statistic values in xstats for the device.\n+ */\n+typedef int (*rawdev_xstats_reset_t)(struct rte_rawdev *dev,\n+\t\tconst uint32_t ids[],\n+\t\tuint32_t nb_ids);\n+\n+/**\n+ * Get names of extended stats of an raw device\n+ *\n+ * @param dev\n+ *   Raw device pointer\n+ * @param xstats_names\n+ *   Array of name values to be filled in\n+ * @param size\n+ *   Number of values in the xstats_names array\n+ * @return\n+ *   When size >= the number of stats, return the number of stat values filled\n+ *   into the array.\n+ *   When size < the number of available stats, return the number of stats\n+ *   values, and do not fill in any data into xstats_names.\n+ */\n+typedef int (*rawdev_xstats_get_names_t)(const struct rte_rawdev *dev,\n+\t\tstruct rte_rawdev_xstats_name *xstats_names,\n+\t\tunsigned int size);\n+\n+/**\n+ * Get value of one stats and optionally return its id\n+ *\n+ * @param dev\n+ *   Raw device pointer\n+ * @param name\n+ *   The name of the stat to retrieve\n+ * @param id\n+ *   Pointer to an unsigned int where we store the stat-id.\n+ *   This pointer may be null if the id is not required.\n+ * @return\n+ *   The value of the stat, or (uint64_t)-1 if the stat is not found.\n+ *   If the stat is not found, the id value will be returned as (unsigned)-1,\n+ *   if id pointer is non-NULL\n+ */\n+typedef uint64_t (*rawdev_xstats_get_by_name_t)(const struct rte_rawdev *dev,\n+\t\t\t\t\t\tconst char *name,\n+\t\t\t\t\t\tunsigned int *id);\n /** Rawdevice operations function pointer table */\n struct rte_rawdev_ops {\n \t/**< Get device info. */\n@@ -388,6 +451,15 @@ struct rte_rawdev_ops {\n \trawdev_get_attr_t attr_get;\n \t/**< Set an attribute managed by the implementation */\n \trawdev_set_attr_t attr_set;\n+\n+\t/**< Get extended device statistics. */\n+\trawdev_xstats_get_t xstats_get;\n+\t/**< Get names of extended stats. */\n+\trawdev_xstats_get_names_t xstats_get_names;\n+\t/**< Get one value by name. */\n+\trawdev_xstats_get_by_name_t xstats_get_by_name;\n+\t/**< Reset the statistics values in xstats. */\n+\trawdev_xstats_reset_t xstats_reset;\n };\n \n /**\ndiff --git a/lib/librte_rawdev/rte_rawdev_version.map b/lib/librte_rawdev/rte_rawdev_version.map\nindex bafe2c5de..469b78d81 100644\n--- a/lib/librte_rawdev/rte_rawdev_version.map\n+++ b/lib/librte_rawdev/rte_rawdev_version.map\n@@ -19,6 +19,10 @@ EXPERIMENTAL {\n \trte_rawdev_socket_id;\n \trte_rawdev_start;\n \trte_rawdev_stop;\n+\trte_rawdev_xstats_by_name_get;\n+\trte_rawdev_xstats_get;\n+\trte_rawdev_xstats_names_get;\n+\trte_rawdev_xstats_reset;\n \trte_rawdevs;\n \n \tlocal: *;\n",
    "prefixes": [
        "dpdk-dev",
        "v4",
        "04/10"
    ]
}