get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 82680,
    "url": "https://patches.dpdk.org/api/patches/82680/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20201028210249.9021-2-david.marchand@redhat.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": "<20201028210249.9021-2-david.marchand@redhat.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20201028210249.9021-2-david.marchand@redhat.com",
    "date": "2020-10-28T21:02:46",
    "name": "[v2,1/4] trace: fixup CTF event description at registration",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "793ef5ecf89cf18fa05128de161a0a2b3c8d4873",
    "submitter": {
        "id": 1173,
        "url": "https://patches.dpdk.org/api/people/1173/?format=api",
        "name": "David Marchand",
        "email": "david.marchand@redhat.com"
    },
    "delegate": {
        "id": 24651,
        "url": "https://patches.dpdk.org/api/users/24651/?format=api",
        "username": "dmarchand",
        "first_name": "David",
        "last_name": "Marchand",
        "email": "david.marchand@redhat.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20201028210249.9021-2-david.marchand@redhat.com/mbox/",
    "series": [
        {
            "id": 13435,
            "url": "https://patches.dpdk.org/api/series/13435/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=13435",
            "date": "2020-10-28T21:02:45",
            "name": "Rework CTF event description storage",
            "version": 2,
            "mbox": "https://patches.dpdk.org/series/13435/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/82680/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/82680/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 dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 13BB1A04B5;\n\tWed, 28 Oct 2020 22:03:25 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 44F635A62;\n\tWed, 28 Oct 2020 22:03:11 +0100 (CET)",
            "from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [63.128.21.124])\n by dpdk.org (Postfix) with ESMTP id BBDC45947\n for <dev@dpdk.org>; Wed, 28 Oct 2020 22:03:06 +0100 (CET)",
            "from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com\n [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id\n us-mta-588-r4DfvC5xPkOLPuK80MOPyw-1; Wed, 28 Oct 2020 17:03:01 -0400",
            "from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com\n [10.5.11.15])\n (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n (No client certificate requested)\n by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 4B4F5876E3C;\n Wed, 28 Oct 2020 21:03:00 +0000 (UTC)",
            "from dmarchan.remote.csb (unknown [10.40.192.40])\n by smtp.corp.redhat.com (Postfix) with ESMTP id 0FDD355766;\n Wed, 28 Oct 2020 21:02:58 +0000 (UTC)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1603918985;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=u3xwK1gPvqlINEPzQCq4tPiTBMPQqBsmWioN+eJKiYo=;\n b=M0XNZ6fQgrVbM/bQFIQmRtyICOfRkU9+oks2oC+rl0s7hl3WyfC4VkuUm+0MkakZRIOl/2\n HYYKmnS6KVR0lQfeaXxpG8oKpGQLI1Jf/hTTajtMfKwMnUQ+uR9EdjlD1qegyOFXddRzPc\n R5NAGzIPmR3k5KKb6abUR7N9L+r+hb0=",
        "X-MC-Unique": "r4DfvC5xPkOLPuK80MOPyw-1",
        "From": "David Marchand <david.marchand@redhat.com>",
        "To": "dev@dpdk.org",
        "Cc": "jerinj@marvell.com,\n\tskori@marvell.com",
        "Date": "Wed, 28 Oct 2020 22:02:46 +0100",
        "Message-Id": "<20201028210249.9021-2-david.marchand@redhat.com>",
        "In-Reply-To": "<20201028210249.9021-1-david.marchand@redhat.com>",
        "References": "<20201023080058.13335-1-david.marchand@redhat.com>\n <20201028210249.9021-1-david.marchand@redhat.com>",
        "MIME-Version": "1.0",
        "X-Scanned-By": "MIMEDefang 2.79 on 10.5.11.15",
        "Authentication-Results": "relay.mimecast.com;\n auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david.marchand@redhat.com",
        "X-Mimecast-Spam-Score": "0",
        "X-Mimecast-Originator": "redhat.com",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain; charset=\"US-ASCII\"",
        "Subject": "[dpdk-dev] [PATCH v2 1/4] trace: fixup CTF event description at\n\tregistration",
        "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://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",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "CTF event description is currently built by appending all fields in a\nsingle string at trace point registration.\nWhen dumping the metadata, this string is split again and inspected to\nfixup reserved keywords and special tokens like \".\" or \"->\".\n\nMove this fixup per field at trace point registration time so that there\nis no need for inspecting / string parsing when dumping metadata.\nUse dynamic allocations to remove an artificial size limit on the CTF\nevent description manipulations.\n\nSigned-off-by: David Marchand <david.marchand@redhat.com>\n---\n lib/librte_eal/common/eal_common_trace.c     |   5 +\n lib/librte_eal/common/eal_common_trace_ctf.c | 159 +++++--------------\n lib/librte_eal/common/eal_trace.h            |   1 +\n 3 files changed, 46 insertions(+), 119 deletions(-)",
    "diff": "diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c\nindex b6da5537fe..80b458edb6 100644\n--- a/lib/librte_eal/common/eal_common_trace.c\n+++ b/lib/librte_eal/common/eal_common_trace.c\n@@ -432,11 +432,16 @@ __rte_trace_point_emit_field(size_t sz, const char *in, const char *datatype)\n \tchar *field = RTE_PER_LCORE(ctf_field);\n \tint count = RTE_PER_LCORE(ctf_count);\n \tsize_t size;\n+\tchar *fixup;\n \tint rc;\n \n \tsize = RTE_MAX(0, TRACE_CTF_FIELD_SIZE - 1 - count);\n \tRTE_PER_LCORE(trace_point_sz) += sz;\n+\tfixup = trace_metadata_fixup_field(in);\n+\tif (fixup != NULL)\n+\t\tin = fixup;\n \trc = snprintf(RTE_PTR_ADD(field, count), size, \"%s %s;\", datatype, in);\n+\tfree(fixup);\n \tif (rc <= 0 || (size_t)rc >= size) {\n \t\tRTE_PER_LCORE(trace_point_sz) = 0;\n \t\ttrace_crit(\"CTF field is too long\");\ndiff --git a/lib/librte_eal/common/eal_common_trace_ctf.c b/lib/librte_eal/common/eal_common_trace_ctf.c\nindex 9dc91df0fb..174cdac1b0 100644\n--- a/lib/librte_eal/common/eal_common_trace_ctf.c\n+++ b/lib/librte_eal/common/eal_common_trace_ctf.c\n@@ -220,131 +220,12 @@ meta_stream_emit(char **meta, int *offset)\n \treturn meta_copy(meta, offset, str, rc);\n }\n \n-static void\n-string_fixed_replace(char *input, const char *search, const char *replace)\n-{\n-\tchar *found;\n-\tsize_t len;\n-\n-\tfound = strstr(input, search);\n-\tif (found == NULL)\n-\t\treturn;\n-\n-\tif (strlen(found) != strlen(search))\n-\t\treturn;\n-\n-\tlen = strlen(replace);\n-\tmemcpy(found, replace, len);\n-\tfound[len] = '\\0';\n-}\n-\n-static void\n-ctf_fixup_align(char *str)\n-{\n-\tstring_fixed_replace(str, \"align\", \"_align\");\n-}\n-\n-static void\n-ctf_fixup_arrow_deref(char *str)\n-{\n-\tconst char *replace = \"_\";\n-\tconst char *search = \"->\";\n-\tchar *found;\n-\tsize_t len;\n-\n-\tfound = strstr(str, search);\n-\tif (found == NULL)\n-\t\treturn;\n-\n-\tdo {\n-\t\tmemcpy(found, replace, strlen(replace));\n-\t\tlen = strlen(found + 2);\n-\t\tmemcpy(found + 1, found + 2, len);\n-\t\tfound[len + 1] = '\\0';\n-\t\tfound = strstr(str, search);\n-\t} while (found != NULL);\n-}\n-\n-static void\n-ctf_fixup_dot_deref(char *str)\n-{\n-\tconst char *replace = \"_\";\n-\tconst char *search = \".\";\n-\tchar *found;\n-\tsize_t len;\n-\n-\tfound = strstr(str, search);\n-\tif (found == NULL)\n-\t\treturn;\n-\n-\tlen = strlen(replace);\n-\tdo {\n-\t\tmemcpy(found, replace, len);\n-\t\tfound = strstr(str, search);\n-\t} while (found != NULL);\n-}\n-\n-static void\n-ctf_fixup_event(char *str)\n-{\n-\tstring_fixed_replace(str, \"event\", \"_event\");\n-}\n-\n-static int\n-ctf_fixup_keyword(char *str)\n-{\n-\tchar dup_str[TRACE_CTF_FIELD_SIZE];\n-\tchar input[TRACE_CTF_FIELD_SIZE];\n-\tconst char *delim = \";\";\n-\tchar *from;\n-\tint len;\n-\n-\tif (str == NULL)\n-\t\treturn 0;\n-\n-\tlen = strlen(str);\n-\tif (len >= TRACE_CTF_FIELD_SIZE) {\n-\t\ttrace_err(\"ctf_field reached its maximum limit\");\n-\t\treturn -EMSGSIZE;\n-\t}\n-\n-\t/* Create duplicate string */\n-\tstrcpy(dup_str, str);\n-\n-\tlen = 0;\n-\tfrom = strtok(dup_str, delim);\n-\twhile (from != NULL) {\n-\t\tstrcpy(input, from);\n-\t\tctf_fixup_align(input);\n-\t\tctf_fixup_dot_deref(input);\n-\t\tctf_fixup_arrow_deref(input);\n-\t\tctf_fixup_event(input);\n-\n-\t\tstrcpy(&input[strlen(input)], delim);\n-\t\tif ((len + strlen(input)) >= TRACE_CTF_FIELD_SIZE) {\n-\t\t\ttrace_err(\"ctf_field reached its maximum limit\");\n-\t\t\treturn -EMSGSIZE;\n-\t\t}\n-\n-\t\tstrcpy(str + len, input);\n-\t\tlen += strlen(input);\n-\t\tfrom = strtok(NULL, delim);\n-\t}\n-\n-\treturn 0;\n-}\n-\n static int\n meta_event_emit(char **meta, int *offset, struct trace_point *tp)\n {\n \tchar *str = NULL;\n \tint rc;\n \n-\t/* Fixup ctf field string in case it using reserved ctf keywords */\n-\trc = ctf_fixup_keyword(tp->ctf_field);\n-\tif (rc)\n-\t\treturn rc;\n-\n \trc = metadata_printf(&str,\n \t\t\"event {\\n\"\n \t\t\"    id = %d;\\n\"\n@@ -491,3 +372,43 @@ rte_trace_metadata_dump(FILE *f)\n \trc = fprintf(f, \"%s\", ctf_meta);\n \treturn rc < 0 ? rc : 0;\n }\n+\n+char *trace_metadata_fixup_field(const char *field)\n+{\n+\tconst char *ctf_reserved_words[] = {\n+\t\t\"align\",\n+\t\t\"event\",\n+\t};\n+\tunsigned int i;\n+\tchar *out;\n+\tchar *p;\n+\n+\t/* reserved keywords */\n+\tfor (i = 0; i < RTE_DIM(ctf_reserved_words); i++) {\n+\t\tif (strcmp(field, ctf_reserved_words[i]) != 0)\n+\t\t\tcontinue;\n+\t\tif (asprintf(&out, \"_%s\", ctf_reserved_words[i]) == -1)\n+\t\t\tout = NULL;\n+\t\treturn out;\n+\t}\n+\n+\t/* nothing to replace, return early */\n+\tif (strstr(field, \".\") == NULL && strstr(field, \"->\") == NULL)\n+\t\treturn NULL;\n+\n+\tout = strdup(field);\n+\tif (out == NULL)\n+\t\treturn NULL;\n+\tp = out;\n+\twhile ((p = strstr(p, \".\")) != NULL) {\n+\t\tp[0] = '_';\n+\t\tp++;\n+\t}\n+\tp = out;\n+\twhile ((p = strstr(p, \"->\")) != NULL) {\n+\t\tp[0] = '_';\n+\t\tp++;\n+\t\tmemmove(p, p + 1, strlen(p));\n+\t}\n+\treturn out;\n+}\ndiff --git a/lib/librte_eal/common/eal_trace.h b/lib/librte_eal/common/eal_trace.h\nindex 438c2b73f6..8a3f6c5359 100644\n--- a/lib/librte_eal/common/eal_trace.h\n+++ b/lib/librte_eal/common/eal_trace.h\n@@ -104,6 +104,7 @@ bool trace_has_duplicate_entry(void);\n void trace_uuid_generate(void);\n int trace_metadata_create(void);\n void trace_metadata_destroy(void);\n+char *trace_metadata_fixup_field(const char *field);\n int trace_mkdir(void);\n int trace_epoch_time_save(void);\n void trace_mem_free(void);\n",
    "prefixes": [
        "v2",
        "1/4"
    ]
}