On Tue, 25 Jun 2019 18:06:19 +0300
Ilias Apalodimas <ilias.apalodi...@linaro.org> wrote:

> @@ -609,6 +639,9 @@ static bool netsec_clean_tx_dring(struct netsec_priv 
> *priv)
>       int tail = dring->tail;
>       int cnt = 0;
>  
> +     if (dring->is_xdp)
> +             spin_lock(&dring->lock);
> +
>       pkts = 0;
>       bytes = 0;
>       entry = dring->vaddr + DESC_SZ * tail;
> @@ -622,16 +655,24 @@ static bool netsec_clean_tx_dring(struct netsec_priv 
> *priv)
>               eop = (entry->attr >> NETSEC_TX_LAST) & 1;
>               dma_rmb();
>  
> -             dma_unmap_single(priv->dev, desc->dma_addr, desc->len,
> -                              DMA_TO_DEVICE);
> -             if (eop) {
> -                     pkts++;
> +             if (!eop)
> +                     goto next;
> +
> +             if (desc->buf_type == TYPE_NETSEC_SKB) {
> +                     dma_unmap_single(priv->dev, desc->dma_addr, desc->len,
> +                                      DMA_TO_DEVICE);

I don't think this is correct.  If I read the code correctly, you will
miss the DMA unmap for !eop packets.

>                       bytes += desc->skb->len;
>                       dev_kfree_skb(desc->skb);
> +             } else {
> +                     if (desc->buf_type == TYPE_NETSEC_XDP_NDO)
> +                             dma_unmap_single(priv->dev, desc->dma_addr,
> +                                              desc->len, DMA_TO_DEVICE);
> +                     xdp_return_frame(desc->xdpf);
>               }
>               /* clean up so netsec_uninit_pkt_dring() won't free the skb
>                * again
>                */
> +next:
>               *desc = (struct netsec_desc){};
>  
>               /* entry->attr is not going to be accessed by the NIC until
> @@ -645,6 +686,8 @@ static bool netsec_clean_tx_dring(struct netsec_priv 
> *priv)
>               entry = dring->vaddr + DESC_SZ * tail;
>               cnt++;
>       }
> +     if (dring->is_xdp)
> +             spin_unlock(&dring->lock);
>  
>       if (!cnt)
>               return false;



-- 
Best regards,
  Jesper Dangaard Brouer
  MSc.CS, Principal Kernel Engineer at Red Hat
  LinkedIn: http://www.linkedin.com/in/brouer

Reply via email to