Dear DPDK experts.

Thank you very much for your excellent efforts and contributions.

I have a question about store_return() in 
~/dpdk/lib/librte_distributor/rte_distributor.c

The store_return() function adds a oldbuf packet to d->returns.mbuf[] queue.

If the queue is full and the oldbuf packet is NULL, the queue seems to lost a 
packet in the queue without modifying ret_start/ret_count values.

Is the last position of the queue always empty?

Would you check it? 


#define RTE_DISTRIB_MAX_RETURNS 128
#define RTE_DISTRIB_RETURNS_MASK (RTE_DISTRIB_MAX_RETURNS - 1)

/* stores a packet returned from a worker inside the returns array */
static inline void
store_return(uintptr_t oldbuf, struct rte_distributor *d,
                unsigned *ret_start, unsigned *ret_count)
{
        /* store returns in a circular buffer - code is branch-free. buffer ?? 
oldbuf? ??? */
        d->returns.mbufs[(*ret_start + *ret_count) & 
RTE_DISTRIB_RETURNS_MASK]
                        = (void *)oldbuf;
        *ret_start += (*ret_count == RTE_DISTRIB_RETURNS_MASK) & !!(oldbuf);
        *ret_count += (*ret_count != RTE_DISTRIB_RETURNS_MASK) & !!(oldbuf);
}

If d->returns.mbufs[] queue is full, oldbuf replaces the first cell of the 
queue (new packet overwrites the last packet in the queue).

ret_start is preserved if the queue is not full (count!= 
MAX_VALUE(RTE_DISTRIB_RETURNS_MASK))
if ret_start is MAX value and oldbuf is not NULL, ret_start is incremented by 1.

ret_count is incremented by 1 if it is not MAX value and oldbuf is not NULL).
if ret_count is MAX value, ret_count is preserved.

The mbufs queue is written by oldbuf(NULL) even though when the queue is full 
and the oldbuf packet is NULL (no packet insertion). 
It may lost a cell in the queue.
If the last position of the queue is always empty, it may not be a problem.

Would you check it?

Thank you very much.

Sincerely Yours,

Ick-Sung Choi.

Reply via email to