From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by dpdk.org (Postfix) with ESMTP id 0C0724C9D for ; Mon, 10 Sep 2018 07:45:58 +0200 (CEST) Received: by mail-wr1-f67.google.com with SMTP id v16-v6so20432752wro.11 for ; Sun, 09 Sep 2018 22:45:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=kVBRpwdIa3RbjcBqDAGG0KZBtffIViGt9wurQdHS/Ck=; b=1kotq6s0eKHm5haJ/zJMp5UHvicoDvMUdpKRkJvaUDaWCr9ibYiRUC2jZMbKkoRBNi nDwoeJxsmO8UgJfC7e7a7h6+s3COb0dhrYhm7L+W6kUoLS+bhC9qiquXOVUdB1FgqKU/ HSf/M3S4ydnbqQQo/lbNICWfRjWdAzFQVvavZWm+gukCRnWG4cm5Bk8xawI2QRLyRxJd frkiglNIcBN+QkHEeT4fR2JpZeGw9uAFpa2ncHbUIxtcDvtP40vyiOSpa9lpJSEHQ9Pw zLHXcTy299YQr2FQT5Q6MqwJqn0/yPQDnSAoGZeBndImZ+AN75+LDLmQRBNUQA8qeDR0 FURA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=kVBRpwdIa3RbjcBqDAGG0KZBtffIViGt9wurQdHS/Ck=; b=txHhxRUYp1Z0OSQqOdRzmepS8vwJwQiWMqmn1ugAP9vbC66ot+9QYiJooefum1vLOk bltUiEDm7EfoNFY0f9w8EMmZar4NOHhgqqJX49diTk6MlGpk7A4swcWwRneV+NLtGLEx 24kWmQVOM0p0JfvgRVMaqvp19gB7n/LVlPrD9jfna4pn1UKDcCni84nUXmMHzPRyTPJD URQTk8Hp8H0L5KjnYW9t7Kjcmqr/h85TenWkySaUXSmqecHZvYYfE5mIlPUB0EcSXI75 GjPzqMkWrYMj164DZmpTQHGH+pYgAId9u/UavFay2skRibVO9KmzbnU931OxBunHJbL8 p6Ug== X-Gm-Message-State: APzg51CVxg+NoMEYIlg7SUDfWjdnwdioG0QzTCwka2g0I5vw5goWmsiI m7v8X4pjx744R3COK8h7kgZNLThJVaU= X-Google-Smtp-Source: ANB0VdbUIvjrKQ3k6Q577rDXuVzTOzm9Iu2BjZhkjMCjq44RscktS4udie976hcQo2rxkq414rvvFg== X-Received: by 2002:adf:ad8e:: with SMTP id w14-v6mr14633893wrc.178.1536558357475; Sun, 09 Sep 2018 22:45:57 -0700 (PDT) Received: from 6wind.com ([109.190.253.16]) by smtp.gmail.com with ESMTPSA id t4-v6sm14667473wrb.45.2018.09.09.22.45.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 09 Sep 2018 22:45:56 -0700 (PDT) From: David Marchand To: dev@dpdk.org Cc: olivier.matz@6wind.com, wenzhuo.lu@intel.com, jingjing.wu@intel.com, bernard.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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 10 Sep 2018 05:45:58 -0000 Let's add a little helper that does the same as rte_mbuf_sanity_check but without the panic. Signed-off-by: David Marchand --- lib/librte_mbuf/Makefile | 2 + lib/librte_mbuf/meson.build | 2 + lib/librte_mbuf/rte_mbuf.c | 74 ++++++++++++++++++++-------- lib/librte_mbuf/rte_mbuf.h | 23 +++++++++ lib/librte_mbuf/rte_mbuf_version.map | 6 +++ 5 files changed, 86 insertions(+), 21 deletions(-) diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile index e2b98a254..7d0c824a3 100644 --- a/lib/librte_mbuf/Makefile +++ b/lib/librte_mbuf/Makefile @@ -7,6 +7,8 @@ include $(RTE_SDK)/mk/rte.vars.mk LIB = librte_mbuf.a CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 +CFLAGS += -DALLOW_EXPERIMENTAL_API + LDLIBS += -lrte_eal -lrte_mempool EXPORT_MAP := rte_mbuf_version.map diff --git a/lib/librte_mbuf/meson.build b/lib/librte_mbuf/meson.build index 45ffb0db5..4d9bdf2ba 100644 --- a/lib/librte_mbuf/meson.build +++ b/lib/librte_mbuf/meson.build @@ -5,3 +5,5 @@ version = 3 sources = files('rte_mbuf.c', 'rte_mbuf_ptype.c', 'rte_mbuf_pool_ops.c') headers = files('rte_mbuf.h', 'rte_mbuf_ptype.h', 'rte_mbuf_pool_ops.h') deps += ['mempool'] + +allow_experimental_apis = true diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c index 137a320ed..4e65f0f82 100644 --- a/lib/librte_mbuf/rte_mbuf.c +++ b/lib/librte_mbuf/rte_mbuf.c @@ -170,49 +170,81 @@ rte_pktmbuf_pool_create(const char *name, unsigned int n, /* do some sanity checks on a mbuf: panic if it fails */ void rte_mbuf_sanity_check(const struct rte_mbuf *m, int is_header) +{ + const char *reason; + + if (rte_mbuf_check(m, is_header, &reason)) + rte_panic("%s\n", reason); +} + +__rte_experimental +int rte_mbuf_check(const struct rte_mbuf *m, int is_header, + const char **reason) { unsigned int nb_segs, pkt_len; - if (m == NULL) - rte_panic("mbuf is NULL\n"); + if (m == NULL) { + *reason = "mbuf is NULL"; + return -1; + } /* generic checks */ - if (m->pool == NULL) - rte_panic("bad mbuf pool\n"); - if (m->buf_iova == 0) - rte_panic("bad IO addr\n"); - if (m->buf_addr == NULL) - rte_panic("bad virt addr\n"); + if (m->pool == NULL) { + *reason = "bad mbuf pool"; + return -1; + } + if (m->buf_iova == 0) { + *reason = "bad IO addr"; + return -1; + } + if (m->buf_addr == NULL) { + *reason = "bad virt addr"; + return -1; + } uint16_t cnt = rte_mbuf_refcnt_read(m); - if ((cnt == 0) || (cnt == UINT16_MAX)) - rte_panic("bad ref cnt\n"); + if ((cnt == 0) || (cnt == UINT16_MAX)) { + *reason = "bad ref cnt"; + return -1; + } /* nothing to check for sub-segments */ if (is_header == 0) - return; + return 0; /* data_len is supposed to be not more than pkt_len */ - if (m->data_len > m->pkt_len) - rte_panic("bad data_len\n"); + if (m->data_len > m->pkt_len) { + *reason = "bad data_len"; + return -1; + } nb_segs = m->nb_segs; pkt_len = m->pkt_len; do { - if (m->data_off > m->buf_len) - rte_panic("data offset too big in mbuf segment\n"); + if (m->data_off > m->buf_len) { + *reason = "data offset too big in mbuf segment"; + return -1; + } if ((uint32_t)m->data_off + (uint32_t)m->data_len > - (uint32_t)m->buf_len) - rte_panic("data length too big in mbuf segment\n"); + (uint32_t)m->buf_len) { + *reason = "data length too big in mbuf segment"; + return -1; + } nb_segs -= 1; pkt_len -= m->data_len; } while ((m = m->next) != NULL); - if (nb_segs) - rte_panic("bad nb_segs\n"); - if (pkt_len) - rte_panic("bad pkt_len\n"); + if (nb_segs) { + *reason = "bad nb_segs"; + return -1; + } + if (pkt_len) { + *reason = "bad pkt_len"; + return -1; + } + + return 0; } /* dump a mbuf on console */ diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h index a50b05c64..e12a4c765 100644 --- a/lib/librte_mbuf/rte_mbuf.h +++ b/lib/librte_mbuf/rte_mbuf.h @@ -977,6 +977,29 @@ rte_mbuf_ext_refcnt_update(struct rte_mbuf_ext_shared_info *shinfo, void rte_mbuf_sanity_check(const struct rte_mbuf *m, int is_header); +/** + * Sanity checks on a mbuf. + * + * Almost like rte_mbuf_sanity_check(), but this function gives the reason + * if corruption is detected rather than panic. + * + * @param m + * The mbuf to be checked. + * @param is_header + * True if the mbuf is a packet header, false if it is a sub-segment + * of a packet (in this case, some fields like nb_segs are not checked) + * @param reason + * A reference to a string pointer where to store the reason why a mbuf is + * considered invalid. + * @return + * - 0 if no issue has been found, reason is left untouched. + * - -1 if a problem is detected, reason then points to a string describing + * the reason why the mbuf is deemed invalid. + */ +__rte_experimental +int rte_mbuf_check(const struct rte_mbuf *m, int is_header, + const char **reason); + #define MBUF_RAW_ALLOC_CHECK(m) do { \ RTE_ASSERT(rte_mbuf_refcnt_read(m) == 1); \ RTE_ASSERT((m)->next == NULL); \ diff --git a/lib/librte_mbuf/rte_mbuf_version.map b/lib/librte_mbuf/rte_mbuf_version.map index cae68db8d..2662a37bf 100644 --- a/lib/librte_mbuf/rte_mbuf_version.map +++ b/lib/librte_mbuf/rte_mbuf_version.map @@ -45,3 +45,9 @@ DPDK_18.08 { rte_mbuf_user_mempool_ops; rte_pktmbuf_pool_create_by_ops; } DPDK_16.11; + +EXPERIMENTAL { + global: + + rte_mbuf_check; +} DPDK_18.08; -- 2.17.1