From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-yk0-f172.google.com (mail-yk0-f172.google.com [209.85.160.172]) by dpdk.org (Postfix) with ESMTP id E2E8868BE for ; Thu, 11 Dec 2014 17:05:51 +0100 (CET) Received: by mail-yk0-f172.google.com with SMTP id 131so2317532ykp.3 for ; Thu, 11 Dec 2014 08:05:51 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to :content-type; bh=HztzdfEBIXQeVv7ugQqaBJjr9lumtRFK6Zwmlge+DNI=; b=LK9PuBjOYxxaHtQ3wwQFE0zBEMP+vgAdQ9O5uIOCf17oma/1g/9YhXfkacqxRjHIfT StweGTyJHKZ9QT/CJYFS8/Sf+pOTy/dxaXscVeP2AycP3lfOLC6mFrEDgrzdyJiZz8Y3 b4VpuQToMpgGPXYqekPcmQVdBIRTgtTjoKwIbfb1O/dLZ5vzUI3AEFack8PQ//fNbXPF u6xW5XyOdEYpzf4N7grrLx5hia9CS4uLvKeTPD8CCugz+gTInOZDLRolyQECKoRLaaOT XBPEHjOMHGY6VhY0VPS7SnI4rB1CBz+ZE9B5PgDVu8cegGEdcBwp4UgGAT+noTHlpK4c XcIw== X-Gm-Message-State: ALoCoQmXLbbOGs0/ZclsUh9nX4isXpHOd3L9mRNOSxVQnc1lTuESkGGl/vvlyJdjBfm4arp7jo7H MIME-Version: 1.0 X-Received: by 10.236.32.40 with SMTP id n28mr7514877yha.16.1418313951303; Thu, 11 Dec 2014 08:05:51 -0800 (PST) Received: by 10.170.54.78 with HTTP; Thu, 11 Dec 2014 08:05:51 -0800 (PST) Date: Thu, 11 Dec 2014 10:05:51 -0600 Message-ID: From: Jay Rolette To: Dev Content-Type: text/plain; charset=UTF-8 X-Content-Filtered-By: Mailman/MimeDel 2.1.15 Subject: [dpdk-dev] [PATCH] replaced O(n^2) sort in sort_by_physaddr() with qsort() from standard library 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: Thu, 11 Dec 2014 16:05:52 -0000 Signed-off-by: Jay Rolette --- lib/librte_eal/linuxapp/eal/eal_memory.c | 59 +++++++++++--------------------- 1 file changed, 20 insertions(+), 39 deletions(-) diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c b/lib/librte_eal/linuxapp/eal/eal_memory.c index bae2507..3656515 100644 --- a/lib/librte_eal/linuxapp/eal/eal_memory.c +++ b/lib/librte_eal/linuxapp/eal/eal_memory.c @@ -670,6 +670,25 @@ error: return -1; } +static int +cmp_physaddr(const void *a, const void *b) +{ +#ifndef RTE_ARCH_PPC_64 + const struct hugepage_file *p1 = (const struct hugepage_file *)a; + const struct hugepage_file *p2 = (const struct hugepage_file *)b; +#else + // PowerPC needs memory sorted in reverse order from x86 + const struct hugepage_file *p1 = (const struct hugepage_file *)b; + const struct hugepage_file *p2 = (const struct hugepage_file *)a; +#endif + if (p1->physaddr < p2->physaddr) + return -1; + else if (p1->physaddr > p2->physaddr) + return 1; + else + return 0; +} + /* * Sort the hugepg_tbl by physical address (lower addresses first on x86, * higher address first on powerpc). We use a slow algorithm, but we won't @@ -678,45 +697,7 @@ error: static int sort_by_physaddr(struct hugepage_file *hugepg_tbl, struct hugepage_info *hpi) { - unsigned i, j; - int 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; - - /* - * browse all entries starting at 'i', and find the - * entry with the smallest addr - */ - for (j=i; j< hpi->num_pages[0]; j++) { - - if (compare_addr == 0 || -#ifdef RTE_ARCH_PPC_64 - hugepg_tbl[j].physaddr > compare_addr) { -#else - hugepg_tbl[j].physaddr < compare_addr) { -#endif - compare_addr = hugepg_tbl[j].physaddr; - compare_idx = j; - } - } - - /* should not happen */ - if (compare_idx == -1) { - RTE_LOG(ERR, EAL, "%s(): error in physaddr sorting\n", __func__); - return -1; - } - - /* swap the 2 entries in the table */ - memcpy(&tmp, &hugepg_tbl[compare_idx], - sizeof(struct hugepage_file)); - memcpy(&hugepg_tbl[compare_idx], &hugepg_tbl[i], - sizeof(struct hugepage_file)); - memcpy(&hugepg_tbl[i], &tmp, sizeof(struct hugepage_file)); - } + qsort(hugepg_tbl, hpi->num_pages[0], sizeof(struct hugepage_file), cmp_physaddr); return 0; } --