From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9D4F4A0542; Wed, 5 Oct 2022 05:39:55 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id ACBE042B87; Wed, 5 Oct 2022 05:39:13 +0200 (CEST) Received: from out162-62-58-216.mail.qq.com (out162-62-58-216.mail.qq.com [162.62.58.216]) by mails.dpdk.org (Postfix) with ESMTP id BD1E8410FB for ; Wed, 5 Oct 2022 05:39:08 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512; t=1664941147; bh=KcJjMSvQqPY8hUhtR/4N3rubGJAEXmWPx5/cvCjwI6Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=xVSUjAvfAOmfi9Jh3XhF6nFKvkkfQ6+PrEo6bMRAwFbG6jDo7qzGp7f/jkW6ygIaP oCEwV12FfA3WVspdiLOw9x0P1aGLfacGCdbU2prcZaDUivcdktp+EN8TZdu+oEF9eC N2nvbzFEyU1ze/MLUMS5WRdLokIWtVmfP0ePwspk= Received: from qq.com ([120.229.93.179]) by newxmesmtplogicsvrszc13.qq.com (NewEsmtp) with SMTP id 9B40FA58; Wed, 05 Oct 2022 11:38:52 +0800 X-QQ-mid: xmsmtpt1664941145tcmkg9a0q Message-ID: X-QQ-XMAILINFO: NkHKfw09D6j8JCbDIkJgXVV+J0vZXqAJwL5dsNiBDc43roCXGB8gFaB/3gX7HA jOGv90gHcbHrCFFN5dsrZsCdwxTmNL4x43nBp3Vo/lzzDZtrl2A5M7/KZniTldIM4QQHvWF2xr4o SULWccKPil4+YPVasgNxFklI6YaAtJ7a8zRRVdqf4oHLe8S5cslBOpGzDwZFZEVOPuJ9aZGze33p AKtVOqsO7TYZaZsMFPyzDsM99sgtphwnjS8J0Qo/qKzMDGn2q5j0n0iouotgxn4+bolnRSz42U55 7JL4+n9xBnknSg5EBGD4UBjHteNY98vN8N/yPmSCE3IE3wLsXRTtwsYSPYsfLNLuOTkP9LTQ3KGv URWQhqJXX7P32Y8ARRJdZJ9f4CZZTwOZifXE76hQC8G61KblVkavXCk4D2R46d9UtfOSfiB5P/SS cN0nFuEpS4JKZdxVHeXxJg9KMGJvw061hpZ6B16hRiQL/cwYutR9oWa8IXKEWM8QEJOHemz7iK/L Yb1Nrpi9sPW5aMTYZ7VNy0hRH+7elCl3ALFQIzFkU9Rbpik2uFaFkOj42Wy5L2dY+FEJeX9Pw5yh qTWIUA9AGyhWYEPhX+EQ8L8e370RcDHcCpT+BFnOeyFEdgIIVtwXIeSPgJRmUic1QsPml8me6sO7 GecciTOXLD39cYM27owESSntF9hP1UDiPQ/5WtXn4LTNqtawLSIprt74i9UmY5LGH+cuX1CQiEN2 haKxyedZ8EAZnISOZ3Up+hvRmIFr7Hj130MuumM7mzu49oJdSTiQ34XnZO6JzKbBwqDEOimF+KxI u1kFet0OmSSpQX3zEcvzVZMaZDoyqnHF7nxnECBXVVpqbj4KmoSdQBsdyKkM/Oo234A05IflQTCJ wPM2a5472oVv1lyvgXFGD52XuCn9wqvASAKWGEsr3jpISqFFpjRNEgEkaF7+CzV7CuV+tjYZfKfB qXS/ax2LKKxnzK3RIa5k8LRmHrJ9DcBkbBjkv1sQpEPtSIjx9eh3rcYSfno01f From: datshan To: david.marchand@redhat.com, mb@smartsharesystems.com, anatoly.burakov@intel.com, dmitry.kozliuk@gmail.com, jerinjacobk@gmail.com Cc: thomas@monjalon.net, dev@dpdk.org, Chengwen Feng Subject: [PATCH v4 09/10] memarea: detect memory corruption based on magic Date: Wed, 5 Oct 2022 11:38:47 +0800 X-OQ-MSGID: <20221005033848.2241-10-datshan@qq.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221005033848.2241-1-datshan@qq.com> References: <20220721044648.6817-1-fengchengwen@huawei.com> <20221005033848.2241-1-datshan@qq.com> 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Chengwen Feng This patch provides lightweight mechanism for detecting memory corruption which based on magic field in each element node. Signed-off-by: Chengwen Feng --- lib/memarea/memarea_private.h | 2 ++ lib/memarea/rte_memarea.c | 29 ++++++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/lib/memarea/memarea_private.h b/lib/memarea/memarea_private.h index 08735ca81f..4f5393e6f9 100644 --- a/lib/memarea/memarea_private.h +++ b/lib/memarea/memarea_private.h @@ -7,10 +7,12 @@ #include +#define MEMAREA_ELEM_MAGIC_NUM 0xbeef1234 #define MEMAREA_FREE_ELEM_COOKIE 0xFFFFFFFF struct memarea_elem { size_t size; + uint32_t magic; uint32_t cookie; int32_t refcnt; /* Non-zero indicates that it has been allocated */ TAILQ_ENTRY(memarea_elem) elem_node; diff --git a/lib/memarea/rte_memarea.c b/lib/memarea/rte_memarea.c index f45191aa7f..c81d4dd3fa 100644 --- a/lib/memarea/rte_memarea.c +++ b/lib/memarea/rte_memarea.c @@ -135,6 +135,7 @@ rte_memarea_create(const struct rte_memarea_param *init) ma->top_addr = (void *)((uintptr_t)addr + init->total_sz - 1); elem = addr; elem->size = init->total_sz - sizeof(struct memarea_elem); + elem->magic = MEMAREA_ELEM_MAGIC_NUM; elem->cookie = MEMAREA_FREE_ELEM_COOKIE; elem->refcnt = 0; TAILQ_INSERT_TAIL(&ma->elem_list, elem, elem_node); @@ -194,6 +195,7 @@ memarea_add_node(struct rte_memarea *ma, struct memarea_elem *elem, size_t need_ new_elem = (struct memarea_elem *)((uintptr_t)elem + sizeof(struct memarea_elem) + align_size); new_elem->size = elem->size - align_size - sizeof(struct memarea_elem); + new_elem->magic = MEMAREA_ELEM_MAGIC_NUM; new_elem->cookie = MEMAREA_FREE_ELEM_COOKIE; new_elem->refcnt = 0; TAILQ_INSERT_AFTER(&ma->elem_list, elem, new_elem, elem_node); @@ -221,6 +223,8 @@ rte_memarea_alloc(struct rte_memarea *ma, size_t size, uint32_t cookie) memarea_lock(ma); TAILQ_FOREACH(elem, &ma->free_list, free_node) { + if (unlikely(elem->magic != MEMAREA_ELEM_MAGIC_NUM)) + break; if (elem->size < size) continue; if (memarea_whether_add_node(elem->size, size)) @@ -253,6 +257,7 @@ memarea_merge_node(struct rte_memarea *ma, struct memarea_elem *curr, { curr->size += next->size + sizeof(struct memarea_elem); next->size = 0; + next->magic = ~MEMAREA_ELEM_MAGIC_NUM; next->cookie = 0; TAILQ_REMOVE(&ma->elem_list, next, elem_node); if (del_next_from_free) @@ -295,6 +300,13 @@ rte_memarea_update_refcnt(struct rte_memarea *ma, void *ptr, int16_t value) return; memarea_lock(ma); + if (unlikely(elem->magic != MEMAREA_ELEM_MAGIC_NUM)) { + RTE_LOG(ERR, MEMAREA, "memarea: %s magic: 0x%x check fail!\n", + ma->init.name, elem->magic); + memarea_unlock(ma); + return; + } + if (ptr < ma->area_addr || ptr > ma->top_addr) { rte_memarea_update_refcnt(ma->init.bak_memarea, ptr, value); memarea_unlock(ma); @@ -348,8 +360,11 @@ memarea_elem_list_num(struct rte_memarea *ma) struct memarea_elem *elem; uint32_t num = 0; - TAILQ_FOREACH(elem, &ma->elem_list, elem_node) + TAILQ_FOREACH(elem, &ma->elem_list, elem_node) { + if (elem->magic != MEMAREA_ELEM_MAGIC_NUM) + break; num++; + } return num; } @@ -360,8 +375,11 @@ memarea_free_list_num(struct rte_memarea *ma) struct memarea_elem *elem; uint32_t num = 0; - TAILQ_FOREACH(elem, &ma->free_list, free_node) + TAILQ_FOREACH(elem, &ma->free_list, free_node) { + if (elem->magic != MEMAREA_ELEM_MAGIC_NUM) + break; num++; + } return num; } @@ -372,9 +390,14 @@ memarea_dump_all(struct rte_memarea *ma, FILE *f) struct memarea_elem *elem; fprintf(f, " regions:\n"); - TAILQ_FOREACH(elem, &ma->elem_list, elem_node) + TAILQ_FOREACH(elem, &ma->elem_list, elem_node) { + if (elem->magic != MEMAREA_ELEM_MAGIC_NUM) { + fprintf(f, " magic: 0x%x chech fail!\n", elem->magic); + break; + } fprintf(f, " size: 0x%zx cookie: 0x%x refcnt: %d\n", elem->size, elem->cookie, elem->refcnt); + } } int -- 2.34.1