On Wed, Jun 27, 2018 at 7:02 AM, Magnus Karlsson <magnus.karls...@intel.com> wrote: > The code in xskq_produce_addr erroneously checked if there > was up to LAZY_UPDATE_THRESHOLD amount of space in the completion > queue. It only needs to check if there is one slot left in the > queue. This bug could under some circumstances lead to a WARN_ON_ONCE > being triggered and the completion message to user space being lost. > > Fixes: 35fcde7f8deb ("xsk: support for Tx") > Signed-off-by: Magnus Karlsson <magnus.karls...@intel.com> > Reported-by: Pavel Odintsov <pa...@fastnetmon.com>
Acked-by: Song Liu <songliubrav...@fb.com> > --- > net/xdp/xsk_queue.h | 9 ++------- > 1 file changed, 2 insertions(+), 7 deletions(-) > > diff --git a/net/xdp/xsk_queue.h b/net/xdp/xsk_queue.h > index ef6a6f0ec949..52ecaf770642 100644 > --- a/net/xdp/xsk_queue.h > +++ b/net/xdp/xsk_queue.h > @@ -62,14 +62,9 @@ static inline u32 xskq_nb_avail(struct xsk_queue *q, u32 > dcnt) > return (entries > dcnt) ? dcnt : entries; > } > > -static inline u32 xskq_nb_free_lazy(struct xsk_queue *q, u32 producer) > -{ > - return q->nentries - (producer - q->cons_tail); > -} > - > static inline u32 xskq_nb_free(struct xsk_queue *q, u32 producer, u32 dcnt) > { > - u32 free_entries = xskq_nb_free_lazy(q, producer); > + u32 free_entries = q->nentries - (producer - q->cons_tail); > > if (free_entries >= dcnt) > return free_entries; > @@ -129,7 +124,7 @@ static inline int xskq_produce_addr(struct xsk_queue *q, > u64 addr) > { > struct xdp_umem_ring *ring = (struct xdp_umem_ring *)q->ring; > > - if (xskq_nb_free(q, q->prod_tail, LAZY_UPDATE_THRESHOLD) == 0) > + if (xskq_nb_free(q, q->prod_tail, 1) == 0) > return -ENOSPC; > > ring->desc[q->prod_tail++ & q->ring_mask] = addr; > -- > 2.7.4 >