DPDK patches and discussions
 help / color / mirror / Atom feed
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 11:57:04 +0000	[thread overview]
Message-ID: <2601191342CEEE43887BDE71AB977258213440D1@IRSMSX105.ger.corp.intel.com> (raw)
In-Reply-To: <CAB5=vGaWt3=-CnovCgmSCC9V5BpGmq0HqeOrW1fGQcmQK5CHnQ@mail.gmail.com>

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
> 
> 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.
> >> > >
> >>
> >
> >

  reply	other threads:[~2014-07-28 11:55 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 [this message]
2014-07-28 12:53           ` Mahdi Dashtbozorgi
2014-07-28 17:09             ` Ananyev, Konstantin
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=2601191342CEEE43887BDE71AB977258213440D1@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).