From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtprelay04.ispgateway.de (smtprelay04.ispgateway.de [80.67.31.27]) by dpdk.org (Postfix) with ESMTP id 48BE18D87 for ; Fri, 4 Sep 2015 12:14:46 +0200 (CEST) Received: from [87.172.175.157] (helo=ralf-Latitude-E7450.allegro) by smtprelay04.ispgateway.de with esmtpsa (TLSv1.2:AES128-SHA256:128) (Exim 4.84) (envelope-from ) id 1ZXo18-0002UD-I6 for dev@dpdk.org; Fri, 04 Sep 2015 12:14:46 +0200 From: Ralf Hoffmann To: dev@dpdk.org Date: Fri, 4 Sep 2015 12:14:37 +0200 Message-Id: <1441361677-10271-1-git-send-email-ralf.hoffmann@allegro-packets.com> X-Mailer: git-send-email 2.1.4 X-Df-Sender: cmFsZi5ob2ZmbWFubkBhbGxlZ3JvLXBhY2tldHMuY29t Subject: [dpdk-dev] [PATCH v1] change hugepage sorting to avoid overlapping memcpy X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 04 Sep 2015 10:14:46 -0000 with only one hugepage or already sorted hugepage addresses, the sort function called memcpy with same src and dst pointer. Debugging with valgrind will issue a warning about overlapping area. This patch changes the bubble sort to avoid this behavior. Also, the function cannot fail any longer. Signed-off-by: Ralf Hoffmann --- lib/librte_eal/linuxapp/eal/eal_memory.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c b/lib/librte_eal/linuxapp/eal/eal_memory.c index ac2745e..6d01f61 100644 --- a/lib/librte_eal/linuxapp/eal/eal_memory.c +++ b/lib/librte_eal/linuxapp/eal/eal_memory.c @@ -699,25 +699,25 @@ error: * higher address first on powerpc). We use a slow algorithm, but we won't * have millions of pages, and this is only done at init time. */ -static int +static void sort_by_physaddr(struct hugepage_file *hugepg_tbl, struct hugepage_info *hpi) { unsigned i, j; - int compare_idx; + unsigned compare_idx; uint64_t compare_addr; struct hugepage_file tmp; for (i = 0; i < hpi->num_pages[0]; i++) { - compare_addr = 0; - compare_idx = -1; + compare_addr = hugepg_tbl[i].physaddr; + compare_idx = i; /* - * browse all entries starting at 'i', and find the + * browse all entries starting at 'i+1', and find the * entry with the smallest addr */ - for (j=i; j< hpi->num_pages[0]; j++) { + for (j=i + 1; j < hpi->num_pages[0]; j++) { - if (compare_addr == 0 || + if ( #ifdef RTE_ARCH_PPC_64 hugepg_tbl[j].physaddr > compare_addr) { #else @@ -728,10 +728,9 @@ sort_by_physaddr(struct hugepage_file *hugepg_tbl, struct hugepage_info *hpi) } } - /* should not happen */ - if (compare_idx == -1) { - RTE_LOG(ERR, EAL, "%s(): error in physaddr sorting\n", __func__); - return -1; + if (compare_idx == i) { + /* no smaller page found */ + continue; } /* swap the 2 entries in the table */ @@ -741,7 +740,8 @@ sort_by_physaddr(struct hugepage_file *hugepg_tbl, struct hugepage_info *hpi) sizeof(struct hugepage_file)); memcpy(&hugepg_tbl[i], &tmp, sizeof(struct hugepage_file)); } - return 0; + + return; } /* @@ -1164,8 +1164,7 @@ rte_eal_hugepage_init(void) goto fail; } - if (sort_by_physaddr(&tmp_hp[hp_offset], hpi) < 0) - goto fail; + sort_by_physaddr(&tmp_hp[hp_offset], hpi); #ifdef RTE_EAL_SINGLE_FILE_SEGMENTS /* remap all hugepages into single file segments */ -- 2.1.4