From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [119.145.14.64]) by dpdk.org (Postfix) with ESMTP id 123877F84 for ; Wed, 29 Oct 2014 09:07:06 +0100 (CET) Received: from 172.24.2.119 (EHLO szxeml452-hub.china.huawei.com) ([172.24.2.119]) by szxrg01-dlp.huawei.com (MOS 4.3.7-GA FastPath queued) with ESMTP id CDP46540; Wed, 29 Oct 2014 16:15:56 +0800 (CST) Received: from [127.0.0.1] (10.177.19.115) by szxeml452-hub.china.huawei.com (10.82.67.195) with Microsoft SMTP Server id 14.3.158.1; Wed, 29 Oct 2014 16:15:50 +0800 Message-ID: <5450A234.7070402@huawei.com> Date: Wed, 29 Oct 2014 16:15:48 +0800 From: Linhaifeng User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:31.0) Gecko/20100101 Thunderbird/31.1.0 MIME-Version: 1.0 To: "Qiu, Michael" , "dev@dpdk.org" References: <1414561659-7408-1-git-send-email-haifeng.lin@huawei.com> <533710CFB86FA344BFBF2D6802E60286C7CBAE@SHSMSX101.ccr.corp.intel.com> <54508BD3.1080001@huawei.com> <533710CFB86FA344BFBF2D6802E60286C7CC55@SHSMSX101.ccr.corp.intel.com> In-Reply-To: <533710CFB86FA344BFBF2D6802E60286C7CC55@SHSMSX101.ccr.corp.intel.com> Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.177.19.115] X-CFilter-Loop: Reflected Subject: Re: [dpdk-dev] [PATCH v2] support free hugepages 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: Wed, 29 Oct 2014 08:07:08 -0000 On 2014/10/29 16:04, Qiu, Michael wrote: > 10/29/2014 2:41 PM, Linhaifeng : >> >> On 2014/10/29 14:14, Qiu, Michael wrote: >>> 在 10/29/2014 1:49 PM, linhaifeng 写道: >>>> rte_eal_hugepage_free() is used for unlink all hugepages.If you want to >>>> free all hugepages you must make sure that you have stop to use it,and you >>>> must call this function before exit process. >>>> >>>> Signed-off-by: linhaifeng >>>> --- >>>> .../lib/librte_eal/common/include/rte_memory.h | 11 ++++++++ >>>> .../lib/librte_eal/linuxapp/eal/eal_memory.c | 31 ++++++++++++++++++++++ >>>> 2 files changed, 42 insertions(+) >>>> >>>> diff --git a/dpdk/dpdk-1.7.0/lib/librte_eal/common/include/rte_memory.h b/dpdk/dpdk-1.7.0/lib/librte_eal/common/include/rte_memory.h >>>> index 4cf8ea9..f6ad95f 100644 >>>> --- a/dpdk/dpdk-1.7.0/lib/librte_eal/common/include/rte_memory.h >>>> +++ b/dpdk/dpdk-1.7.0/lib/librte_eal/common/include/rte_memory.h >>>> @@ -172,6 +172,17 @@ unsigned rte_memory_get_nchannel(void); >>>> */ >>>> unsigned rte_memory_get_nrank(void); >>>> >>>> +/** >>>> + * Unlink all hugepages which created by dpdk. >>>> + * >>>> + * @param void >>>> + * >>>> + * @return >>>> + * 0: successfully >>>> + * negative: error >>>> + */ >>>> +int rte_eal_hugepage_free(void); >>>> + >>>> #ifdef RTE_LIBRTE_XEN_DOM0 >>>> /** >>>> * Return the physical address of elt, which is an element of the pool mp. >>>> diff --git a/dpdk/dpdk-1.7.0/lib/librte_eal/linuxapp/eal/eal_memory.c b/dpdk/dpdk-1.7.0/lib/librte_eal/linuxapp/eal/eal_memory.c >>>> index f2454f4..109207c 100644 >>>> --- a/dpdk/dpdk-1.7.0/lib/librte_eal/linuxapp/eal/eal_memory.c >>>> +++ b/dpdk/dpdk-1.7.0/lib/librte_eal/linuxapp/eal/eal_memory.c >>>> @@ -98,6 +98,13 @@ >>>> #include "eal_filesystem.h" >>>> #include "eal_hugepages.h" >>>> >>>> +struct hugepage_table { >>>> + struct hugepage_file *hugepg_tbl; >>>> + unsigned nr_hugefiles; >>>> +}; >>>> + >>>> +static struct hugepage_table g_hugepage_table; >>>> + >>>> /** >>>> * @file >>>> * Huge page mapping under linux >>>> @@ -1202,6 +1209,7 @@ rte_eal_hugepage_init(void) >>>> (unsigned) >>>> (used_hp[i].hugepage_sz / 0x100000), >>>> j); >>>> + g_hugepage_table.nr_hugefiles += used_hp[i].num_pages[j]; >>>> } >>>> } >>>> } >>>> @@ -1237,6 +1245,8 @@ rte_eal_hugepage_init(void) >>>> goto fail; >>>> } >>>> >>>> + g_hugepage_table.hugepg_tbl = hugepage; >>>> + >>>> /* free the temporary hugepage table */ >>>> free(tmp_hp); >>>> tmp_hp = NULL; >>>> @@ -1487,6 +1497,27 @@ error: >>>> return -1; >>>> } >>>> >>>> +int >>>> +rte_eal_hugepage_free(void) >>>> +{ >>>> + struct hugepage_file *hugepg_tbl = g_hugepage_table.hugepg_tbl; >>>> + unsigned i; >>>> + unsigned nr_hugefiles = g_hugepage_table.nr_hugefiles; >>>> + int ret = 0; >>>> + >>>> + for (i = 0; i < nr_hugefiles; i++) { >>>> + ret = unlink(hugepg_tbl[i].filepath); >>>> + if (ret != 0) { >>>> + RTE_LOG(ERR, EAL, "Failed to unlink %s", hugepg_tbl[i].filepath); >>>> + return ret; >>>> + } >>>> + hugepg_tbl[i].orig_va = NULL; >>> BTW, is it better to first set hugepg_tbl[i].orig_vato NULL, then unlink >>> filepath? >>> It may be not a good idea to first remove then set to NULL. >>> >>> Thanks, >>> Michael >>> >> If first set hugepg_tbl[i].orig_va to NULL,then failed to unlink you have to restore hugepg_tbl[i].orig_va. >> So I first to unlink for less codes. > > But it may be a big issue(not safe) when you unlink the path before you > set the pointer to NULL, another thing is , why you need to restore the > orig_va since the app will exit? Even you need to restore it just one or > two lines code, I think it is not a big deal. > > Thanks, > Michael Thank you,Michael Yes,it's not safe to unlink the path before set the pointer to NULL.I will fix it. BTW.is need to return error when failed to unlink?May be not need? >> >>>> + } >>>> + >>>> + RTE_LOG(INFO, EAL, "unlink %u hugepage files\n", nr_hugefiles); >>>> + return ret; >>>> +} >>>> + >>>> static int >>>> rte_eal_memdevice_init(void) >>>> { >>> >>> . >>> > > > . > -- Regards, Haifeng