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