From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qg0-f50.google.com (mail-qg0-f50.google.com [209.85.192.50]) by dpdk.org (Postfix) with ESMTP id 95EDCB368 for ; Thu, 31 Jul 2014 16:55:30 +0200 (CEST) Received: by mail-qg0-f50.google.com with SMTP id q108so4156306qgd.9 for ; Thu, 31 Jul 2014 07:57:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; bh=W5iz3CQf2kWcMNotnzgnoA90NnqN+BctmvGGeRCv6D0=; b=QYa1nQ6mUQ9uKo0jXpn0KAbN6qZX7Ez9K4VGQShvccQe/GJ4qHkQc+NrvMMeO8zYy2 dGU/Nt7eicbdY0zpi/v8KUp/RTuI9SYD1LLtUmdDKV9KA0JEXsikH0rCqgQHzb1sFE8G 8GxW/d95Wpy4NWMn9ilBbEroXluteb25x5CXKVowOhyXXBomTpz6aT+SQdavRAVmE0jS acAPHPZiYHJRS8U2MT8amKaSivhD3dKsn7g0AWPIsNRC03/Ws8qZQqba1U3/5fvF0atg 9S7YByqkqXFtBAK9TU8ssQ6QZ8s1zO39yZJA1ygvvVXI2oHda3T6RrkfpatFyOk9yZpP 52Eg== MIME-Version: 1.0 X-Received: by 10.140.89.197 with SMTP id v63mr18464286qgd.71.1406818650603; Thu, 31 Jul 2014 07:57:30 -0700 (PDT) Received: by 10.140.80.34 with HTTP; Thu, 31 Jul 2014 07:57:30 -0700 (PDT) In-Reply-To: <2601191342CEEE43887BDE71AB9772582134416A@IRSMSX105.ger.corp.intel.com> References: <59AF69C657FD0841A61C55336867B5B0343B1714@IRSMSX103.ger.corp.intel.com> <2601191342CEEE43887BDE71AB977258213440D1@IRSMSX105.ger.corp.intel.com> <2601191342CEEE43887BDE71AB9772582134416A@IRSMSX105.ger.corp.intel.com> Date: Thu, 31 Jul 2014 19:27:30 +0430 Message-ID: From: Mahdi Dashtbozorgi To: "Ananyev, Konstantin" , dev@dpdk.org Content-Type: text/plain; charset=ISO-8859-1 X-Content-Filtered-By: Mailman/MimeDel 2.1.15 Subject: Re: [dpdk-dev] free a memzone 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, 31 Jul 2014 14:55:31 -0000 Hi Konstantin, Thank you for your response. Your Idea seems great! I will implement it this way. Best Regards, Mahdi. On Mon, Jul 28, 2014 at 9:39 PM, Ananyev, Konstantin < konstantin.ananyev@intel.com> wrote: > Hi Mahdi, > > >Hi Konstantin, > >Thank you very much. Your solution fixed my problem. > >Is there a solution like this for resetting the memory zone, which is > used by rte_malloc function? > >Because if I use rte_malloc instead of malloc, in the case of application > crash, the memory zone, which was used by rte_malloc in the previous run > would be >unusable for the next run of slave process. > > Without significant modification inside librte_eal and/or librte_malloc - > nothing comes on top of my head. > If that is such a big problem to you, might be it is possible to change > your whole process model a bit: > > In the parent process: > - allocate memory/init run-time strcutures > L1: > - fork(); > - wait till child terminates > - if it terminated abnormally, then free memory/re-init run-time > structures. > Goto L1 > > Do actual packet processing inside child process. > > Would that help somehow? > Konstantin > > > -----Original Message----- > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Mahdi Dashtbozorgi > > Sent: Thursday, July 24, 2014 6:20 AM > > To: dev@dpdk.org > > Subject: Re: [dpdk-dev] free a memzone > > > > Hi Bruce, > > > > Thank you for the response. That's a great Idea! > > But I do not understand the last four parameters of this function. > (vaddr, > > paddr, pg_num, pg_shift) > > I guess vaddr is the virtual address of the previously allocated mempool, > yes > > > paddr is calculated using function call rte_mem_virt2phy(vaddr), am I > > right? > yes > > >what about pg_num and pg_shift? how can I pass them correctly? > From rte_mempool.h: > "* @param pg_num > * Number of elements in the paddr array. > * @param pg_shift > * LOG2 of the physical pages size." > > If you are using memzone as externally allocated memory - it will be > already physically continuos. > So in your case pg_num = MEMPOOL_PG_NUM_DEFAULT, pg_shift = > MEMPOOL_PG_SHIFT_MAX. > > Though, I don't think rte_mempool_xmem_create() will help you in any way. > Again from rte_mempool.h: > "* Creates a new mempool named *name* in memory. > * > * This function uses ``memzone_reserve()`` to allocate memory. The > * pool contains n elements of elt_size. Its size is set to n. > * Depending on the input parameters, mempool elements can be either > allocated > * together with the mempool header, or an externally provided memory > buffer > * could be used to store mempool objects. In later case, that external > * memory buffer can consist of set of disjoint phyiscal pages." > > So xmem_create would still create a new ring, reserve a new memzone of > mempool's metadata, etc. > The only difference - it can use externally allocated memory to store > mempool elements. > > As I understand what you need is sort of mempool_reset(): a function that > would re-init mempool to just created state > (all elements are free, lcores caches are empty, etc). > Right now we don't have such function, but I suppose something like that > should do > (note that I didn't run or even build it): > > If ((mp = rte_mempool_lookup(name)) != NULL { > > char ring_name[RTE_RING_NAMESIZE]; > > /* save mp ring name. */ > memcpy(ring_name, mp->ring->name, sizeof ring_name); > > /* reset the ring. */ > rte_ring_init(mp->ring, ring_name, rte_align32pow2(mp->size+1), > mp->ring->flags); > > /*repopulate mempool and reinit all its elements. */ > mempool_populate(mp, mp->size, 1, rte_pktmbuf_init, NULL); > > /* reset all lcore caches. */ > memset(mp->local_cache, 0, sizeof(local_cahce)); > > /* reset statistics if needed. */ > } else { > /* create new mempool. */ > } > > Ideally such function should be in the librte_mempool of course, but if > you are in a hurry - you probably can give it a try. > > Note that I assume that no other process, except failed/restarting > secondary are using this mempool. > If primary or some other secondary do, then first you need to stop them > using this mempool and wait till they finish all their packet processing > activity. > > Konstantin > > > Best Regards, > > Mahdi. > > > > > > On Thu, Jul 24, 2014 at 9:48 AM, Mahdi Dashtbozorgi > > wrote: > > > > > Hi Bruce, > > > > > > Thank you for the response. That's a great Idea! > > > But I do not understand the last four parameters of this function. > (vaddr, > > > paddr, pg_num, pg_shift) > > > I guess vaddr is the virtual address of the previously allocated > mempool, > > > paddr is calculated using function call rte_mem_virt2phy(vaddr), am I > > > right? what about pg_num and pg_shift? how can I pass them correctly? > > > > > > Best Regards, > > > Mahdi. > > > > > > > > > On Wed, Jul 23, 2014 at 11:09 PM, Richardson, Bruce < > > > bruce.richardson@intel.com> wrote: > > > > > >> Rather than freeing the previously allocated memzone, could you not > just > > >> re-initialize the mempool using something like > rte_mempool_xmem_create? > > >> > > >> > -----Original Message----- > > >> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Mahdi > Dashtbozorgi > > >> > Sent: Wednesday, July 23, 2014 2:05 AM > > >> > To: dev@dpdk.org > > >> > Subject: Re: [dpdk-dev] free a memzone > > >> > > > >> > Hi guys, > > >> > > > >> > Is there any suggestion to free the previously allocated memzone? > > >> > I really need help in this issue. > > >> > Any help is appreciated. > > >> > > > >> > Best Regards, > > >> > Mahdi. > > >> > > > >> > > > >> > > > >> > On Tue, Jul 22, 2014 at 4:03 PM, Mahdi Dashtbozorgi < > mdasht@gmail.com> > > >> > wrote: > > >> > > > >> > > Hi, > > >> > > > > >> > > I have two processes, which uses DPDK multi-process feature to > > >> communicate. > > >> > > Master process captures packets from NIC and put them to a ring > > >> buffer, > > >> > > which is shared between master and slave process. > > >> > > The slave process looks up the shared ring buffer using > > >> rte_ring_lookup > > >> > > function and reads the packets. > > >> > > The slave process needs a memory pool, too. Therefore, it creates > a > > >> > > mempool using rte_mempool_create. But If the slave process crashes > > >> during > > >> > > its processing and runs again, rte_mempool_create function fails > and > > >> tells > > >> > > that there is a memory zone with that name. > > >> > > If I use rte_mempool_lookup in this case, the memory pool is not a > > >> clean > > >> > > memory pool. Because the previous run of slave process did not > > >> terminate > > >> > > gracefully and did not return all the objects to the pool. > > >> > > Is there any function to free an existing memory zone, which I > call > > >> before > > >> > > rte_mempool_create to ensure that previous memory pool does not > exists > > >> > > anymore? > > >> > > > > >> > > Best Regards, > > >> > > Mahdi. > > >> > > > > >> > > > > > > > >