DPDK usage discussions
 help / color / mirror / Atom feed
* rte_eth_tx_burst() always returns 0 in tight loop
@ 2022-07-03 15:57 Antonio Di Bacco
  2022-07-03 20:18 ` Gábor LENCSE
  0 siblings, 1 reply; 8+ messages in thread
From: Antonio Di Bacco @ 2022-07-03 15:57 UTC (permalink / raw)
  To: users

I'm trying to send packets continuously in a  tight loop with a burst
size of 8 and packets are 9600 bytes long.
If I don't insert a delay after the rte_eth_tx_burst it always returns 0.

What's the explanation of this behaviour ?

Best regards,
Antonio.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: rte_eth_tx_burst() always returns 0 in tight loop
  2022-07-03 15:57 rte_eth_tx_burst() always returns 0 in tight loop Antonio Di Bacco
@ 2022-07-03 20:18 ` Gábor LENCSE
  2022-07-06  7:21   ` Antonio Di Bacco
  0 siblings, 1 reply; 8+ messages in thread
From: Gábor LENCSE @ 2022-07-03 20:18 UTC (permalink / raw)
  To: users

Dear Antonio,

According to my experience, the rte_eth_tx_burst() function reports the 
packets as "sent" (by a non-zero return value), when they are still in 
the transmit buffer.

(If you are interested in the details, you can see them in Section 3.6.5 
of this paper: http://www.hit.bme.hu/~lencse/publications/e104-b_2_128.pdf )

Therefore, I think that the return value of 0 may mean that 
rte_eth_tx_burst() can't even commit itself for the future delivery of 
the packets. I could only guess why. E.g. all its resources have been 
exhausted.

Best regards,

Gábor


7/3/2022 5:57 PM keltezéssel, Antonio Di Bacco írta:
> I'm trying to send packets continuously in a  tight loop with a burst
> size of 8 and packets are 9600 bytes long.
> If I don't insert a delay after the rte_eth_tx_burst it always returns 0.
>
> What's the explanation of this behaviour ?
>
> Best regards,
> Antonio.


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: rte_eth_tx_burst() always returns 0 in tight loop
  2022-07-03 20:18 ` Gábor LENCSE
@ 2022-07-06  7:21   ` Antonio Di Bacco
  2022-07-06 15:00     ` Stephen Hemminger
  2022-07-06 15:03     ` Gábor LENCSE
  0 siblings, 2 replies; 8+ messages in thread
From: Antonio Di Bacco @ 2022-07-06  7:21 UTC (permalink / raw)
  To: Gábor LENCSE; +Cc: users

I wonder why calling eth_dev_tx_burst in a tight loop doesn't allow to
write the packets into the transmit buffer. Only solution I found is
to include a small delay after the tx_burst that is less than the
estimated serialization time of the packet in order to be able to
saturate the ethernet line.

Anyway I wonder if this is the right approach.

Thx,
Antonio.

On Sun, Jul 3, 2022 at 10:19 PM Gábor LENCSE <lencse@hit.bme.hu> wrote:
>
> Dear Antonio,
>
> According to my experience, the rte_eth_tx_burst() function reports the
> packets as "sent" (by a non-zero return value), when they are still in
> the transmit buffer.
>
> (If you are interested in the details, you can see them in Section 3.6.5
> of this paper: http://www.hit.bme.hu/~lencse/publications/e104-b_2_128.pdf )
>
> Therefore, I think that the return value of 0 may mean that
> rte_eth_tx_burst() can't even commit itself for the future delivery of
> the packets. I could only guess why. E.g. all its resources have been
> exhausted.
>
> Best regards,
>
> Gábor
>
>
> 7/3/2022 5:57 PM keltezéssel, Antonio Di Bacco írta:
> > I'm trying to send packets continuously in a  tight loop with a burst
> > size of 8 and packets are 9600 bytes long.
> > If I don't insert a delay after the rte_eth_tx_burst it always returns 0.
> >
> > What's the explanation of this behaviour ?
> >
> > Best regards,
> > Antonio.
>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: rte_eth_tx_burst() always returns 0 in tight loop
  2022-07-06  7:21   ` Antonio Di Bacco
