On Mon, 20 May 2024 18:52:27 +0100
Ferruh Yigit <ferruh.yi...@amd.com> wrote:

> On 5/2/2024 10:31 PM, Stephen Hemminger wrote:
> > If tap device in kernel returns EAGAIN that means it is full.
> > That is not an error.
> > 
> > Signed-off-by: Stephen Hemminger <step...@networkplumber.org>
> > ---
> >  drivers/net/tap/rte_eth_tap.c | 13 ++++++++-----
> >  1 file changed, 8 insertions(+), 5 deletions(-)
> > 
> > diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
> > index 2484a82ccb..485bd35912 100644
> > --- a/drivers/net/tap/rte_eth_tap.c
> > +++ b/drivers/net/tap/rte_eth_tap.c
> > @@ -542,7 +542,6 @@ tap_write_mbufs(struct tx_queue *txq, uint16_t 
> > num_mbufs,
> >             struct rte_mbuf *seg = mbuf;
> >             uint64_t l4_ol_flags;
> >             int proto;
> > -           int n;
> >             int j;
> >             int k; /* current index in iovecs for copying segments */
> >  
> > @@ -647,14 +646,18 @@ tap_write_mbufs(struct tx_queue *txq, uint16_t 
> > num_mbufs,
> >             }
> >  
> >             /* copy the tx frame data */
> > -           n = writev(process_private->fds[txq->queue_id], iovecs, k);
> > -           if (n <= 0)
> > -                   return -1;
> > +           if (unlikely(writev(process_private->fds[txq->queue_id], 
> > iovecs, k) < 0)) {
> > +                   TAP_LOG(DEBUG, "writev (qid=%u fd=%d) %s",
> > +                           txq->queue_id, 
> > process_private->fds[txq->queue_id],
> > +                           strerror(errno));
> >  
> 
> Do we really want logging in datapath?
> 
> > +                   return (errno == EAGAIN) ? 0 : -1;
> >  
> 
> Nack.
> 
> Returning '0' will cause 'pmd_tx_burst()' to continue and increase
> 'num_tx', this will mislead as packet sent successfully.
> 
> We should have three return values from 'tap_write_mbufs()':
> <0 -> Error, 'pmd_tx_burst()' should break, stats.errors updated.
>  0 ->  'pmd_tx_burst()' should break, valid num_tx returned
> >0 -> 'pmd_tx_burst()' work as it is.  
> 
> > +           }
> >  
> >             (*num_packets)++;
> >             (*num_tx_bytes) += rte_pktmbuf_pkt_len(mbuf);
> >     }
> > -   return 0;
> > +
> > +   return 1;
> >   
> 
> Why '1', wouldn't it be better to return number of packets written
> successfully.
> 


Decided to drop this patch. Doing GSO inside the TAP device is the
wrong place to do it. Kernel already has API to do GSO and checksum
offload and it will be simpler and faster to use that. When TAP
device is updated not to do the GSO here, this code goes away
and handling the full condition properly gets much easier.

When TAP is doing GSO there are lots of corner cases where a expanded
GSO packet could get only partially sent.

Reply via email to