--- a/net/core/page_pool.c
+++ b/net/core/page_pool.c
-@@ -36,6 +36,12 @@
+@@ -59,6 +59,12 @@ static void page_pool_producer_unlock(st
this_cpu_inc(s->__stat); \
} while (0)
bool page_pool_get_stats(struct page_pool *pool,
struct page_pool_stats *stats)
{
-@@ -63,6 +69,7 @@ EXPORT_SYMBOL(page_pool_get_stats);
+@@ -86,6 +92,7 @@ EXPORT_SYMBOL(page_pool_get_stats);
#else
#define alloc_stat_inc(pool, __stat)
#define recycle_stat_inc(pool, __stat)
#endif
static int page_pool_init(struct page_pool *pool,
-@@ -569,9 +576,13 @@ void page_pool_put_page_bulk(struct page
+@@ -593,9 +600,13 @@ void page_pool_put_page_bulk(struct page
/* Bulk producer into ptr_ring page_pool cache */
- page_pool_ring_lock(pool);
+ in_softirq = page_pool_producer_lock(pool);
for (i = 0; i < bulk_len; i++) {
- if (__ptr_ring_produce(&pool->ring, data[i]))
- break; /* ring full */
+ }
}
+ recycle_stat_add(pool, ring, i);
- page_pool_ring_unlock(pool);
+ page_pool_producer_unlock(pool, in_softirq);
/* Hopefully all pages was return into ptr_ring */