get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 4924,
    "url": "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"
    ]
}