DPDK patches and discussions
 help / color / mirror / Atom feed
From: Masaru Oki <m-oki@stratosphere.co.jp>
To: Bruce Richardson <bruce.richardson@intel.com>
Cc: "<dev@dpdk.org>" <dev@dpdk.org>
Subject: Re: [dpdk-dev] [PATCH] Fix librte_pmd_ring: connect primary and secondary ring with correct port.
Date: Tue, 14 Oct 2014 21:02:39 +0900	[thread overview]
Message-ID: <CAFLKUzLoudMO8HH=AMWaMxk0hGT1P681Jn8raVZc06d7dd-4cw@mail.gmail.com> (raw)
In-Reply-To: <20141014101753.GA548@BRICHA3-MOBL>

thank you for reply.

> From my reading, this is really two patches:
> 1. add in a port id to packets received from an eth_ring port
> 2. change the rte_eth_ring_create function to create two sets of rings.
> so perhaps this could be split up into two proposed patches.

yes.

> A ring or a ring-ethdev is a undirectional channel, and
> this is explicitly by design.

Hmm, I missed usage of ring-ethdev?
I want to connect bidirectional port in two DPDK program by ring-ethdev or
other pmd,

at first, I tried to connect port in 1 process.
run DPDK app with command line
--vdev eth_ring0,nodeaction=ring0:0:CREATE,nodeaction=ring0:0:ATTACH

port 0 and port 1 has created and connected (it looks like to me),
and rx and tx queue in both ports shares only one rte_ring in original code
with above command line.
received packet by ANY port if sent packet from ANY port.  so bad.

second, I tried with command line
--vdev eth_ring0,nodeaction=ring00:0:CREATE,nodeaction=ring01:0:CREATE,
nodeaction=ring01:0:ATTACH,nodeaction=ring00:0:ATTACH

It gots log by dpdk:
init (0) eth_ring0
PMD: Initializing pmd_ring for eth_ring0
PMD: Creating rings-backed ethdev on numa socket 0
EAL: memzone_reserve_aligned_thread_unsafe(): memzone
<RG_ETH_RXTX0_eth_ring0> already exists
RING: Cannot reserve memory
PMD: Creating rings-backed ethdev on numa socket 0
PMD: Creating rings-backed ethdev on numa socket 0

and created THREE ports.  also bad.

How to connected port 0 rx and port1 tx without patch?  (also port 0 tx and
port 1 rx)

by the way, I found wanted code in rte_pmd_ring.c
but it marked as deprecated (and no longer used).



2014-10-14 19:17 GMT+09:00 Bruce Richardson <bruce.richardson@intel.com>:

