From: "Ananyev, Konstantin" <konstantin.ananyev@intel.com>
To: Mahdi Dashtbozorgi <mdasht@gmail.com>, "dev@dpdk.org" <dev@dpdk.org>
Subject: Re: [dpdk-dev] free a memzone
Date: Mon, 28 Jul 2014 17:09:47 +0000 [thread overview]
Message-ID: <2601191342CEEE43887BDE71AB9772582134416A@IRSMSX105.ger.corp.intel.com> (raw)
In-Reply-To: <CAB5=vGaECzUnS00RBRn-aosTfsTBfv4ydZcOwPfKsx4PBzEC7A@mail.gmail.com>
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 <mdasht@gmail.com>
> 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.
> >> > >
> >>
> >
> >
next prev parent reply other threads:[~2014-07-28 17:08 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-22 11:33 Mahdi Dashtbozorgi
2014-07-23 9:04 ` Mahdi Dashtbozorgi
2014-07-23 18:39 ` Richardson, Bruce
[not found] ` <CAB5=vGY4t6nefbrJ7iaV7eNT1UdTkWOhdW4NUVdN+Dzcx__wTw@mail.gmail.com>
2014-07-24 5:19 ` Mahdi Dashtbozorgi
2014-07-28 11:57 ` Ananyev, Konstantin
2014-07-28 12:53 ` Mahdi Dashtbozorgi
2014-07-28 17:09 ` Ananyev, Konstantin [this message]
2014-07-31 14:57 ` Mahdi Dashtbozorgi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2601191342CEEE43887BDE71AB9772582134416A@IRSMSX105.ger.corp.intel.com \
--to=konstantin.ananyev@intel.com \
--cc=dev@dpdk.org \
--cc=mdasht@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).