@@ -47,6 +47,10 @@ void napi_busy_loop(unsigned int napi_id,
bool (*loop_end)(void *, unsigned long),
void *loop_end_arg, bool prefer_busy_poll, u16 budget);
+void napi_busy_loop_rcu(unsigned int napi_id,
+ bool (*loop_end)(void *, unsigned long),
+ void *loop_end_arg, bool prefer_busy_poll, u16 budget);
+
#else /* CONFIG_NET_RX_BUSY_POLL */
static inline unsigned long net_busy_loop_on(void)
{
@@ -6260,6 +6260,17 @@ void __napi_busy_loop(unsigned int napi_id,
rcu_read_unlock();
}
+/* Warning: can exit without calling need_resched(). */
+void napi_busy_loop_rcu(unsigned int napi_id,
+ bool (*loop_end)(void *, unsigned long),
+ void *loop_end_arg, bool prefer_busy_poll, u16 budget)
+{
+ WARN_ON_ONCE(!rcu_read_lock_held());
+
+ __napi_busy_loop(napi_id, loop_end, loop_end_arg, prefer_busy_poll,
+ budget, true);
+}
+
void napi_busy_loop(unsigned int napi_id,
bool (*loop_end)(void *, unsigned long),
void *loop_end_arg, bool prefer_busy_poll, u16 budget)
This adds the napi_busy_loop_rcu() function. This function assumes that the calling function is already holding the rcu read lock and napi_busy_loop() does not need to take the rcu read lock. Signed-off-by: Stefan Roesch <shr@devkernel.io> --- include/net/busy_poll.h | 4 ++++ net/core/dev.c | 11 +++++++++++ 2 files changed, 15 insertions(+)