DPDK patches and discussions
 help / color / mirror / Atom feed
From: "Richardson, Bruce" <bruce.richardson@intel.com>
To: Helmut Sim <simhelmut@gmail.com>,
	Venkat Thummala <venkat.thummala.1978@gmail.com>
Cc: "dev@dpdk.org" <dev@dpdk.org>
Subject: Re: [dpdk-dev] using hash table in a MP environment
Date: Wed, 11 Jun 2014 15:16:14 +0000	[thread overview]
Message-ID: <59AF69C657FD0841A61C55336867B5B01AA34E87@IRSMSX103.ger.corp.intel.com> (raw)
In-Reply-To: <CAF8yGaFJPmKzdtgviZ0QRastKorUz440U3o6DfxENh=iB4op=g@mail.gmail.com>

The trouble is:
a) how do we guarantee that the function in question is present in the secondary process at all? It could be only referenced by name in the primary process and omitted by the linker in the secondary as unused, for instance.
b) how do we find out the address of the function in the secondary process if it is present?
c) updating the hash function pointer in the secondary process will overwrite the value for the primary process, thereby breaking the hash function on it.

This is a complicated problem. The only item for which we've solved this so far is for the physical NICs. What happens there is that we had to:
* split up the rte_eth_dev structure into two, to create the shared rte_eth_dev_data structure and the process local rte_eth_dev structure
* force the secondary processes to redo the exact same driver loading (now obsolete) and PCI probe scan as the primary, thereby creating the process-local matching rte_eth_dev structures in the secondary.
This works, but has itself limitations. In this case, the secondary processes have to be run using the exact same parameters for PCI devices, same -d parameters to dynamically load drivers, same -b parameters to blacklist ports, etc. etc. 

For the hash table case, I think forcing secondary processes to use the "with_hash" versions of the API is an acceptable workaround, given the difficulties of making it work transparently in secondary processes. [The workaround may ever perform slightly better as the calls to the hash calculation are explicit and can be inlined by the compiler, saving the cost of an indirect function call per packet.]

/Bruce

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Helmut Sim
> Sent: Tuesday, June 10, 2014 10:24 PM
> To: Venkat Thummala
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] using hash table in a MP environment
> 
> one more simple way would be to assign the desired hash function to the
> hash_func in the rte_hash structure returned by rte_hash_find_existing call
> at the secondary initialization phase. that way there is no difference
> between a primary or a secondary process.
> 
> Regards,
> 
> 
> 
> On Tue, Jun 10, 2014 at 3:25 PM, Venkat Thummala <
> venkat.thummala.1978@gmail.com> wrote:
> 
> > Hi Shirley,
> >
> > Please refer the section 20.3 [Multi-Process Limitations] in DPDK
> > Programmers Guide.
> >
> > The use of function pointers between multiple processes running based of
> > different
> > compiled binaries is not supported, since the location of a given function
> > in one
> > process may be different to its location in a second. This prevents the
> > librte_hash library from behaving properly as in a multi-threaded instance,
> > since it uses a pointer to the hash function internally.
> > To work around this issue, it is recommended that multi-process
> > applications
> > perform the hash calculations by directly calling the hashing function from
> > the code
> > and then using the rte_hash_add_with_hash()/
> > rte_hash_lookup_with_hash() functions instead of the functions which do the
> > hashing internally, such as rte_hash_add()/rte_hash_lookup()
> >
> > Thanks
> > Venkat
> >
> >
> > On 10 June 2014 17:05, Neil Horman <nhorman@tuxdriver.com> wrote:
> >
> > > On Tue, Jun 10, 2014 at 11:02:03AM +0300, Uri Sidler wrote:
> > > > Hi,
> > > > I am currently using a hash table in a multi-process environment.
> > > > the master process creates the hash table which is later used by other
> > > > secondary processes.
> > > > but the secondary processes fail to use the hash table since the hash
> > > > function address actually points to a different fucntion. (this makes
> > > sense
> > > > since the address of the hash function is in fact different per
> > process).
> > > > How can I solve this issue?
> > > >
> > > > Thanks,
> > > > Shirley.
> > > >
> > >
> > > Use shared memory.  see shmget
> > >
> > > Neil
> > >
> > >
> >

      reply	other threads:[~2014-06-11 15:16 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-10  8:02 Uri Sidler
2014-06-10 11:35 ` Neil Horman
2014-06-10 12:25   ` Venkat Thummala
2014-06-11  5:23     ` Helmut Sim
2014-06-11 15:16       ` Richardson, Bruce [this message]

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=59AF69C657FD0841A61C55336867B5B01AA34E87@IRSMSX103.ger.corp.intel.com \
    --to=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    --cc=simhelmut@gmail.com \
    --cc=venkat.thummala.1978@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).