[dpdk-dev] [memnic PATCH 5/5] pmd: handle multiple segments on xmit

2014-03-27 Thread Thomas Monjalon
2014-03-26 17:48, Olivier MATZ:
> Hi Hiroshi-san,
> 
> On 03/11/2014 06:40 AM, Hiroshi Shimamoto wrote:
> > From: Hiroshi Shimamoto 
> > 
> > The current MEMNIC PMD cannot handle multiple segments.
> > 
> > Add the functionality to transmit a mbuf which has multiple segments.
> > Walk every segment in transmitting mbuf and copy the data to MEMNIC
> > packet buffer.
> > 
> > Signed-off-by: Hiroshi Shimamoto 
> > Reviewed-by: Hayato Momma 
> 
> Reviewed-by: Olivier Matz 

Applied

> By the way, a similar patch could be done for the Linux driver
> but it's another story ;)

Yes another path is welcome

-- 
Thomas


[dpdk-dev] [memnic PATCH 5/5] pmd: handle multiple segments on xmit

2014-03-26 Thread Olivier MATZ
Hi Hiroshi-san,

On 03/11/2014 06:40 AM, Hiroshi Shimamoto wrote:
> From: Hiroshi Shimamoto 
> 
> The current MEMNIC PMD cannot handle multiple segments.
> 
> Add the functionality to transmit a mbuf which has multiple segments.
> Walk every segment in transmitting mbuf and copy the data to MEMNIC
> packet buffer.
> 
> Signed-off-by: Hiroshi Shimamoto 
> Reviewed-by: Hayato Momma 

Reviewed-by: Olivier Matz 

By the way, a similar patch could be done for the Linux driver
but it's another story ;)

Regards,
Olivier



[dpdk-dev] [memnic PATCH 5/5] pmd: handle multiple segments on xmit

2014-03-11 Thread Hiroshi Shimamoto
From: Hiroshi Shimamoto 

The current MEMNIC PMD cannot handle multiple segments.

Add the functionality to transmit a mbuf which has multiple segments.
Walk every segment in transmitting mbuf and copy the data to MEMNIC
packet buffer.

Signed-off-by: Hiroshi Shimamoto 
Reviewed-by: Hayato Momma 
---
 pmd/pmd_memnic.c | 19 ++-
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/pmd/pmd_memnic.c b/pmd/pmd_memnic.c
index abfd437..4ee655d 100644
--- a/pmd/pmd_memnic.c
+++ b/pmd/pmd_memnic.c
@@ -324,9 +324,11 @@ static uint16_t memnic_xmit_pkts(void *tx_queue,
pkts = bytes = errs = 0;

for (nr = 0; nr < nb_pkts; nr++) {
-   int len = rte_pktmbuf_data_len(tx_pkts[nr]);
+   int pkt_len = rte_pktmbuf_pkt_len(tx_pkts[nr]);
+   struct rte_mbuf *sg;
+   void *ptr;

-   if (len > MEMNIC_MAX_FRAME_LEN) {
+   if (pkt_len > MEMNIC_MAX_FRAME_LEN) {
errs++;
break;
}
@@ -356,12 +358,19 @@ retry:
idx = 0;
adapter->down_idx = idx;

-   p->len = len;
+   p->len = pkt_len;

-   rte_memcpy(p->data, rte_pktmbuf_mtod(tx_pkts[nr], void *), len);
+   ptr = p->data;
+   for (sg = tx_pkts[nr]; sg; sg = sg->pkt.next) {
+   void *src = rte_pktmbuf_mtod(sg, void *);
+   int data_len = sg->pkt.data_len;
+
+   rte_memcpy(ptr, src, data_len);
+   ptr += data_len;
+   }

pkts++;
-   bytes += len;
+   bytes += pkt_len;

rte_mb();
p->status = MEMNIC_PKT_ST_FILLED;
-- 
1.8.4