Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/4924/?format=api
https://patches.dpdk.org/api/patches/4924/?format=api", "web_url": "https://patches.dpdk.org/project/dpdk/patch/1432750217-4186-6-git-send-email-stephen@networkplumber.org/", "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": "<1432750217-4186-6-git-send-email-stephen@networkplumber.org>", "list_archive_url": "https://inbox.dpdk.org/dev/1432750217-4186-6-git-send-email-stephen@networkplumber.org", "date": "2015-05-27T18:10:17", "name": "[dpdk-dev,5/5] rte_sched: allow reading without clearing", "commit_ref": null, "pull_url": null, "state": "changes-requested", "archived": true, "hash": "c7ed71ebf9d06c54e0291d03e41bb6bb54f2dfbe", "submitter": { "id": 27, "url": "https://patches.dpdk.org/api/people/27/?format=api", "name": "Stephen Hemminger", "email": "stephen@networkplumber.org" }, "delegate": null, "mbox": "https://patches.dpdk.org/project/dpdk/patch/1432750217-4186-6-git-send-email-stephen@networkplumber.org/mbox/", "series": [], "comments": "https://patches.dpdk.org/api/patches/4924/comments/", "check": "pending", "checks": "https://patches.dpdk.org/api/patches/4924/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 8683BC338;\n\tWed, 27 May 2015 20:10:27 +0200 (CEST)", "from mail-pd0-f172.google.com (mail-pd0-f172.google.com\n\t[209.85.192.172]) by dpdk.org (Postfix) with ESMTP id 229875A8B\n\tfor <dev@dpdk.org>; Wed, 27 May 2015 20:10:22 +0200 (CEST)", "by pdea3 with SMTP id a3so22403097pde.2\n\tfor <dev@dpdk.org>; Wed, 27 May 2015 11:10:21 -0700 (PDT)", "from urahara.home.lan (static-50-53-82-155.bvtn.or.frontiernet.net.\n\t[50.53.82.155]) by mx.google.com with ESMTPSA id\n\tdb1sm3008254pdb.50.2015.05.27.11.10.20\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tWed, 27 May 2015 11:10:20 -0700 (PDT)" ], "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20130820;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=WgBCIoob9CSBzTWaZZ0uymYbGgOe73A58lIKjkGpU2Y=;\n\tb=PscHLZ6e3U04kusLpg7NLSwX+KeH56NJwT05fFqpzPdWes0evFa6CRa0PeJLMUowzj\n\t2a/NrgLjJRy+GaNvF1JRrdA1r3V/0ScWIULqWZQBGgYnHVoEHT6rfrQmiUAdFIWKIDQg\n\tAqquxHlNbS4kuEPus4Av3oIzTV3I+JXczi5Ffzh178r/98/q8Q++xi3jjO/e+GwBHl1N\n\tV4DqhYRPhmTlD28y10kelAPv3r2C0Ifdm48gC7PwcHrpPlxftI6Y5vk6L4PN85a2iPM1\n\tp7aoYX1BvlsrRyPREnYFCYpgLpPEbP4R0ZjoYPK1ldDYkUF7wdPioyfIxLOvrvcLLgfz\n\tyCIw==", "X-Gm-Message-State": "ALoCoQm5jWrJ6tdifCfso3t7KOUfUc6WLViPGIEc4SxKmpjrtyl8jaLT5t5KKAIzlJ1OrTM9wVZ+", "X-Received": "by 10.68.170.229 with SMTP id ap5mr61383991pbc.132.1432750221545;\n\tWed, 27 May 2015 11:10:21 -0700 (PDT)", "From": "Stephen Hemminger <stephen@networkplumber.org>", "To": "cristian.dumitrescu@intel.com", "Date": "Wed, 27 May 2015 11:10:17 -0700", "Message-Id": "<1432750217-4186-6-git-send-email-stephen@networkplumber.org>", "X-Mailer": "git-send-email 2.1.4", "In-Reply-To": "<1432750217-4186-1-git-send-email-stephen@networkplumber.org>", "References": "<1432750217-4186-1-git-send-email-stephen@networkplumber.org>", "Cc": "dev@dpdk.org", "Subject": "[dpdk-dev] [PATCH 5/5] rte_sched: allow reading without clearing", "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": "The rte_sched statistics API should allow reading statistics without\nclearing. Make auto-clear optional. In this version, this is handled\nby deprecating the old API and adding a new one.\n\nSigned-off-by: Stephen Hemminger <stephen@networkplumber.org>\n---\n app/test/test_sched.c | 4 +--\n lib/librte_sched/rte_sched.c | 65 +++++++++++++++++++++-------------\n lib/librte_sched/rte_sched.h | 37 ++++++++++++++-----\n lib/librte_sched/rte_sched_version.map | 2 ++\n 4 files changed, 74 insertions(+), 34 deletions(-)", "diff": "diff --git a/app/test/test_sched.c b/app/test/test_sched.c\nindex c7239f8..03f89b4 100644\n--- a/app/test/test_sched.c\n+++ b/app/test/test_sched.c\n@@ -198,13 +198,13 @@ test_sched(void)\n \n \tstruct rte_sched_subport_stats subport_stats;\n \tuint32_t tc_ov;\n-\trte_sched_subport_read_stats(port, SUBPORT, &subport_stats, &tc_ov);\n+\trte_sched_subport_stats(port, SUBPORT, &subport_stats, &tc_ov, 1);\n #if 0\n \tTEST_ASSERT_EQUAL(subport_stats.n_pkts_tc[TC-1], 10, \"Wrong subport stats\\n\");\n #endif\n \tstruct rte_sched_queue_stats queue_stats;\n \tuint16_t qlen;\n-\trte_sched_queue_read_stats(port, QUEUE, &queue_stats, &qlen);\n+\trte_sched_queue_stats(port, QUEUE, &queue_stats, &qlen, 1);\n #if 0\n \tTEST_ASSERT_EQUAL(queue_stats.n_pkts, 10, \"Wrong queue stats\\n\");\n #endif\ndiff --git a/lib/librte_sched/rte_sched.c b/lib/librte_sched/rte_sched.c\nindex 9c9419d..b4d7edd 100644\n--- a/lib/librte_sched/rte_sched.c\n+++ b/lib/librte_sched/rte_sched.c\n@@ -965,61 +965,78 @@ rte_sched_port_pkt_read_color(const struct rte_mbuf *pkt)\n }\n \n int\n-rte_sched_subport_read_stats(struct rte_sched_port *port,\n-\tuint32_t subport_id,\n-\tstruct rte_sched_subport_stats *stats,\n-\tuint32_t *tc_ov)\n+rte_sched_subport_stats(struct rte_sched_port *port, uint32_t subport_id,\n+\t\t\tstruct rte_sched_subport_stats *stats,\n+\t\t\tuint32_t *tc_ov, int clear)\n {\n \tstruct rte_sched_subport *s;\n \n \t/* Check user parameters */\n-\tif ((port == NULL) ||\n-\t (subport_id >= port->n_subports_per_port) ||\n-\t\t(stats == NULL) ||\n-\t\t(tc_ov == NULL)) {\n+\tif (port == NULL || subport_id >= port->n_subports_per_port)\n \t\treturn -1;\n-\t}\n+\n \ts = port->subport + subport_id;\n \n \t/* Copy subport stats and clear */\n-\tmemcpy(stats, &s->stats, sizeof(struct rte_sched_subport_stats));\n-\tmemset(&s->stats, 0, sizeof(struct rte_sched_subport_stats));\n+\tif (stats)\n+\t\t*stats = s->stats;\n+\tif (clear)\n+\t\tmemset(&s->stats, 0, sizeof(struct rte_sched_subport_stats));\n \n \t/* Subport TC ovesubscription status */\n-\t*tc_ov = s->tc_ov;\n+\tif (tc_ov)\n+\t\t*tc_ov = s->tc_ov;\n \n \treturn 0;\n }\n \n+/* Deprecated API, always clears */\n int\n-rte_sched_queue_read_stats(struct rte_sched_port *port,\n-\tuint32_t queue_id,\n-\tstruct rte_sched_queue_stats *stats,\n-\tuint16_t *qlen)\n+rte_sched_subport_read_stats(struct rte_sched_port *port, uint32_t subport_id,\n+\t\t\t struct rte_sched_subport_stats *stats,\n+\t\t\t uint32_t *tc_ov)\n+{\n+\treturn rte_sched_subport_stats(port, subport_id, stats, tc_ov, 1);\n+}\n+\n+int\n+rte_sched_queue_stats(struct rte_sched_port *port, uint32_t queue_id,\n+\t\t struct rte_sched_queue_stats *stats,\n+\t\t uint16_t *qlen, int clear)\n {\n \tstruct rte_sched_queue *q;\n \tstruct rte_sched_queue_extra *qe;\n \n \t/* Check user parameters */\n-\tif ((port == NULL) ||\n-\t (queue_id >= rte_sched_port_queues_per_port(port)) ||\n-\t\t(stats == NULL) ||\n-\t\t(qlen == NULL)) {\n+\tif (port == NULL || queue_id >= rte_sched_port_queues_per_port(port))\n \t\treturn -1;\n-\t}\n+\n \tq = port->queue + queue_id;\n \tqe = port->queue_extra + queue_id;\n \n \t/* Copy queue stats and clear */\n-\tmemcpy(stats, &qe->stats, sizeof(struct rte_sched_queue_stats));\n-\tmemset(&qe->stats, 0, sizeof(struct rte_sched_queue_stats));\n+\tif (stats)\n+\t\t*stats = qe->stats;\n+\tif (clear)\n+\t\tmemset(&qe->stats, 0, sizeof(struct rte_sched_queue_stats));\n \n \t/* Queue length */\n-\t*qlen = q->qw - q->qr;\n+\tif (qlen)\n+\t\t*qlen = q->qw - q->qr;\n \n \treturn 0;\n }\n \n+/* Deprecated API, always clears */\n+int\n+rte_sched_queue_read_stats(struct rte_sched_port *port,\n+\tuint32_t queue_id,\n+\tstruct rte_sched_queue_stats *stats,\n+\tuint16_t *qlen)\n+{\n+\treturn rte_sched_queue_stats(port, queue_id, stats, qlen, 1);\n+}\n+\n static inline uint32_t\n rte_sched_port_qindex(struct rte_sched_port *port, uint32_t subport, uint32_t pipe, uint32_t traffic_class, uint32_t queue)\n {\ndiff --git a/lib/librte_sched/rte_sched.h b/lib/librte_sched/rte_sched.h\nindex f7c0b8e..053454c 100644\n--- a/lib/librte_sched/rte_sched.h\n+++ b/lib/librte_sched/rte_sched.h\n@@ -300,14 +300,24 @@ rte_sched_port_get_memory_footprint(struct rte_sched_port_params *params);\n * @param tc_ov\n * Pointer to pre-allocated 4-entry array where the oversubscription status for\n * each of the 4 subport traffic classes should be stored.\n+ * @parm clear\n+ * Reset statistics after read\n+ *\n * @return\n * 0 upon success, error code otherwise\n */\n int\n-rte_sched_subport_read_stats(struct rte_sched_port *port,\n-\tuint32_t subport_id,\n-\tstruct rte_sched_subport_stats *stats,\n-\tuint32_t *tc_ov);\n+rte_sched_subport_stats(struct rte_sched_port *port, uint32_t subport_id,\n+\t\t\tstruct rte_sched_subport_stats *stats,\n+\t\t\tuint32_t *tc_ov, int clear);\n+\n+/* Note: use rte_sched_subport_stats() instead,\n+ * which allows separate read and clear.\n+ */\n+int\n+rte_sched_subport_read_stats(struct rte_sched_port *port, uint32_t subport_id,\n+\t\t\t struct rte_sched_subport_stats *stats,\n+\t\t\t uint32_t *tc_ov) __attribute__((deprecated));\n \n /**\n * Hierarchical scheduler queue statistics read\n@@ -321,14 +331,25 @@ rte_sched_subport_read_stats(struct rte_sched_port *port,\n * counters should be stored\n * @param qlen\n * Pointer to pre-allocated variable where the current queue length should be stored.\n+ * @parm clear\n+ * Reset statistics after read\n * @return\n * 0 upon success, error code otherwise\n */\n int\n-rte_sched_queue_read_stats(struct rte_sched_port *port,\n-\tuint32_t queue_id,\n-\tstruct rte_sched_queue_stats *stats,\n-\tuint16_t *qlen);\n+rte_sched_queue_stats(struct rte_sched_port *port,\n+\t\t uint32_t queue_id,\n+\t\t struct rte_sched_queue_stats *stats,\n+\t\t uint16_t *qlen, int clear);\n+\n+\n+/* Note: use rte_sched_queue_stats() instead\n+ * which allows separate read and clear.\n+ */\n+int\n+rte_sched_queue_read_stats(struct rte_sched_port *port, uint32_t queue_id,\n+\t\t\t struct rte_sched_queue_stats *stats,\n+\t\t\t uint16_t *qlen) __attribute__((deprecated));\n \n /**\n * Scheduler hierarchy path write to packet descriptor. Typically called by the\ndiff --git a/lib/librte_sched/rte_sched_version.map b/lib/librte_sched/rte_sched_version.map\nindex 6626a74..cdbaeb7 100644\n--- a/lib/librte_sched/rte_sched_version.map\n+++ b/lib/librte_sched/rte_sched_version.map\n@@ -14,8 +14,10 @@ DPDK_2.0 {\n \trte_sched_port_enqueue;\n \trte_sched_port_free;\n \trte_sched_port_get_memory_footprint;\n+\trte_sched_queue_stats;\n \trte_sched_queue_read_stats;\n \trte_sched_subport_config;\n+\trte_sched_subport_stats;\n \trte_sched_subport_read_stats;\n \trte_sched_port_pkt_write;\n \trte_sched_port_pkt_read_tree_path;\n", "prefixes": [ "dpdk-dev", "5/5" ] }{ "id": 4924, "url": "