get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 81900,
    "url": "https://patches.dpdk.org/api/patches/81900/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20201023080058.13335-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": "<20201023080058.13335-2-david.marchand@redhat.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20201023080058.13335-2-david.marchand@redhat.com",
    "date": "2020-10-23T08:00:56",
    "name": "[1/3] trace: fixup CTF event description at registration",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "2c8ae7f3cca5cfa8cc69b0f9b3ebbda29c496b52",
    "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/20201023080058.13335-2-david.marchand@redhat.com/mbox/",
    "series": [
        {
            "id": 13254,
            "url": "https://patches.dpdk.org/api/series/13254/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=13254",
            "date": "2020-10-23T08:00:55",
            "name": "Rework CTF event description storage",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/13254/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/81900/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/81900/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 C2075A04DE;\n\tFri, 23 Oct 2020 10:01:37 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id C47649AFD;\n\tFri, 23 Oct 2020 10:01:19 +0200 (CEST)",
            "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 0FBE29AFB\n for <dev@dpdk.org>; Fri, 23 Oct 2020 10:01:17 +0200 (CEST)",
            "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-206-pQfrIvrvOxiqknyKgu1h7g-1; Fri, 23 Oct 2020 04:01:14 -0400",
            "from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com\n [10.5.11.23])\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 5B62B64091;\n Fri, 23 Oct 2020 08:01:13 +0000 (UTC)",
            "from dmarchan.remote.csb (unknown [10.40.193.33])\n by smtp.corp.redhat.com (Postfix) with ESMTP id 4E2B32635A;\n Fri, 23 Oct 2020 08:01:12 +0000 (UTC)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1603440076;\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=d2u7VocScHd1iMP/TfoCzzKAPIhiD8EB7mlSAIkGThY=;\n b=aU2/F03SAM2vMPcSwQpfk+MukVm+Mws13c9PhPtPQwXQLjAMpfnw3Ihmx1XXJyYcPiuvXP\n d4+KsN75tvmwhqW9LkApLJCVQhmvYtyIyV+RdbAEDhNrCQSa5kaCnKLgWE6RikFjJKddRG\n HhLsE1gb4EpQjuE5bOuE6/5CpfXrEnI=",
        "X-MC-Unique": "pQfrIvrvOxiqknyKgu1h7g-1",
        "From": "David Marchand <david.marchand@redhat.com>",
        "To": "dev@dpdk.org",
        "Cc": "jerinj@marvell.com,\n\tskori@marvell.com",
        "Date": "Fri, 23 Oct 2020 10:00:56 +0200",
        "Message-Id": "<20201023080058.13335-2-david.marchand@redhat.com>",
        "In-Reply-To": "<20201023080058.13335-1-david.marchand@redhat.com>",
        "References": "<20201023080058.13335-1-david.marchand@redhat.com>",
        "MIME-Version": "1.0",
        "X-Scanned-By": "MIMEDefang 2.84 on 10.5.11.23",
        "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 1/3] 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..bc86432902 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+\tstatic const char * const 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": [
        "1/3"
    ]
}