Skip to content

Commit

Permalink
net/core: Enable socket busy polling on -RT
Browse files Browse the repository at this point in the history
Busy polling is currently not allowed on PREEMPT_RT, because it disables
preemption while invoking the NAPI callback. It is not possible to acquire
sleeping locks with disabled preemption. For details see commit
20ab39d ("net/core: disable NET_RX_BUSY_POLL on PREEMPT_RT").

However, strict cyclic and/or low latency network applications may prefer busy
polling e.g., using AF_XDP instead of interrupt driven communication.

The preempt_disable() is used in order to prevent the poll_owner and NAPI owner
to be preempted while owning the resource to ensure progress. Netpoll performs
busy polling in order to acquire the lock. NAPI is locked by setting the
NAPIF_STATE_SCHED flag. There is no busy polling if the flag is set and the
"owner" is preempted. Worst case is that the task owning NAPI gets preempted and
NAPI processing stalls.  This is can be prevented by properly prioritising the
tasks within the system.

Allow RX_BUSY_POLL on PREEMPT_RT if NETPOLL is disabled. Don't disable
preemption on PREEMPT_RT within the busy poll loop.

Tested on x86 hardware with v6.1-RT and v6.3-RT on Intel i225 (igc) with
AF_XDP/ZC sockets configured to run in busy polling mode.

Suggested-by: Sebastian Andrzej Siewior <[email protected]>
Signed-off-by: Kurt Kanzenbach <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
shifty91 authored and davem330 committed May 26, 2023
1 parent d6f1e0b commit c857946
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 4 deletions.
2 changes: 1 addition & 1 deletion net/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,7 @@ config CGROUP_NET_CLASSID

config NET_RX_BUSY_POLL
bool
default y if !PREEMPT_RT
default y if !PREEMPT_RT || (PREEMPT_RT && !NETCONSOLE)

config BQL
bool
Expand Down
9 changes: 6 additions & 3 deletions net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -6197,7 +6197,8 @@ void napi_busy_loop(unsigned int napi_id,
if (!napi)
goto out;

preempt_disable();
if (!IS_ENABLED(CONFIG_PREEMPT_RT))
preempt_disable();
for (;;) {
int work = 0;

Expand Down Expand Up @@ -6239,7 +6240,8 @@ void napi_busy_loop(unsigned int napi_id,
if (unlikely(need_resched())) {
if (napi_poll)
busy_poll_stop(napi, have_poll_lock, prefer_busy_poll, budget);
preempt_enable();
if (!IS_ENABLED(CONFIG_PREEMPT_RT))
preempt_enable();
rcu_read_unlock();
cond_resched();
if (loop_end(loop_end_arg, start_time))
Expand All @@ -6250,7 +6252,8 @@ void napi_busy_loop(unsigned int napi_id,
}
if (napi_poll)
busy_poll_stop(napi, have_poll_lock, prefer_busy_poll, budget);
preempt_enable();
if (!IS_ENABLED(CONFIG_PREEMPT_RT))
preempt_enable();
out:
rcu_read_unlock();
}
Expand Down

0 comments on commit c857946

Please sign in to comment.