Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/44464/?format=api
http://patches.dpdk.org/api/patches/44464/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/patch/20180910054547.18494-3-david.marchand@6wind.com/", "project": { "id": 1, "url": "http://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": "<20180910054547.18494-3-david.marchand@6wind.com>", "list_archive_url": "https://inbox.dpdk.org/dev/20180910054547.18494-3-david.marchand@6wind.com", "date": "2018-09-10T05:45:46", "name": "[2/3] mbuf: add a non fatal sanity check helper", "commit_ref": null, "pull_url": null, "state": "changes-requested", "archived": true, "hash": "8b89cece97604499243ca5499eae69abc8129396", "submitter": { "id": 3, "url": "http://patches.dpdk.org/api/people/3/?format=api", "name": "David Marchand", "email": "david.marchand@6wind.com" }, "delegate": { "id": 1, "url": "http://patches.dpdk.org/api/users/1/?format=api", "username": "tmonjalo", "first_name": "Thomas", "last_name": "Monjalon", "email": "thomas@monjalon.net" }, "mbox": "http://patches.dpdk.org/project/dpdk/patch/20180910054547.18494-3-david.marchand@6wind.com/mbox/", "series": [ { "id": 1241, "url": "http://patches.dpdk.org/api/series/1241/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=1241", "date": "2018-09-10T05:45:44", "name": "segment sanity checks", "version": 1, "mbox": "http://patches.dpdk.org/series/1241/mbox/" } ], "comments": "http://patches.dpdk.org/api/patches/44464/comments/", "check": "success", "checks": "http://patches.dpdk.org/api/patches/44464/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 [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 9BD5D4CA0;\n\tMon, 10 Sep 2018 07:45:58 +0200 (CEST)", "from mail-wr1-f67.google.com (mail-wr1-f67.google.com\n\t[209.85.221.67]) by dpdk.org (Postfix) with ESMTP id 0C0724C9D\n\tfor <dev@dpdk.org>; Mon, 10 Sep 2018 07:45:58 +0200 (CEST)", "by mail-wr1-f67.google.com with SMTP id v16-v6so20432752wro.11\n\tfor <dev@dpdk.org>; Sun, 09 Sep 2018 22:45:58 -0700 (PDT)", "from 6wind.com ([109.190.253.16]) by smtp.gmail.com with ESMTPSA id\n\tt4-v6sm14667473wrb.45.2018.09.09.22.45.55\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tSun, 09 Sep 2018 22:45:56 -0700 (PDT)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=6wind-com.20150623.gappssmtp.com; s=20150623;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=kVBRpwdIa3RbjcBqDAGG0KZBtffIViGt9wurQdHS/Ck=;\n\tb=1kotq6s0eKHm5haJ/zJMp5UHvicoDvMUdpKRkJvaUDaWCr9ibYiRUC2jZMbKkoRBNi\n\tnDwoeJxsmO8UgJfC7e7a7h6+s3COb0dhrYhm7L+W6kUoLS+bhC9qiquXOVUdB1FgqKU/\n\tHSf/M3S4ydnbqQQo/lbNICWfRjWdAzFQVvavZWm+gukCRnWG4cm5Bk8xawI2QRLyRxJd\n\tfrkiglNIcBN+QkHEeT4fR2JpZeGw9uAFpa2ncHbUIxtcDvtP40vyiOSpa9lpJSEHQ9Pw\n\tzLHXcTy299YQr2FQT5Q6MqwJqn0/yPQDnSAoGZeBndImZ+AN75+LDLmQRBNUQA8qeDR0\n\tFURA==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=kVBRpwdIa3RbjcBqDAGG0KZBtffIViGt9wurQdHS/Ck=;\n\tb=txHhxRUYp1Z0OSQqOdRzmepS8vwJwQiWMqmn1ugAP9vbC66ot+9QYiJooefum1vLOk\n\tbltUiEDm7EfoNFY0f9w8EMmZar4NOHhgqqJX49diTk6MlGpk7A4swcWwRneV+NLtGLEx\n\t24kWmQVOM0p0JfvgRVMaqvp19gB7n/LVlPrD9jfna4pn1UKDcCni84nUXmMHzPRyTPJD\n\tURQTk8Hp8H0L5KjnYW9t7Kjcmqr/h85TenWkySaUXSmqecHZvYYfE5mIlPUB0EcSXI75\n\tGjPzqMkWrYMj164DZmpTQHGH+pYgAId9u/UavFay2skRibVO9KmzbnU931OxBunHJbL8\n\tp6Ug==", "X-Gm-Message-State": "APzg51CVxg+NoMEYIlg7SUDfWjdnwdioG0QzTCwka2g0I5vw5goWmsiI\n\tm7v8X4pjx744R3COK8h7kgZNLThJVaU=", "X-Google-Smtp-Source": "ANB0VdbUIvjrKQ3k6Q577rDXuVzTOzm9Iu2BjZhkjMCjq44RscktS4udie976hcQo2rxkq414rvvFg==", "X-Received": "by 2002:adf:ad8e:: with SMTP id\n\tw14-v6mr14633893wrc.178.1536558357475; \n\tSun, 09 Sep 2018 22:45:57 -0700 (PDT)", "From": "David Marchand <david.marchand@6wind.com>", "To": "dev@dpdk.org", "Cc": "olivier.matz@6wind.com, wenzhuo.lu@intel.com, jingjing.wu@intel.com,\n\tbernard.iremonger@intel.com", "Date": "Mon, 10 Sep 2018 07:45:46 +0200", "Message-Id": "<20180910054547.18494-3-david.marchand@6wind.com>", "X-Mailer": "git-send-email 2.17.1", "In-Reply-To": "<20180910054547.18494-1-david.marchand@6wind.com>", "References": "<20180910054547.18494-1-david.marchand@6wind.com>", "Subject": "[dpdk-dev] [PATCH 2/3] mbuf: add a non fatal sanity check helper", "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\t<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\t<mailto:dev-request@dpdk.org?subject=subscribe>", "Errors-To": "dev-bounces@dpdk.org", "Sender": "\"dev\" <dev-bounces@dpdk.org>" }, "content": "Let's add a little helper that does the same as rte_mbuf_sanity_check but\nwithout the panic.\n\nSigned-off-by: David Marchand <david.marchand@6wind.com>\n---\n lib/librte_mbuf/Makefile | 2 +\n lib/librte_mbuf/meson.build | 2 +\n lib/librte_mbuf/rte_mbuf.c | 74 ++++++++++++++++++++--------\n lib/librte_mbuf/rte_mbuf.h | 23 +++++++++\n lib/librte_mbuf/rte_mbuf_version.map | 6 +++\n 5 files changed, 86 insertions(+), 21 deletions(-)", "diff": "diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile\nindex e2b98a254..7d0c824a3 100644\n--- a/lib/librte_mbuf/Makefile\n+++ b/lib/librte_mbuf/Makefile\n@@ -7,6 +7,8 @@ include $(RTE_SDK)/mk/rte.vars.mk\n LIB = librte_mbuf.a\n \n CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3\n+CFLAGS += -DALLOW_EXPERIMENTAL_API\n+\n LDLIBS += -lrte_eal -lrte_mempool\n \n EXPORT_MAP := rte_mbuf_version.map\ndiff --git a/lib/librte_mbuf/meson.build b/lib/librte_mbuf/meson.build\nindex 45ffb0db5..4d9bdf2ba 100644\n--- a/lib/librte_mbuf/meson.build\n+++ b/lib/librte_mbuf/meson.build\n@@ -5,3 +5,5 @@ version = 3\n sources = files('rte_mbuf.c', 'rte_mbuf_ptype.c', 'rte_mbuf_pool_ops.c')\n headers = files('rte_mbuf.h', 'rte_mbuf_ptype.h', 'rte_mbuf_pool_ops.h')\n deps += ['mempool']\n+\n+allow_experimental_apis = true\ndiff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c\nindex 137a320ed..4e65f0f82 100644\n--- a/lib/librte_mbuf/rte_mbuf.c\n+++ b/lib/librte_mbuf/rte_mbuf.c\n@@ -170,49 +170,81 @@ rte_pktmbuf_pool_create(const char *name, unsigned int n,\n /* do some sanity checks on a mbuf: panic if it fails */\n void\n rte_mbuf_sanity_check(const struct rte_mbuf *m, int is_header)\n+{\n+\tconst char *reason;\n+\n+\tif (rte_mbuf_check(m, is_header, &reason))\n+\t\trte_panic(\"%s\\n\", reason);\n+}\n+\n+__rte_experimental\n+int rte_mbuf_check(const struct rte_mbuf *m, int is_header,\n+\t\t const char **reason)\n {\n \tunsigned int nb_segs, pkt_len;\n \n-\tif (m == NULL)\n-\t\trte_panic(\"mbuf is NULL\\n\");\n+\tif (m == NULL) {\n+\t\t*reason = \"mbuf is NULL\";\n+\t\treturn -1;\n+\t}\n \n \t/* generic checks */\n-\tif (m->pool == NULL)\n-\t\trte_panic(\"bad mbuf pool\\n\");\n-\tif (m->buf_iova == 0)\n-\t\trte_panic(\"bad IO addr\\n\");\n-\tif (m->buf_addr == NULL)\n-\t\trte_panic(\"bad virt addr\\n\");\n+\tif (m->pool == NULL) {\n+\t\t*reason = \"bad mbuf pool\";\n+\t\treturn -1;\n+\t}\n+\tif (m->buf_iova == 0) {\n+\t\t*reason = \"bad IO addr\";\n+\t\treturn -1;\n+\t}\n+\tif (m->buf_addr == NULL) {\n+\t\t*reason = \"bad virt addr\";\n+\t\treturn -1;\n+\t}\n \n \tuint16_t cnt = rte_mbuf_refcnt_read(m);\n-\tif ((cnt == 0) || (cnt == UINT16_MAX))\n-\t\trte_panic(\"bad ref cnt\\n\");\n+\tif ((cnt == 0) || (cnt == UINT16_MAX)) {\n+\t\t*reason = \"bad ref cnt\";\n+\t\treturn -1;\n+\t}\n \n \t/* nothing to check for sub-segments */\n \tif (is_header == 0)\n-\t\treturn;\n+\t\treturn 0;\n \n \t/* data_len is supposed to be not more than pkt_len */\n-\tif (m->data_len > m->pkt_len)\n-\t\trte_panic(\"bad data_len\\n\");\n+\tif (m->data_len > m->pkt_len) {\n+\t\t*reason = \"bad data_len\";\n+\t\treturn -1;\n+\t}\n \n \tnb_segs = m->nb_segs;\n \tpkt_len = m->pkt_len;\n \n \tdo {\n-\t\tif (m->data_off > m->buf_len)\n-\t\t\trte_panic(\"data offset too big in mbuf segment\\n\");\n+\t\tif (m->data_off > m->buf_len) {\n+\t\t\t*reason = \"data offset too big in mbuf segment\";\n+\t\t\treturn -1;\n+\t\t}\n \t\tif ((uint32_t)m->data_off + (uint32_t)m->data_len >\n-\t\t\t\t(uint32_t)m->buf_len)\n-\t\t\trte_panic(\"data length too big in mbuf segment\\n\");\n+\t\t\t\t(uint32_t)m->buf_len) {\n+\t\t\t*reason = \"data length too big in mbuf segment\";\n+\t\t\treturn -1;\n+\t\t}\n \t\tnb_segs -= 1;\n \t\tpkt_len -= m->data_len;\n \t} while ((m = m->next) != NULL);\n \n-\tif (nb_segs)\n-\t\trte_panic(\"bad nb_segs\\n\");\n-\tif (pkt_len)\n-\t\trte_panic(\"bad pkt_len\\n\");\n+\tif (nb_segs) {\n+\t\t*reason = \"bad nb_segs\";\n+\t\treturn -1;\n+\t}\n+\tif (pkt_len) {\n+\t\t*reason = \"bad pkt_len\";\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n }\n \n /* dump a mbuf on console */\ndiff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h\nindex a50b05c64..e12a4c765 100644\n--- a/lib/librte_mbuf/rte_mbuf.h\n+++ b/lib/librte_mbuf/rte_mbuf.h\n@@ -977,6 +977,29 @@ rte_mbuf_ext_refcnt_update(struct rte_mbuf_ext_shared_info *shinfo,\n void\n rte_mbuf_sanity_check(const struct rte_mbuf *m, int is_header);\n \n+/**\n+ * Sanity checks on a mbuf.\n+ *\n+ * Almost like rte_mbuf_sanity_check(), but this function gives the reason\n+ * if corruption is detected rather than panic.\n+ *\n+ * @param m\n+ * The mbuf to be checked.\n+ * @param is_header\n+ * True if the mbuf is a packet header, false if it is a sub-segment\n+ * of a packet (in this case, some fields like nb_segs are not checked)\n+ * @param reason\n+ * A reference to a string pointer where to store the reason why a mbuf is\n+ * considered invalid.\n+ * @return\n+ * - 0 if no issue has been found, reason is left untouched.\n+ * - -1 if a problem is detected, reason then points to a string describing\n+ * the reason why the mbuf is deemed invalid.\n+ */\n+__rte_experimental\n+int rte_mbuf_check(const struct rte_mbuf *m, int is_header,\n+\t\t const char **reason);\n+\n #define MBUF_RAW_ALLOC_CHECK(m) do {\t\t\t\t\\\n \tRTE_ASSERT(rte_mbuf_refcnt_read(m) == 1);\t\t\\\n \tRTE_ASSERT((m)->next == NULL);\t\t\t\t\\\ndiff --git a/lib/librte_mbuf/rte_mbuf_version.map b/lib/librte_mbuf/rte_mbuf_version.map\nindex cae68db8d..2662a37bf 100644\n--- a/lib/librte_mbuf/rte_mbuf_version.map\n+++ b/lib/librte_mbuf/rte_mbuf_version.map\n@@ -45,3 +45,9 @@ DPDK_18.08 {\n \trte_mbuf_user_mempool_ops;\n \trte_pktmbuf_pool_create_by_ops;\n } DPDK_16.11;\n+\n+EXPERIMENTAL {\n+\tglobal:\n+\n+\trte_mbuf_check;\n+} DPDK_18.08;\n", "prefixes": [ "2/3" ] }{ "id": 44464, "url": "