@ 2022-07-06 15:00     ` Stephen Hemminger
  2022-07-07 14:30       ` Antonio Di Bacco
  2022-07-06 15:03     ` Gábor LENCSE
  1 sibling, 1 reply; 8+ messages in thread
From: Stephen Hemminger @ 2022-07-06 15:00 UTC (permalink / raw)
  To: Antonio Di Bacco; +Cc: Gábor LENCSE, users

On Wed, 6 Jul 2022 09:21:28 +0200
Antonio Di Bacco <a.dibacco.ks@gmail.com> wrote:

> I wonder why calling eth_dev_tx_burst in a tight loop doesn't allow to
> write the packets into the transmit buffer. Only solution I found is
> to include a small delay after the tx_burst that is less than the
> estimated serialization time of the packet in order to be able to
> saturate the ethernet line.
> 
> Anyway I wonder if this is the right approach.
> 
> Thx,
> Antonio.
> 
> On Sun, Jul 3, 2022 at 10:19 PM Gábor LENCSE <lencse@hit.bme.hu> wrote:
> >
> > Dear Antonio,
> >
> > According to my experience, the rte_eth_tx_burst() function reports the
> > packets as "sent" (by a non-zero return value), when they are still in
> > the transmit buffer.
> >
> > (If you are interested in the details, you can see them in Section 3.6.5
> > of this paper: http://www.hit.bme.hu/~lencse/publications/e104-b_2_128.pdf )
> >
> > Therefore, I think that the return value of 0 may mean that
> > rte_eth_tx_burst() can't even commit itself for the future delivery of
> > the packets. I could only guess why. E.g. all its resources have been
> > exhausted.
> >
> > Best regards,
> >
> > Gábor
> >
> >
> > 7/3/2022 5:57 PM keltezéssel, Antonio Di Bacco írta:  
> > > I'm trying to send packets continuously in a  tight loop with a burst
> > > size of 8 and packets are 9600 bytes long.
> > > If I don't insert a delay after the rte_eth_tx_burst it always returns 0.
> > >
> > > What's the explanation of this behaviour ?
> > >
> > > Best regards,
> > > Antonio.  
> >  

Which driver? How did you set the tx_free threshold.
The driver will need to cleanup already transmitted packets.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: rte_eth_tx_burst() always returns 0 in tight loop
  2022-07-06  7:21   ` Antonio Di Bacco
  2022-07-06 15:00     ` Stephen Hemminger
@ 2022-07-06 15:03     ` Gábor LENCSE
  1 sibling, 0 replies; 8+ messages in thread
From: Gábor LENCSE @ 2022-07-06 15:03 UTC (permalink / raw)
  To: Antonio Di Bacco; +Cc: users

Dear Antonio,

I have not met your problem during the implementation of siitperf, 
because I always had to send the frames at a given frame rate, that is, 
I used the appropriate timing.

Could you check, how early the failure begins? I mean that does already 
the second or third call fail? Or it happens only after a few hundred 
calls?

IMHO, the latter is natural, and it means that you have exhausted some 
resources.

Best regards,

Gábor

