On 5/31/2021 1:09 PM, wangyunjian wrote: > From: Yunjian Wang <wangyunj...@huawei.com> > > In kni_allocate_mbufs(), we alloc mbuf for alloc_q as this code. > allocq_free = (kni->alloc_q->read - kni->alloc_q->write - 1) \ > & (MAX_MBUF_BURST_NUM - 1); > The value of allocq_free maybe zero (e.g 32 & (32 - 1) = 0), and > it will not fill the alloc_q. When the alloc_q's free count is > zero, it will drop the packet in kernel kni. >
nack Both 'read' & 'write' pointers can be max 'len-1', so 'read - write - 1' can't be 'len'. For above example first part can't be '32'. But if you are observing a problem, can you please describe it a little more, it may be because of something else. > In this patch, we set the allocq_free as the min between > MAX_MBUF_BURST_NUM and the free count of the alloc_q. > > Signed-off-by: Cheng Liu <liuchen...@huawei.com> > Signed-off-by: Yunjian Wang <wangyunj...@huawei.com> > --- > lib/kni/rte_kni.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/lib/kni/rte_kni.c b/lib/kni/rte_kni.c > index 9dae6a8d7c..20d8f20cef 100644 > --- a/lib/kni/rte_kni.c > +++ b/lib/kni/rte_kni.c > @@ -677,8 +677,9 @@ kni_allocate_mbufs(struct rte_kni *kni) > return; > } > > - allocq_free = (kni->alloc_q->read - kni->alloc_q->write - 1) > - & (MAX_MBUF_BURST_NUM - 1); > + allocq_free = kni_fifo_free_count(kni->alloc_q); > + allocq_free = (allocq_free > MAX_MBUF_BURST_NUM) ? > + MAX_MBUF_BURST_NUM : allocq_free; > for (i = 0; i < allocq_free; i++) { > pkts[i] = rte_pktmbuf_alloc(kni->pktmbuf_pool); > if (unlikely(pkts[i] == NULL)) { >