get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 139549,
    "url": "https://patches.dpdk.org/api/patches/139549/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20240419172926.55447-4-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": "<20240419172926.55447-4-stephen@networkplumber.org>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240419172926.55447-4-stephen@networkplumber.org",
    "date": "2024-04-19T17:28:23",
    "name": "[v4,3/6] latencystats: do not use floating point",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "0dcfbb12f27dea83ced316c22f8f3689456dff6e",
    "submitter": {
        "id": 27,
        "url": "https://patches.dpdk.org/api/people/27/?format=api",
        "name": "Stephen Hemminger",
        "email": "stephen@networkplumber.org"
    },
    "delegate": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20240419172926.55447-4-stephen@networkplumber.org/mbox/",
    "series": [
        {
            "id": 31794,
            "url": "https://patches.dpdk.org/api/series/31794/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=31794",
            "date": "2024-04-19T17:28:20",
            "name": "latencystats: cleanup",
            "version": 4,
            "mbox": "https://patches.dpdk.org/series/31794/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/139549/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/139549/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 5276343EB2;\n\tFri, 19 Apr 2024 19:29:58 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id DFF8940A4B;\n\tFri, 19 Apr 2024 19:29:43 +0200 (CEST)",
            "from mail-pf1-f181.google.com (mail-pf1-f181.google.com\n [209.85.210.181])\n by mails.dpdk.org (Postfix) with ESMTP id 509B04069F\n for <dev@dpdk.org>; Fri, 19 Apr 2024 19:29:40 +0200 (CEST)",
            "by mail-pf1-f181.google.com with SMTP id\n d2e1a72fcca58-6ecff9df447so2180758b3a.1\n for <dev@dpdk.org>; Fri, 19 Apr 2024 10:29:40 -0700 (PDT)",
            "from hermes.local (204-195-96-226.wavecable.com. [204.195.96.226])\n by smtp.gmail.com with ESMTPSA id\n h16-20020a632110000000b005f3c5cf33b5sm3383074pgh.37.2024.04.19.10.29.38\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Fri, 19 Apr 2024 10:29:38 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=networkplumber-org.20230601.gappssmtp.com; s=20230601; t=1713547779;\n x=1714152579; darn=dpdk.org;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=Kg2PCbwdtTsUQ6vMQSsIrhsnoQGMw7xVpkX+ByYWDrw=;\n b=gioeYdirxpikaShqd9mabqA16Ke2yHVq6jEsTDWC3j+6m+ibHdA08zMXUJI8klwMk4\n zPZO+93lAK0mXyHRgomJdzyUo4jWyzwQTnPS8vo1yhQG/wDCakcepYnx8Z89EnOlDHp+\n e2+oCFWbuXW2NMRA8Alodsz/7G8WjAw8D96NuhIWvm8wMG5LERkXEyLE47eXiewNy9tr\n EHYmHcehaagpCPPA2UicSjZxAtc3gvT61tTaHzzjm0JzfuLxeZqyiOUTpI9jtIqmyrI7\n Cn9ZOYaPwyG6c6XAgxLXaOsFrkYbKZDeF/xrCnaFqfVx78FUFIjCItbCqe/8vwtsA/hJ\n VaJw==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1713547779; x=1714152579;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc\n :subject:date:message-id:reply-to;\n bh=Kg2PCbwdtTsUQ6vMQSsIrhsnoQGMw7xVpkX+ByYWDrw=;\n b=CaBs3NqmHjmcHMS3yVAtEDsWX8VVP0nSdeWLtzUfDaStcwSJtjPxRyQRg2RkC4p4AL\n MwUXTr2M+6y3k6ARyjQPsesmEbG6fiMjx9R1ER2j8LCdDK9g2KzENR27weGssjqGmRy4\n InvzMtQ4QPhIxO4La91TaofEc6A6Gu0kflssgkISBoFfb/xm7acPv1BAKsY/jn6BbNdy\n f2SlN6gB2uyDsF0DwgbEPsUzYhze4i5S4B4akShKIuZ4tRcKKDMdUm5tK4wNTwyc12oE\n 5BLTwZGoc4X5rEueKdqERaCsTjvevf6n7uj1YCMx+crHKbSbXTcgFZrxGX7mEpHRzivO\n +M1Q==",
        "X-Gm-Message-State": "AOJu0YzAn3SXY5F2Alj6J39SMbcV6yspDQZj0ksepKX8FafWA5+BLuU0\n UeXvOiUplDoka0am1TrzMjD2Xg3A2S90EAD0Y56LVmiMp4aXDpMuyrqXsQklLniUr9itMoQqsrI\n p",
        "X-Google-Smtp-Source": "\n AGHT+IHyf3vv+6yljEk7tl7msex6FdqSWnhGbtBjFk6GAHQCVUatqlNuZ4SdPWKXMnD4yhOr012Dvg==",
        "X-Received": "by 2002:a05:6a21:1a9:b0:1a7:91b0:4f14 with SMTP id\n le41-20020a056a2101a900b001a791b04f14mr3488847pzb.23.1713547779242;\n Fri, 19 Apr 2024 10:29:39 -0700 (PDT)",
        "From": "Stephen Hemminger <stephen@networkplumber.org>",
        "To": "dev@dpdk.org",
        "Cc": "Stephen Hemminger <stephen@networkplumber.org>,\n Tyler Retzlaff <roretzla@linux.microsoft.com>,\n Reshma Pattan <reshma.pattan@intel.com>",
        "Subject": "[PATCH v4 3/6] latencystats: do not use floating point",
        "Date": "Fri, 19 Apr 2024 10:28:23 -0700",
        "Message-ID": "<20240419172926.55447-4-stephen@networkplumber.org>",
        "X-Mailer": "git-send-email 2.43.0",
        "In-Reply-To": "<20240419172926.55447-1-stephen@networkplumber.org>",
        "References": "<20240408195036.182545-1-stephen@networkplumber.org>\n <20240419172926.55447-1-stephen@networkplumber.org>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "The cycle counts do not need to be stored as floating point.\nInstead keep track of latency in cycles, and convert to\nnanoseconds when read.\n\nChange Exponential Weighted Moving Average weight from .2 to .25\nto avoid use of floating point for that.\n\nThe average latency took too long to \"warm up\".\nDo what RFC 6298 suggests and initialize on first sample.\n\nSigned-off-by: Stephen Hemminger <stephen@networkplumber.org>\nAcked-by: Tyler Retzlaff <roretzla@linux.microsoft.com>\n---\n lib/latencystats/rte_latencystats.c | 88 +++++++++++++++--------------\n 1 file changed, 45 insertions(+), 43 deletions(-)",
    "diff": "diff --git a/lib/latencystats/rte_latencystats.c b/lib/latencystats/rte_latencystats.c\nindex 55a099c818..6ef8e344bf 100644\n--- a/lib/latencystats/rte_latencystats.c\n+++ b/lib/latencystats/rte_latencystats.c\n@@ -4,6 +4,7 @@\n \n #include <math.h>\n \n+#include <rte_common.h>\n #include <rte_string_fns.h>\n #include <rte_mbuf_dyn.h>\n #include <rte_log.h>\n@@ -42,10 +43,10 @@ static uint64_t timer_tsc;\n static uint64_t prev_tsc;\n \n struct rte_latency_stats {\n-\tfloat min_latency; /**< Minimum latency in nano seconds */\n-\tfloat avg_latency; /**< Average latency in nano seconds */\n-\tfloat max_latency; /**< Maximum latency in nano seconds */\n-\tfloat jitter; /** Latency variation */\n+\tuint64_t min_latency; /**< Minimum latency */\n+\tuint64_t avg_latency; /**< Average latency */\n+\tuint64_t max_latency; /**< Maximum latency */\n+\tuint64_t jitter; /** Latency variation */\n \trte_spinlock_t lock; /** Latency calculation lock */\n };\n \n@@ -77,13 +78,12 @@ int32_t\n rte_latencystats_update(void)\n {\n \tunsigned int i;\n-\tfloat *stats_ptr = NULL;\n \tuint64_t values[NUM_LATENCY_STATS] = {0};\n \tint ret;\n \n \tfor (i = 0; i < NUM_LATENCY_STATS; i++) {\n-\t\tstats_ptr = RTE_PTR_ADD(glob_stats,\n-\t\t\t\tlat_stats_strings[i].offset);\n+\t\tconst uint64_t *stats_ptr\n+\t\t\t= RTE_PTR_ADD(glob_stats, lat_stats_strings[i].offset);\n \t\tvalues[i] = floor(*stats_ptr / cycles_per_ns);\n \t}\n \n@@ -100,11 +100,10 @@ static void\n rte_latencystats_fill_values(struct rte_metric_value *values)\n {\n \tunsigned int i;\n-\tfloat *stats_ptr = NULL;\n \n \tfor (i = 0; i < NUM_LATENCY_STATS; i++) {\n-\t\tstats_ptr = RTE_PTR_ADD(glob_stats,\n-\t\t\t\tlat_stats_strings[i].offset);\n+\t\tconst uint64_t *stats_ptr\n+\t\t\t= RTE_PTR_ADD(glob_stats, lat_stats_strings[i].offset);\n \t\tvalues[i].key = i;\n \t\tvalues[i].value = floor(*stats_ptr / cycles_per_ns);\n \t}\n@@ -151,15 +150,9 @@ calc_latency(uint16_t pid __rte_unused,\n \t\tvoid *_ __rte_unused)\n {\n \tunsigned int i;\n-\tuint64_t now;\n-\tfloat latency;\n-\tstatic float prev_latency;\n-\t/*\n-\t * Alpha represents degree of weighting decrease in EWMA,\n-\t * a constant smoothing factor between 0 and 1. The value\n-\t * is used below for measuring average latency.\n-\t */\n-\tconst float alpha = 0.2;\n+\tuint64_t now, latency;\n+\tstatic uint64_t prev_latency;\n+\tstatic bool first_sample = true;\n \n \tnow = rte_rdtsc();\n \n@@ -170,32 +163,41 @@ calc_latency(uint16_t pid __rte_unused,\n \n \t\tlatency = now - *timestamp_dynfield(pkts[i]);\n \n-\t\t/*\n-\t\t * The jitter is calculated as statistical mean of interpacket\n-\t\t * delay variation. The \"jitter estimate\" is computed by taking\n-\t\t * the absolute values of the ipdv sequence and applying an\n-\t\t * exponential filter with parameter 1/16 to generate the\n-\t\t * estimate. i.e J=J+(|D(i-1,i)|-J)/16. Where J is jitter,\n-\t\t * D(i-1,i) is difference in latency of two consecutive packets\n-\t\t * i-1 and i.\n-\t\t * Reference: Calculated as per RFC 5481, sec 4.1,\n-\t\t * RFC 3393 sec 4.5, RFC 1889 sec.\n-\t\t */\n-\t\tglob_stats->jitter +=  (fabsf(prev_latency - latency)\n-\t\t\t\t\t- glob_stats->jitter)/16;\n-\t\tif (glob_stats->min_latency == 0)\n-\t\t\tglob_stats->min_latency = latency;\n-\t\telse if (latency < glob_stats->min_latency)\n+\t\tif (unlikely(first_sample)) {\n+\t\t\tfirst_sample = false;\n+\n \t\t\tglob_stats->min_latency = latency;\n-\t\telse if (latency > glob_stats->max_latency)\n \t\t\tglob_stats->max_latency = latency;\n-\t\t/*\n-\t\t * The average latency is measured using exponential moving\n-\t\t * average, i.e. using EWMA\n-\t\t * https://en.wikipedia.org/wiki/Moving_average\n-\t\t */\n-\t\tglob_stats->avg_latency +=\n-\t\t\talpha * (latency - glob_stats->avg_latency);\n+\t\t\tglob_stats->avg_latency = latency;\n+\t\t\tglob_stats->jitter = latency / 2;\n+\t\t} else {\n+\t\t\t/*\n+\t\t\t * The jitter is calculated as statistical mean of interpacket\n+\t\t\t * delay variation. The \"jitter estimate\" is computed by taking\n+\t\t\t * the absolute values of the ipdv sequence and applying an\n+\t\t\t * exponential filter with parameter 1/16 to generate the\n+\t\t\t * estimate. i.e J=J+(|D(i-1,i)|-J)/16. Where J is jitter,\n+\t\t\t * D(i-1,i) is difference in latency of two consecutive packets\n+\t\t\t * i-1 and i.\n+\t\t\t * Reference: Calculated as per RFC 5481, sec 4.1,\n+\t\t\t * RFC 3393 sec 4.5, RFC 1889 sec.\n+\t\t\t */\n+\t\t\tglob_stats->jitter += ((prev_latency - latency)\n+\t\t\t\t\t       - glob_stats->jitter) / 16;\n+\t\t\tif (latency < glob_stats->min_latency)\n+\t\t\t\tglob_stats->min_latency = latency;\n+\t\t\tif (latency > glob_stats->max_latency)\n+\t\t\t\tglob_stats->max_latency = latency;\n+\t\t\t/*\n+\t\t\t * The average latency is measured using exponential moving\n+\t\t\t * average, i.e. using EWMA\n+\t\t\t * https://en.wikipedia.org/wiki/Moving_average\n+\t\t\t *\n+\t\t\t * Alpha is .25\n+\t\t\t */\n+\t\t\tglob_stats->avg_latency += (latency - glob_stats->avg_latency) / 4;\n+\t\t}\n+\n \t\tprev_latency = latency;\n \t}\n \trte_spinlock_unlock(&glob_stats->lock);\n",
    "prefixes": [
        "v4",
        "3/6"
    ]
}