From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id 0AD765926 for ; Mon, 28 Jul 2014 13:55:23 +0200 (CEST) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga103.fm.intel.com with ESMTP; 28 Jul 2014 04:50:21 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.01,748,1400050800"; d="scan'208";a="568344625" Received: from irsmsx101.ger.corp.intel.com ([163.33.3.153]) by fmsmga001.fm.intel.com with ESMTP; 28 Jul 2014 04:57:07 -0700 Received: from irsmsx105.ger.corp.intel.com ([169.254.7.65]) by IRSMSX101.ger.corp.intel.com ([169.254.1.13]) with mapi id 14.03.0123.003; Mon, 28 Jul 2014 12:57:04 +0100 From: "Ananyev, Konstantin" To: Mahdi Dashtbozorgi , "dev@dpdk.org" Thread-Topic: [dpdk-dev] free a memzone Thread-Index: AQHPpaDxjio4UdMBWUOXAJwutZCpGJutTjyAgACgqgCAAMPKSYAENpcQ Date: Mon, 28 Jul 2014 11:57:04 +0000 Message-ID: <2601191342CEEE43887BDE71AB977258213440D1@IRSMSX105.ger.corp.intel.com> References: <59AF69C657FD0841A61C55336867B5B0343B1714@IRSMSX103.ger.corp.intel.com> In-Reply-To: Accept-Language: en-IE, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [163.33.239.182] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 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: Mon, 28 Jul 2014 11:55:24 -0000 Hi Mahdi, > -----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 >=20 > Hi Bruce, >=20 > 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 alread= y physically continuos. So in your case pg_num =3D MEMPOOL_PG_NUM_DEFAULT, pg_shift =3D 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 alloca= ted * together with the mempool header, or an externally provided memory buffe= r * 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 memp= ool's metadata, etc. The only difference - it can use externally allocated memory to store mempo= ol elements. As I understand what you need is sort of mempool_reset(): a function that w= ould 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 s= hould do (note that I didn't run or even build it): If ((mp =3D rte_mempool_lookup(name)) !=3D NULL { =20 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 secondar= y are using this mempool. If primary or some other secondary do, then first you need to stop them usi= ng this mempool and wait till they finish all their packet processing activ= ity. Konstantin > Best Regards, > Mahdi. >=20 >=20 > On Thu, Jul 24, 2014 at 9:48 AM, Mahdi Dashtbozorgi > wrote: >=20 > > Hi Bruce, > > > > Thank you for the response. That's a great Idea! > > But I do not understand the last four parameters of this function. (vad= dr, > > paddr, pg_num, pg_shift) > > I guess vaddr is the virtual address of the previously allocated mempoo= l, > > 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 ju= st > >> re-initialize the mempool using something like rte_mempool_xmem_create= ? > >> > >> > -----Original Message----- > >> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Mahdi Dashtbozo= rgi > >> > 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 > >> > 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 a= nd > >> 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 cal= l > >> before > >> > > rte_mempool_create to ensure that previous memory pool does not ex= ists > >> > > anymore? > >> > > > >> > > Best Regards, > >> > > Mahdi. > >> > > > >> > > > >