> On Tue, Oct 07, 2014 at 11:11:45PM +0900, Masaru OKI wrote:
> > librte_pmd_ring provides created port and attached port.
> > Packet is received from attached port if packet is sent to created port.
> > So, packet is received from created port if packet is sent to attached
> port.
> > It must be need two rings such as "create to attach" and "attach to
> create".
> > But current implementation uses only one ring for rx/tx.
> > It causes incorrect result.
> > Fixed:
> > - Make ring both rx and tx
> > - Connect created (primary) ring and attached (secondary) ring
> > - Correct m->port like librte_pmd_pcap
> >
> > Signed-off-by: Masaru OKI <m-oki@stratosphere.co.jp>
>
> From my reading, this is really two patches:
> 1. add in a port id to packets received from an eth_ring port
> 2. change the rte_eth_ring_create function to create two sets of rings.
> so perhaps this could be split up into two proposed patches.
>
> Unfortunately, while I have no issue with the first part, I disagree with
> the second part. A ring or a ring-ethdev is a undirectional channel, and
> this is explicitly by design. When you create or attach to a ring pmd
> instance (or ring ethdev), you get exactly that, an ethdev instance that
> has
> a ring, or set of rings internally. It's up to the application how to use
> those rings. If you need a bidirectional channel, you need to create two
> ring ethdevs, in exactly the same way that if you want bidirectional
> messaging between two cores using rte_rings, you need to create two rings,
> one for each direction.
>
> regards,
> /Bruce
>
> > ---
> >  lib/librte_pmd_ring/rte_eth_ring.c | 36
> +++++++++++++++++++++++++++---------
> >  1 file changed, 27 insertions(+), 9 deletions(-)
> >
> > diff --git a/lib/librte_pmd_ring/rte_eth_ring.c
> b/lib/librte_pmd_ring/rte_eth_ring.c
> > index 4f1b6ed..d926d00 100644
> > --- a/lib/librte_pmd_ring/rte_eth_ring.c
> > +++ b/lib/librte_pmd_ring/rte_eth_ring.c
> > @@ -54,6 +54,7 @@ struct ring_queue {
> >       rte_atomic64_t rx_pkts;
> >       rte_atomic64_t tx_pkts;
> >       rte_atomic64_t err_pkts;
> > +     uint8_t in_port;
> >  };
> >
> >  struct pmd_internals {
> > @@ -80,10 +81,14 @@ eth_ring_rx(void *q, struct rte_mbuf **bufs,
> uint16_t nb_bufs)
> >       struct ring_queue *r = q;
> >       const uint16_t nb_rx = (uint16_t)rte_ring_dequeue_burst(r->rng,
> >                       ptrs, nb_bufs);
> > +        uint16_t cnt;
> >       if (r->rng->flags & RING_F_SC_DEQ)
> >               r->rx_pkts.cnt += nb_rx;
> >       else
> >               rte_atomic64_add(&(r->rx_pkts), nb_rx);
> > +        for (cnt = 0; cnt < nb_rx; cnt++) {
> > +          bufs[cnt]->port = r->in_port;
> > +        }
> >       return nb_rx;
> >  }
> >
> > @@ -129,6 +134,8 @@ eth_rx_queue_setup(struct rte_eth_dev *dev,uint16_t
> rx_queue_id,
> >  {
> >       struct pmd_internals *internals = dev->data->dev_private;
> >       dev->data->rx_queues[rx_queue_id] =
> &internals->rx_ring_queues[rx_queue_id];
> > +     internals->rx_ring_queues[rx_queue_id].in_port =
> dev->data->port_id;
> > +
> >       return 0;
> >  }
> >
> > @@ -319,23 +326,34 @@ eth_dev_ring_create(const char *name, const
> unsigned numa_node,
> >       /* rx and tx are so-called from point of view of first port.
> >        * They are inverted from the point of view of second port
> >        */
> > -     struct rte_ring *rxtx[RTE_PMD_RING_MAX_RX_RINGS];
> > +     struct rte_ring *rx[RTE_PMD_RING_MAX_RX_RINGS];
> > +     struct rte_ring *tx[RTE_PMD_RING_MAX_TX_RINGS];
> >       unsigned i;
> > -     char rng_name[RTE_RING_NAMESIZE];
> > +     char rng_rxname[RTE_RING_NAMESIZE];
> > +     char rng_txname[RTE_RING_NAMESIZE];
> >       unsigned num_rings = RTE_MIN(RTE_PMD_RING_MAX_RX_RINGS,
> >                       RTE_PMD_RING_MAX_TX_RINGS);
> >
> >       for (i = 0; i < num_rings; i++) {
> > -             snprintf(rng_name, sizeof(rng_name), "ETH_RXTX%u_%s", i,
> name);
> > -             rxtx[i] = (action == DEV_CREATE) ?
> > -                             rte_ring_create(rng_name, 1024, numa_node,
> > -
>  RING_F_SP_ENQ|RING_F_SC_DEQ) :
> > -                             rte_ring_lookup(rng_name);
> > -             if (rxtx[i] == NULL)
> > +             snprintf(rng_rxname, sizeof(rng_rxname),
> > +                         "ETH_RX%u_%s", i, name);
> > +             snprintf(rng_txname, sizeof(rng_txname),
> > +                         "ETH_TX%u_%s", i, name);
> > +             rx[i] = (action == DEV_CREATE) ?
> > +                        rte_ring_create(rng_rxname, 1024, numa_node,
> > +                                        RING_F_SP_ENQ|RING_F_SC_DEQ) :
> > +                        rte_ring_lookup(rng_txname);
> > +             if (rx[i] == NULL)
> > +                     return -1;
> > +             tx[i] = (action == DEV_CREATE) ?
> > +                        rte_ring_create(rng_txname, 1024, numa_node,
> > +                                        RING_F_SP_ENQ|RING_F_SC_DEQ) :
> > +                        rte_ring_lookup(rng_rxname);
> > +             if (tx[i] == NULL)
> >                       return -1;
> >       }
> >
> > -     if (rte_eth_from_rings(name, rxtx, num_rings, rxtx, num_rings,
> numa_node))
> > +     if (rte_eth_from_rings(name, rx, num_rings, tx, num_rings,
> numa_node))
> >               return -1;
> >
> >       return 0;
> > --
> > 1.9.1
> >
>

      reply	other threads:[~2014-10-14 11:54 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-07 14:11 Masaru OKI
2014-10-14 10:17 ` Bruce Richardson
2014-10-14 12:02   ` Masaru Oki [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='CAFLKUzLoudMO8HH=AMWaMxk0hGT1P681Jn8raVZc06d7dd-4cw@mail.gmail.com' \
    --to=m-oki@stratosphere.co.jp \
    --cc=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    /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).