diff options
author | Felix Fietkau <nbd@nbd.name> | 2023-02-13 11:46:44 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2023-02-13 11:48:55 +0100 |
commit | 1352e5da8dd722be9fdb3c8f5d616a553d529831 (patch) | |
tree | 3614ee24d858f56f8b777b04311f01dafb0c5534 /target/linux/generic/backport-5.10 | |
parent | ec33a6ca2cd16e92d2a544f38704405c043c822d (diff) | |
download | upstream-1352e5da8dd722be9fdb3c8f5d616a553d529831.tar.gz upstream-1352e5da8dd722be9fdb3c8f5d616a553d529831.tar.bz2 upstream-1352e5da8dd722be9fdb3c8f5d616a553d529831.zip |
kernel: add missing optimization for page pool
Improves performance in combination with threaded NAPI
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'target/linux/generic/backport-5.10')
-rw-r--r-- | target/linux/generic/backport-5.10/631-v6.3-net-page_pool-use-in_softirq-instead.patch | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/target/linux/generic/backport-5.10/631-v6.3-net-page_pool-use-in_softirq-instead.patch b/target/linux/generic/backport-5.10/631-v6.3-net-page_pool-use-in_softirq-instead.patch new file mode 100644 index 0000000000..e0d5b2451b --- /dev/null +++ b/target/linux/generic/backport-5.10/631-v6.3-net-page_pool-use-in_softirq-instead.patch @@ -0,0 +1,56 @@ +From: Qingfang DENG <qingfang.deng@siflower.com.cn> +Date: Fri, 3 Feb 2023 09:16:11 +0800 +Subject: [PATCH] net: page_pool: use in_softirq() instead + +We use BH context only for synchronization, so we don't care if it's +actually serving softirq or not. + +As a side node, in case of threaded NAPI, in_serving_softirq() will +return false because it's in process context with BH off, making +page_pool_recycle_in_cache() unreachable. + +Signed-off-by: Qingfang DENG <qingfang.deng@siflower.com.cn> +--- + +--- a/include/net/page_pool.h ++++ b/include/net/page_pool.h +@@ -295,7 +295,7 @@ static inline void page_pool_nid_changed + static inline void page_pool_ring_lock(struct page_pool *pool) + __acquires(&pool->ring.producer_lock) + { +- if (in_serving_softirq()) ++ if (in_softirq()) + spin_lock(&pool->ring.producer_lock); + else + spin_lock_bh(&pool->ring.producer_lock); +@@ -304,7 +304,7 @@ static inline void page_pool_ring_lock(s + static inline void page_pool_ring_unlock(struct page_pool *pool) + __releases(&pool->ring.producer_lock) + { +- if (in_serving_softirq()) ++ if (in_softirq()) + spin_unlock(&pool->ring.producer_lock); + else + spin_unlock_bh(&pool->ring.producer_lock); +--- a/net/core/page_pool.c ++++ b/net/core/page_pool.c +@@ -338,8 +338,8 @@ static void page_pool_return_page(struct + static bool page_pool_recycle_in_ring(struct page_pool *pool, struct page *page) + { + int ret; +- /* BH protection not needed if current is serving softirq */ +- if (in_serving_softirq()) ++ /* BH protection not needed if current is softirq */ ++ if (in_softirq()) + ret = ptr_ring_produce(&pool->ring, page); + else + ret = ptr_ring_produce_bh(&pool->ring, page); +@@ -397,7 +397,7 @@ __page_pool_put_page(struct page_pool *p + page_pool_dma_sync_for_device(pool, page, + dma_sync_size); + +- if (allow_direct && in_serving_softirq() && ++ if (allow_direct && in_softirq() && + page_pool_recycle_in_cache(page, pool)) + return NULL; + |