7/6/2022 9:21 AM keltezéssel, Antonio Di Bacco írta:
> I wonder why calling eth_dev_tx_burst in a tight loop doesn't allow to
> write the packets into the transmit buffer. Only solution I found is
> to include a small delay after the tx_burst that is less than the
> estimated serialization time of the packet in order to be able to
> saturate the ethernet line.
>
> Anyway I wonder if this is the right approach.
>
> Thx,
> Antonio.
>
> On Sun, Jul 3, 2022 at 10:19 PM Gábor LENCSE <lencse@hit.bme.hu> wrote:
>> Dear Antonio,
>>
>> According to my experience, the rte_eth_tx_burst() function reports the
>> packets as "sent" (by a non-zero return value), when they are still in
>> the transmit buffer.
>>
>> (If you are interested in the details, you can see them in Section 3.6.5
>> of this paper: http://www.hit.bme.hu/~lencse/publications/e104-b_2_128.pdf )
>>
>> Therefore, I think that the return value of 0 may mean that
>> rte_eth_tx_burst() can't even commit itself for the future delivery of
>> the packets. I could only guess why. E.g. all its resources have been
>> exhausted.
>>
>> Best regards,
>>
>> Gábor
>>
>>
>> 7/3/2022 5:57 PM keltezéssel, Antonio Di Bacco írta:
>>> I'm trying to send packets continuously in a  tight loop with a burst
>>> size of 8 and packets are 9600 bytes long.
>>> If I don't insert a delay after the rte_eth_tx_burst it always returns 0.
>>>
>>> What's the explanation of this behaviour ?
>>>
>>> Best regards,
>>> Antonio.


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: rte_eth_tx_burst() always returns 0 in tight loop
  2022-07-06 15:00     ` Stephen Hemminger
@ 2022-07-07 14:30       ` Antonio Di Bacco
  2022-09-26 15:36         ` Antonio Di Bacco
  0 siblings, 1 reply; 8+ messages in thread
From: Antonio Di Bacco @ 2022-07-07 14:30 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: Gábor LENCSE, users

I have an E810-C card with  iavf-4.4.2.1  ice-1.8.8 drivers.

My tx_free_threshold is 8 together with tx_rs_thresh.

I have a tight loop sending BURSTs of 8 packets, each packet is 9014
bytes long (8 packets take 6 usecs to be serialized).
If I put the rte_delay_us_block to 7 then everything works fine, every
cycle 8 packets are transmitted.
If I lower  the rte_delay_us_block to 1 usec, then I observe that the
first FOR cycle is ok, nb_tx is 8 as expected, then, the second cycle
prints a 7 while all subsequent cycles print Z (zero packets sent). I
know that 1 usec delay is too small and I expect that no packets are
transmitted for some cycles but I don't understand why I get an nb_tx
set to 0 forever after the first two cycles.

for (;;)
{
        rte_spinlock_lock(&spinlock_conf[src_port]) ;
        const uint16_t nb_tx = rte_eth_tx_burst(src_port, 0, tx_bufs,
BURST_SIZE);
        rte_spinlock_unlock(&spinlock_conf[src_port]);

        rte_delay_us_block(7);  // tested with 1

        if (nb_tx == 0)
            printf("Z");
        else if (nb_tx < BURST_SIZE)
            printf("nb_tx %d\n", nb_tx);

        tx += nb_tx;

        if (unlikely(nb_tx < BURST_SIZE)) {
            uint16_t buf;

            for (buf = nb_tx; buf < BURST_SIZE; buf++)
                rte_pktmbuf_free(tx_bufs[buf]);
        }
}

On Wed, Jul 6, 2022 at 5:00 PM Stephen Hemminger
<stephen@networkplumber.org> wrote:
>
> On Wed, 6 Jul 2022 09:21:28 +0200
> Antonio Di Bacco <a.dibacco.ks@gmail.com> wrote:
>
> > I wonder why calling eth_dev_tx_burst in a tight loop doesn't allow to
> > write the packets into the transmit buffer. Only solution I found is
> > to include a small delay after the tx_burst that is less than the
> > estimated serialization time of the packet in order to be able to
> > saturate the ethernet line.
> >
> > Anyway I wonder if this is the right approach.
> >
> > Thx,
> > Antonio.
> >
> > On Sun, Jul 3, 2022 at 10:19 PM Gábor LENCSE <lencse@hit.bme.hu> wrote:
> > >
> > > Dear Antonio,
> > >
> > > According to my experience, the rte_eth_tx_burst() function reports the
> > > packets as "sent" (by a non-zero return value), when they are still in
> > > the transmit buffer.
> > >
> > > (If you are interested in the details, you can see them in Section 3.6.5
> > > of this paper: http://www.hit.bme.hu/~lencse/publications/e104-b_2_128.pdf )
> > >
> > > Therefore, I think that the return value of 0 may mean that
> > > rte_eth_tx_burst() can't even commit itself for the future delivery of
> > > the packets. I could only guess why. E.g. all its resources have been
> > > exhausted.
> > >
> > > Best regards,
> > >
> > > Gábor
> > >
> > >
> > > 7/3/2022 5:57 PM keltezéssel, Antonio Di Bacco írta:
> > > > I'm trying to send packets continuously in a  tight loop with a burst
> > > > size of 8 and packets are 9600 bytes long.
> > > > If I don't insert a delay after the rte_eth_tx_burst it always returns 0.
> > > >
> > > > What's the explanation of this behaviour ?
> > > >
> > > > Best regards,
> > > > Antonio.
> > >
>
> Which driver? How did you set the tx_free threshold.
> The driver will need to cleanup already transmitted packets.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: rte_eth_tx_burst() always returns 0 in tight loop
  2022-07-07 14:30       ` Antonio Di Bacco
@ 2022-09-26 15:36         ` Antonio Di Bacco
  2022-09-26 17:24           ` Stephen Hemminger
  0 siblings, 1 reply; 8+ messages in thread
From: Antonio Di Bacco @ 2022-09-26 15:36 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: Gábor LENCSE, users

Is there any way to check if a TX queue is full before transmitting
using the rte_eth_rx_burst() or should I rely on the return value of
rte_eth_tx_burst()?

On Thu, Jul 7, 2022 at 4:30 PM Antonio Di Bacco <a.dibacco.ks@gmail.com> wrote:
>
> I have an E810-C card with  iavf-4.4.2.1  ice-1.8.8 drivers.
>
> My tx_free_threshold is 8 together with tx_rs_thresh.
>
> I have a tight loop sending BURSTs of 8 packets, each packet is 9014
> bytes long (8 packets take 6 usecs to be serialized).
> If I put the rte_delay_us_block to 7 then everything works fine, every
> cycle 8 packets are transmitted.
> If I lower  the rte_delay_us_block to 1 usec, then I observe that the
> first FOR cycle is ok, nb_tx is 8 as expected, then, the second cycle
> prints a 7 while all subsequent cycles print Z (zero packets sent). I
> know that 1 usec delay is too small and I expect that no packets are
> transmitted for some cycles but I don't understand why I get an nb_tx
> set to 0 forever after the first two cycles.
>
> for (;;)
> {
>         rte_spinlock_lock(&spinlock_conf[src_port]) ;
>         const uint16_t nb_tx = rte_eth_tx_burst(src_port, 0, tx_bufs,
> BURST_SIZE);
>         rte_spinlock_unlock(&spinlock_conf[src_port]);
>
>         rte_delay_us_block(7);  // tested with 1
>
>         if (nb_tx == 0)
>             printf("Z");
>         else if (nb_tx < BURST_SIZE)
>             printf("nb_tx %d\n", nb_tx);
>
>         tx += nb_tx;
>
>         if (unlikely(nb_tx < BURST_SIZE)) {
>             uint16_t buf;
>
>             for (buf = nb_tx; buf < BURST_SIZE; buf++)
>                 rte_pktmbuf_free(tx_bufs[buf]);
>         }
> }
>
> On Wed, Jul 6, 2022 at 5:00 PM Stephen Hemminger
> <stephen@networkplumber.org> wrote:
> >
> > On Wed, 6 Jul 2022 09:21:28 +0200
> > Antonio Di Bacco <a.dibacco.ks@gmail.com> wrote:
> >
> > > I wonder why calling eth_dev_tx_burst in a tight loop doesn't allow to
> > > write the packets into the transmit buffer. Only solution I found is
> > > to include a small delay after the tx_burst that is less than the
> > > estimated serialization time of the packet in order to be able to
> > > saturate the ethernet line.
> > >
> > > Anyway I wonder if this is the right approach.
> > >
> > > Thx,
> > > Antonio.
> > >
> > > On Sun, Jul 3, 2022 at 10:19 PM Gábor LENCSE <lencse@hit.bme.hu> wrote:
> > > >
> > > > Dear Antonio,
> > > >
> > > > According to my experience, the rte_eth_tx_burst() function reports the
> > > > packets as "sent" (by a non-zero return value), when they are still in
> > > > the transmit buffer.
> > > >
> > > > (If you are interested in the details, you can see them in Section 3.6.5
> > > > of this paper: http://www.hit.bme.hu/~lencse/publications/e104-b_2_128.pdf )
> > > >
> > > > Therefore, I think that the return value of 0 may mean that
> > > > rte_eth_tx_burst() can't even commit itself for the future delivery of
> > > > the packets. I could only guess why. E.g. all its resources have been
> > > > exhausted.
> > > >
> > > > Best regards,
> > > >
> > > > Gábor
> > > >
> > > >
> > > > 7/3/2022 5:57 PM keltezéssel, Antonio Di Bacco írta:
> > > > > I'm trying to send packets continuously in a  tight loop with a burst
> > > > > size of 8 and packets are 9600 bytes long.
> > > > > If I don't insert a delay after the rte_eth_tx_burst it always returns 0.
> > > > >
> > > > > What's the explanation of this behaviour ?
> > > > >
> > > > > Best regards,
> > > > > Antonio.
> > > >
> >
> > Which driver? How did you set the tx_free threshold.
> > The driver will need to cleanup already transmitted packets.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: rte_eth_tx_burst() always returns 0 in tight loop
  2022-09-26 15:36         ` Antonio Di Bacco
@ 2022-09-26 17:24           ` Stephen Hemminger
  0 siblings, 0 replies; 8+ messages in thread
From: Stephen Hemminger @ 2022-09-26 17:24 UTC (permalink / raw)
  To: Antonio Di Bacco; +Cc: Gábor LENCSE, users

On Mon, 26 Sep 2022 17:36:06 +0200
Antonio Di Bacco <a.dibacco.ks@gmail.com> wrote:

> Is there any way to check if a TX queue is full before transmitting
> using the rte_eth_rx_burst() or should I rely on the return value of
> rte_eth_tx_burst()?

There is an API that might help rte_eth_tx_descriptor_status
but only some drivers support it. And it requires some detailed knowledge
about which descriptor is being used.


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2022-09-26 17:24 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-03 15:57 rte_eth_tx_burst() always returns 0 in tight loop Antonio Di Bacco
2022-07-03 20:18 ` Gábor LENCSE
2022-07-06  7:21   ` Antonio Di Bacco
2022-07-06 15:00     ` Stephen Hemminger
2022-07-07 14:30       ` Antonio Di Bacco
2022-09-26 15:36         ` Antonio Di Bacco
2022-09-26 17:24           ` Stephen Hemminger
2022-07-06 15:03     ` Gábor LENCSE

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