On 9/23/2019 3:41 PM, Wiles, Keith wrote:
> 
> 
>> On Sep 23, 2019, at 8:22 AM, Smoczynski, MarcinX 
>> <marcinx.smoczyn...@intel.com> wrote:
>>
>> When OS sends more packets than are being read with a single
>> 'rte_eth_rx_burst' call, rx packets are getting stucked in the tap pmd
>> and are unable to receive, because trigger_seen is getting updated
>> and consecutive calls are not getting any packets.
>>
>> Do not update trigger_seen unless less than a max number of packets were
>> received allowing next call to receive the rest.
>>
>> Remove unnecessary compiler barrier.
>>
>> Fixes: a0d8e807d9 ("net/tap: add Rx trigger")
>> Cc: sta...@dpdk.org
>>
>> Tested-by: Mariusz Drost <mariuszx.dr...@intel.com>
>> Tested-by: Konstantin Ananyev <konstantin.anan...@intel.com>
>> Signed-off-by: Marcin Smoczynski <marcinx.smoczyn...@intel.com>
>> ---
>> drivers/net/tap/rte_eth_tap.c | 7 ++++---
>> 1 file changed, 4 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
>> index 64bd04911..9c3adb832 100644
>> --- a/drivers/net/tap/rte_eth_tap.c
>> +++ b/drivers/net/tap/rte_eth_tap.c
>> @@ -353,10 +353,8 @@ pmd_rx_burst(void *queue, struct rte_mbuf **bufs, 
>> uint16_t nb_pkts)
>>
>>      if (trigger == rxq->trigger_seen)
>>              return 0;
>> -    if (trigger)
>> -            rxq->trigger_seen = trigger;
>> +
>>      process_private = rte_eth_devices[rxq->in_port].process_private;
>> -    rte_compiler_barrier();
>>      for (num_rx = 0; num_rx < nb_pkts; ) {
>>              struct rte_mbuf *mbuf = rxq->pool;
>>              struct rte_mbuf *seg = NULL;
>> @@ -433,6 +431,9 @@ pmd_rx_burst(void *queue, struct rte_mbuf **bufs, 
>> uint16_t nb_pkts)
>>      rxq->stats.ipackets += num_rx;
>>      rxq->stats.ibytes += num_rx_bytes;
>>
>> +    if (trigger && num_rx < nb_pkts)
>> +            rxq->trigger_seen = trigger;
>> +
>>      return num_rx;
> 
> Looks reasonable to me. I was looking at the code for this patch and noticed 
> what I believe is a bit odd.
> 
> The line around 1352 does set req->trigger_seen = 1;, but the tap_trigger 
> global variable is always set to tap_trigger = (tap_trigger + 1) | 
> 0x80000000; in the signal handler.
> Just seems the line around 1352 should be set to at least 0x80000001 to begin 
> with just to be constant. Not for this patch and maybe it does not matter in 
> the long run.
> 
> 
> Reviewed-by: Keith Wiles <keith.wi...@intel.com>

Applied to dpdk-next-net/master, thanks.

Reply via email to