diff --git a/net/xdp/xsk_buff_pool.c b/net/xdp/xsk_buff_pool.c index c0e0204b9630..b0f24ebd05f0 100644 --- a/net/xdp/xsk_buff_pool.c +++ b/net/xdp/xsk_buff_pool.c @@ -623,19 +623,30 @@ static u32 xp_alloc_reused(struct xsk_buff_pool *pool, struct xdp_buff **xdp, u3 return nb_entries; } +static u32 xp_alloc_slow(struct xsk_buff_pool *pool, struct xdp_buff **xdp, + u32 max) +{ + int i; + + for (i = 0; i < max; i++) { + struct xdp_buff *buff; + + buff = xp_alloc(pool); + if (unlikely(!buff)) + return i; + *xdp = buff; + xdp++; + } + + return max; +} + u32 xp_alloc_batch(struct xsk_buff_pool *pool, struct xdp_buff **xdp, u32 max) { u32 nb_entries1 = 0, nb_entries2; - if (unlikely(pool->dev && dma_dev_need_sync(pool->dev))) { - struct xdp_buff *buff; - - /* Slow path */ - buff = xp_alloc(pool); - if (buff) - *xdp = buff; - return !!buff; - } + if (unlikely(pool->dev && dma_dev_need_sync(pool->dev))) + return xp_alloc_slow(pool, xdp, max); if (unlikely(pool->free_list_cnt)) { nb_entries1 = xp_alloc_reused(pool, xdp, max);