Hi Andrzej, On 16.02.2022 18:50, Sebastian Andrzej Siewior wrote: > I missed the obvious case where netif_ix() is invoked from hard-IRQ > context. > > Disabling bottom halves is only needed in process context. This ensures > that the code remains on the current CPU and that the soft-interrupts > are processed at local_bh_enable() time. > In hard- and soft-interrupt context this is already the case and the > soft-interrupts will be processed once the context is left (at irq-exit > time). > > Disable bottom halves if neither hard-interrupts nor soft-interrupts are > disabled. Update the kernel-doc, mention that interrupts must be enabled > if invoked from process context. > > Fixes: baebdf48c3600 ("net: dev: Makes sure netif_rx() can be invoked in any context.") > Reported-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> > Signed-off-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> > --- > Marek, does this work for you? Yes, this fixed the issue. Thanks! Tested-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> > net/core/dev.c | 11 ++++++++--- > 1 file changed, 8 insertions(+), 3 deletions(-) > > diff --git a/net/core/dev.c b/net/core/dev.c > index 909fb38159108..87729491460fc 100644 > --- a/net/core/dev.c > +++ b/net/core/dev.c > @@ -4860,7 +4860,9 @@ EXPORT_SYMBOL(__netif_rx); > * congestion control or by the protocol layers. > * The network buffer is passed via the backlog NAPI device. Modern NIC > * driver should use NAPI and GRO. > - * This function can used from any context. > + * This function can used from interrupt and from process context. The > + * caller from process context must not disable interrupts before invoking > + * this function. > * > * return values: > * NET_RX_SUCCESS (no congestion) > @@ -4870,12 +4872,15 @@ EXPORT_SYMBOL(__netif_rx); > int netif_rx(struct sk_buff *skb) > { > int ret; > + bool need_bh_off = !(hardirq_count() | softirq_count()); > > - local_bh_disable(); > + if (need_bh_off) > + local_bh_disable(); > trace_netif_rx_entry(skb); > ret = netif_rx_internal(skb); > trace_netif_rx_exit(ret); > - local_bh_enable(); > + if (need_bh_off) > + local_bh_enable(); > return ret; > } > EXPORT_SYMBOL(netif_rx); Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland