When using nanosleep() in an userspace application we get a ratelimit warning:
NOHZ: local_softirq_pending 08
According to 481a8199142c050b72bff8a1956a49fd0a75bbe0 the problem is caused by
netif_rx() function. This patch replaces netif_rx() with netif_rx_ni() which
has to be used from process/softirq context.
Signed-off-by: Matvejchikov Ilya <redacted>
---
drivers/net/slip.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
When using nanosleep() in an userspace application we get a ratelimit warning:
NOHZ: local_softirq_pending 08
According to 481a8199142c050b72bff8a1956a49fd0a75bbe0 the problem is caused by
netif_rx() function. This patch replaces netif_rx() with netif_rx_ni() which
has to be used from process/softirq context.
Signed-off-by: Matvejchikov Ilya <redacted>
From: Oliver Hartkopp <socketcan@hartkopp.net> Date: 2011-08-09 17:08:22
Hello Ilya,
is the processing of characters in the tty input stream for line disciplines
*always* done in softirq context???
If so, i would send a patch for drivers/net/can/slcan.c too ...
Thanks,
Oliver
On 05.08.2011 21:23, Matvejchikov Ilya wrote:
quoted hunk
When using nanosleep() in an userspace application we get a ratelimit warning:
NOHZ: local_softirq_pending 08
According to 481a8199142c050b72bff8a1956a49fd0a75bbe0 the problem is caused by
netif_rx() function. This patch replaces netif_rx() with netif_rx_ni() which
has to be used from process/softirq context.
Signed-off-by: Matvejchikov Ilya <redacted>
---
drivers/net/slip.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
Oliver,
As I see it, there is the following call chain of the netif_rx_ni() in
the slip (or slcan) driver:
[flush_to_ldisc] -> [disc->ops->receive_buf] -> [slip_unesc] ->
[sl_bump] -> [netif_rx_ni]
So flush_to_ldisc() may be called:
1) From tty_flush_to_ldisc() with flush_work and as it mentioned
must not be called from IRQ context.
2) From input_available_p() which can be called from n_tty_read() or
n_tty_poll(), so it's the user's context.
2) From tty_flip_buffer_push() which schedules the flush_to_ldisc to
work or calls it directly if the tty->low_latency set.
So the only thing we must take into account that with tty->low_latency
set we can be in IRQ context when doing with netif_rx_ni(). But if we
are using netif_rx_ni() we can handle both IRQ and softirq contexts
well as if there are any softirq pending netif_rx_ni() calls
do_softirq() with preemtion disabled. Then do_softirq() checks if
there is an IRQ context and does nothing if so.
So, I think it's correct to change netif_rx() with the netif_rx_ni().
2011/8/9 Oliver Hartkopp [off-list ref]:
Hello Ilya,
is the processing of characters in the tty input stream for line disciplines
*always* done in softirq context???
If so, i would send a patch for drivers/net/can/slcan.c too ...
Thanks,
Oliver
On 05.08.2011 21:23, Matvejchikov Ilya wrote:
quoted
When using nanosleep() in an userspace application we get a ratelimit warning:
NOHZ: local_softirq_pending 08
According to 481a8199142c050b72bff8a1956a49fd0a75bbe0 the problem is caused by
netif_rx() function. This patch replaces netif_rx() with netif_rx_ni() which
has to be used from process/softirq context.
Signed-off-by: Matvejchikov Ilya <redacted>
---
drivers/net/slip.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
2) From tty_flip_buffer_push() which schedules the flush_to_ldisc to
work or calls it directly if the tty->low_latency set.
So the only thing we must take into account that with tty->low_latency
set we can be in IRQ context when doing with netif_rx_ni(). But if we
A driver is not permitted to directly call into flush_to_ldisc from an
interrupt so that case doesn't happen.
Alan
From: Oliver Hartkopp <socketcan@hartkopp.net> Date: 2011-08-10 14:33:50
On 10.08.2011 11:28, Alan Cox wrote:
quoted
2) From tty_flip_buffer_push() which schedules the flush_to_ldisc to
work or calls it directly if the tty->low_latency set.
So the only thing we must take into account that with tty->low_latency
set we can be in IRQ context when doing with netif_rx_ni(). But if we
A driver is not permitted to directly call into flush_to_ldisc from an
interrupt so that case doesn't happen.
Thanks to both of you for the explanation!
I'll send a patch for slcan.c then.
Best regards,
Oliver