* mac80211: NOHZ: local_softirq_pending 08 @ 2009-09-11 14:48 Michael Buesch 2009-09-11 14:57 ` Kalle Valo 0 siblings, 1 reply; 27+ messages in thread From: Michael Buesch @ 2009-09-11 14:48 UTC (permalink / raw) To: linux-wireless; +Cc: netdev, Kalle.Valo, Johannes Berg Hi, mac80211 (or some other part of the networking stack) triggers this warning in the NOHZ code: NOHZ: local_softirq_pending 08 08 seems to be NET_RX_SOFTIRQ. It happens, because my test driver b43 handles all RX and TX-status callbacks in process context. I guess some part of the networking stack expects RX to be in tasklet and/or softirq context. We also have a report of this warning in wl1251, so it's probably not a b43 problem. -- Greetings, Michael. ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: mac80211: NOHZ: local_softirq_pending 08 2009-09-11 14:48 mac80211: NOHZ: local_softirq_pending 08 Michael Buesch @ 2009-09-11 14:57 ` Kalle Valo 2009-09-11 15:07 ` Michael Buesch 0 siblings, 1 reply; 27+ messages in thread From: Kalle Valo @ 2009-09-11 14:57 UTC (permalink / raw) To: Michael Buesch; +Cc: linux-wireless, netdev, Johannes Berg Michael Buesch <mb@bu3sch.de> writes: > Hi, Hallo, > mac80211 (or some other part of the networking stack) triggers this > warning in the NOHZ code: NOHZ: local_softirq_pending 08 > > 08 seems to be NET_RX_SOFTIRQ. > > It happens, because my test driver b43 handles all RX and TX-status > callbacks in process context. I guess some part of the networking > stack expects RX to be in tasklet and/or softirq context. > > We also have a report of this warning in wl1251, so it's probably not > a b43 problem. Yes, I see this with wl1251. It uses workqueues everywhere. -- Kalle Valo ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: mac80211: NOHZ: local_softirq_pending 08 2009-09-11 14:57 ` Kalle Valo @ 2009-09-11 15:07 ` Michael Buesch [not found] ` <200909111707.23971.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> 0 siblings, 1 reply; 27+ messages in thread From: Michael Buesch @ 2009-09-11 15:07 UTC (permalink / raw) To: Kalle Valo; +Cc: linux-wireless, netdev, Johannes Berg, John W. Linville On Friday 11 September 2009 16:57:54 Kalle Valo wrote: > Michael Buesch <mb@bu3sch.de> writes: > > > Hi, > > Hallo, > > > mac80211 (or some other part of the networking stack) triggers this > > warning in the NOHZ code: NOHZ: local_softirq_pending 08 > > > > 08 seems to be NET_RX_SOFTIRQ. > > > > It happens, because my test driver b43 handles all RX and TX-status > > callbacks in process context. I guess some part of the networking > > stack expects RX to be in tasklet and/or softirq context. > > > > We also have a report of this warning in wl1251, so it's probably not > > a b43 problem. > > Yes, I see this with wl1251. It uses workqueues everywhere. > This patch seems to fix it. Signed-off-by: Michael Buesch <mb@bu3sch.de> Index: wireless-testing/net/mac80211/cfg.c =================================================================== --- wireless-testing.orig/net/mac80211/cfg.c 2009-08-09 18:47:11.000000000 +0200 +++ wireless-testing/net/mac80211/cfg.c 2009-09-11 16:59:12.000000000 +0200 @@ -606,7 +606,7 @@ static void ieee80211_send_layer2_update skb->dev = sta->sdata->dev; skb->protocol = eth_type_trans(skb, sta->sdata->dev); memset(skb->cb, 0, sizeof(skb->cb)); - netif_rx(skb); + ieee80211_netif_rx(skb); } static void sta_apply_parameters(struct ieee80211_local *local, Index: wireless-testing/net/mac80211/ieee80211_i.h =================================================================== --- wireless-testing.orig/net/mac80211/ieee80211_i.h 2009-08-23 00:06:41.000000000 +0200 +++ wireless-testing/net/mac80211/ieee80211_i.h 2009-09-11 17:02:05.000000000 +0200 @@ -1053,6 +1053,14 @@ void ieee80211_tx_pending(unsigned long int ieee80211_monitor_start_xmit(struct sk_buff *skb, struct net_device *dev); int ieee80211_subif_start_xmit(struct sk_buff *skb, struct net_device *dev); +/* rx handling */ +static inline int ieee80211_netif_rx(struct sk_buff *skb) +{ + if (in_interrupt()) + return netif_rx(skb); + return netif_rx_ni(skb); +} + /* HT */ void ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_supported_band *sband, struct ieee80211_ht_cap *ht_cap_ie, Index: wireless-testing/net/mac80211/main.c =================================================================== --- wireless-testing.orig/net/mac80211/main.c 2009-08-23 00:06:41.000000000 +0200 +++ wireless-testing/net/mac80211/main.c 2009-09-11 16:59:35.000000000 +0200 @@ -591,7 +591,7 @@ void ieee80211_tx_status(struct ieee8021 skb2 = skb_clone(skb, GFP_ATOMIC); if (skb2) { skb2->dev = prev_dev; - netif_rx(skb2); + ieee80211_netif_rx(skb2); } } @@ -600,7 +600,7 @@ void ieee80211_tx_status(struct ieee8021 } if (prev_dev) { skb->dev = prev_dev; - netif_rx(skb); + ieee80211_netif_rx(skb); skb = NULL; } rcu_read_unlock(); Index: wireless-testing/net/mac80211/rx.c =================================================================== --- wireless-testing.orig/net/mac80211/rx.c 2009-09-04 19:08:05.000000000 +0200 +++ wireless-testing/net/mac80211/rx.c 2009-09-11 17:00:08.000000000 +0200 @@ -309,7 +309,7 @@ ieee80211_rx_monitor(struct ieee80211_lo skb2 = skb_clone(skb, GFP_ATOMIC); if (skb2) { skb2->dev = prev_dev; - netif_rx(skb2); + ieee80211_netif_rx(skb2); } } @@ -320,7 +320,7 @@ ieee80211_rx_monitor(struct ieee80211_lo if (prev_dev) { skb->dev = prev_dev; - netif_rx(skb); + ieee80211_netif_rx(skb); } else dev_kfree_skb(skb); @@ -1349,7 +1349,7 @@ ieee80211_deliver_skb(struct ieee80211_r /* deliver to local stack */ skb->protocol = eth_type_trans(skb, dev); memset(skb->cb, 0, sizeof(skb->cb)); - netif_rx(skb); + ieee80211_netif_rx(skb); } } @@ -1943,7 +1943,7 @@ static void ieee80211_rx_cooked_monitor( skb2 = skb_clone(skb, GFP_ATOMIC); if (skb2) { skb2->dev = prev_dev; - netif_rx(skb2); + ieee80211_netif_rx(skb2); } } @@ -1954,7 +1954,7 @@ static void ieee80211_rx_cooked_monitor( if (prev_dev) { skb->dev = prev_dev; - netif_rx(skb); + ieee80211_netif_rx(skb); skb = NULL; } else goto out_free_skb; -- Greetings, Michael. ^ permalink raw reply [flat|nested] 27+ messages in thread
[parent not found: <200909111707.23971.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org>]
* Re: mac80211: NOHZ: local_softirq_pending 08 [not found] ` <200909111707.23971.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> @ 2009-09-11 16:07 ` Kalle Valo 2009-09-11 16:07 ` Oliver Hartkopp 1 sibling, 0 replies; 27+ messages in thread From: Kalle Valo @ 2009-09-11 16:07 UTC (permalink / raw) To: Michael Buesch Cc: linux-wireless-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA, Johannes Berg, John W. Linville Michael Buesch <mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> writes: >> > mac80211 (or some other part of the networking stack) triggers this >> > warning in the NOHZ code: NOHZ: local_softirq_pending 08 >> > >> > 08 seems to be NET_RX_SOFTIRQ. >> > >> > It happens, because my test driver b43 handles all RX and TX-status >> > callbacks in process context. I guess some part of the networking >> > stack expects RX to be in tasklet and/or softirq context. >> > >> > We also have a report of this warning in wl1251, so it's probably not >> > a b43 problem. >> >> Yes, I see this with wl1251. It uses workqueues everywhere. >> > > This patch seems to fix it. Yes, it does. Thanks. > Signed-off-by: Michael Buesch <mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> Tested-by: Kalle Valo <kalle.valo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org> -- Kalle Valo -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: mac80211: NOHZ: local_softirq_pending 08 [not found] ` <200909111707.23971.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> 2009-09-11 16:07 ` Kalle Valo @ 2009-09-11 16:07 ` Oliver Hartkopp [not found] ` <4AAA75CB.6040803-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org> 1 sibling, 1 reply; 27+ messages in thread From: Oliver Hartkopp @ 2009-09-11 16:07 UTC (permalink / raw) To: Michael Buesch Cc: Kalle Valo, linux-wireless-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA, Johannes Berg, John W. Linville Michael Buesch wrote: > On Friday 11 September 2009 16:57:54 Kalle Valo wrote: >> Michael Buesch <mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> writes: >> >>> Hi, >> Hallo, >> >>> mac80211 (or some other part of the networking stack) triggers this >>> warning in the NOHZ code: NOHZ: local_softirq_pending 08 >>> >>> 08 seems to be NET_RX_SOFTIRQ. >>> >>> It happens, because my test driver b43 handles all RX and TX-status >>> callbacks in process context. I guess some part of the networking >>> stack expects RX to be in tasklet and/or softirq context. >>> >>> We also have a report of this warning in wl1251, so it's probably not >>> a b43 problem. >> Yes, I see this with wl1251. It uses workqueues everywhere. >> > > This patch seems to fix it. > > Signed-off-by: Michael Buesch <mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> > > Index: wireless-testing/net/mac80211/cfg.c > =================================================================== > --- wireless-testing.orig/net/mac80211/cfg.c 2009-08-09 18:47:11.000000000 +0200 > +++ wireless-testing/net/mac80211/cfg.c 2009-09-11 16:59:12.000000000 +0200 > @@ -606,7 +606,7 @@ static void ieee80211_send_layer2_update > skb->dev = sta->sdata->dev; > skb->protocol = eth_type_trans(skb, sta->sdata->dev); > memset(skb->cb, 0, sizeof(skb->cb)); > - netif_rx(skb); > + ieee80211_netif_rx(skb); > } > > static void sta_apply_parameters(struct ieee80211_local *local, > Index: wireless-testing/net/mac80211/ieee80211_i.h > =================================================================== > --- wireless-testing.orig/net/mac80211/ieee80211_i.h 2009-08-23 00:06:41.000000000 +0200 > +++ wireless-testing/net/mac80211/ieee80211_i.h 2009-09-11 17:02:05.000000000 +0200 > @@ -1053,6 +1053,14 @@ void ieee80211_tx_pending(unsigned long > int ieee80211_monitor_start_xmit(struct sk_buff *skb, struct net_device *dev); > int ieee80211_subif_start_xmit(struct sk_buff *skb, struct net_device *dev); > > +/* rx handling */ > +static inline int ieee80211_netif_rx(struct sk_buff *skb) > +{ > + if (in_interrupt()) > + return netif_rx(skb); > + return netif_rx_ni(skb); > +} > + Hello Michael, i know this NOHZ warning from the CAN stack also - but now, i know what caused this warning. I fixed it in my local tree and it works. Thanks! As there are several users in the kernel do exact this test and call the appropriate netif_rx() function, i would suggest to create a static inline function: static inline int netif_rx_ti(struct sk_buff *skb) { if (in_interrupt()) return netif_rx(skb); return netif_rx_ni(skb); } ('ti' for test in_interrupt()) in include/linux/netdevice.h What do you think about that? Regards, Oliver -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
[parent not found: <4AAA75CB.6040803-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org>]
* Re: mac80211: NOHZ: local_softirq_pending 08 [not found] ` <4AAA75CB.6040803-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org> @ 2009-09-11 16:13 ` Michael Buesch 2009-09-12 16:41 ` Oliver Hartkopp 0 siblings, 1 reply; 27+ messages in thread From: Michael Buesch @ 2009-09-11 16:13 UTC (permalink / raw) To: Oliver Hartkopp Cc: Kalle Valo, linux-wireless-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA, Johannes Berg, John W. Linville On Friday 11 September 2009 18:07:39 Oliver Hartkopp wrote: > Michael Buesch wrote: > > On Friday 11 September 2009 16:57:54 Kalle Valo wrote: > >> Michael Buesch <mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> writes: > >> > >>> Hi, > >> Hallo, > >> > >>> mac80211 (or some other part of the networking stack) triggers this > >>> warning in the NOHZ code: NOHZ: local_softirq_pending 08 > >>> > >>> 08 seems to be NET_RX_SOFTIRQ. > >>> > >>> It happens, because my test driver b43 handles all RX and TX-status > >>> callbacks in process context. I guess some part of the networking > >>> stack expects RX to be in tasklet and/or softirq context. > >>> > >>> We also have a report of this warning in wl1251, so it's probably not > >>> a b43 problem. > >> Yes, I see this with wl1251. It uses workqueues everywhere. > >> > > > > This patch seems to fix it. > > > > Signed-off-by: Michael Buesch <mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> > > > > Index: wireless-testing/net/mac80211/cfg.c > > =================================================================== > > --- wireless-testing.orig/net/mac80211/cfg.c 2009-08-09 18:47:11.000000000 +0200 > > +++ wireless-testing/net/mac80211/cfg.c 2009-09-11 16:59:12.000000000 +0200 > > @@ -606,7 +606,7 @@ static void ieee80211_send_layer2_update > > skb->dev = sta->sdata->dev; > > skb->protocol = eth_type_trans(skb, sta->sdata->dev); > > memset(skb->cb, 0, sizeof(skb->cb)); > > - netif_rx(skb); > > + ieee80211_netif_rx(skb); > > } > > > > static void sta_apply_parameters(struct ieee80211_local *local, > > Index: wireless-testing/net/mac80211/ieee80211_i.h > > =================================================================== > > --- wireless-testing.orig/net/mac80211/ieee80211_i.h 2009-08-23 00:06:41.000000000 +0200 > > +++ wireless-testing/net/mac80211/ieee80211_i.h 2009-09-11 17:02:05.000000000 +0200 > > @@ -1053,6 +1053,14 @@ void ieee80211_tx_pending(unsigned long > > int ieee80211_monitor_start_xmit(struct sk_buff *skb, struct net_device *dev); > > int ieee80211_subif_start_xmit(struct sk_buff *skb, struct net_device *dev); > > > > +/* rx handling */ > > +static inline int ieee80211_netif_rx(struct sk_buff *skb) > > +{ > > + if (in_interrupt()) > > + return netif_rx(skb); > > + return netif_rx_ni(skb); > > +} > > + > > Hello Michael, > > i know this NOHZ warning from the CAN stack also - but now, i know what caused > this warning. I fixed it in my local tree and it works. Thanks! > > As there are several users in the kernel do exact this test and call the > appropriate netif_rx() function, i would suggest to create a static inline > function: > > static inline int netif_rx_ti(struct sk_buff *skb) > { > if (in_interrupt()) > return netif_rx(skb); > return netif_rx_ni(skb); > } > > ('ti' for test in_interrupt()) > > in include/linux/netdevice.h > > What do you think about that? Yeah, I'm fine with that. -- Greetings, Michael. -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: mac80211: NOHZ: local_softirq_pending 08 2009-09-11 16:13 ` Michael Buesch @ 2009-09-12 16:41 ` Oliver Hartkopp [not found] ` <4AABCF28.6090505-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org> 2009-09-29 19:29 ` John W. Linville 0 siblings, 2 replies; 27+ messages in thread From: Oliver Hartkopp @ 2009-09-12 16:41 UTC (permalink / raw) To: Michael Buesch Cc: Kalle Valo, linux-wireless, netdev, Johannes Berg, John W. Linville [-- Attachment #1: Type: text/plain, Size: 932 bytes --] Michael Buesch wrote: >> As there are several users in the kernel do exact this test and call the >> appropriate netif_rx() function, i would suggest to create a static inline >> function: >> >> static inline int netif_rx_ti(struct sk_buff *skb) >> { >> if (in_interrupt()) >> return netif_rx(skb); >> return netif_rx_ni(skb); >> } >> >> ('ti' for test in_interrupt()) >> >> in include/linux/netdevice.h >> >> What do you think about that? > > Yeah, I'm fine with that. > Hi Michael, i cooked a patch that introduces netif_rx_ti() and fixes up the problems in mac80211 and the CAN subsystem. Currently i'm pondering whether netif_rx_ti() is needed in all cases or if there are code sections that'll never be executed from irq-context. In theses cases netif_rx_ni() should be prefered to netif_rx_ti() to prevent the obsolete check ... Is there any of your changes that should better use netif_rx_ni() ? Regards, Oliver [-- Attachment #2: net-NOHZ-local_softirq_pending-08.patch --] [-- Type: text/x-patch, Size: 3612 bytes --] diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c index 6971f6c..899f3d3 100644 --- a/drivers/net/can/vcan.c +++ b/drivers/net/can/vcan.c @@ -80,7 +80,7 @@ static void vcan_rx(struct sk_buff *skb, struct net_device *dev) skb->dev = dev; skb->ip_summed = CHECKSUM_UNNECESSARY; - netif_rx(skb); + netif_rx_ti(skb); } static netdev_tx_t vcan_tx(struct sk_buff *skb, struct net_device *dev) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index a44118b..b34c05d 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -1503,6 +1503,18 @@ extern int netdev_budget; extern void netdev_run_todo(void); /** + * netif_rx_ti - test for irq context and post buffer to the network code + * @skb: buffer to post + * + */ +static inline int netif_rx_ti(struct sk_buff *skb) +{ + if (in_interrupt()) + return netif_rx(skb); + return netif_rx_ni(skb); +} + +/** * dev_put - release reference to device * @dev: network device * diff --git a/net/can/af_can.c b/net/can/af_can.c index ef1c43a..c21e7f4 100644 --- a/net/can/af_can.c +++ b/net/can/af_can.c @@ -278,7 +278,7 @@ int can_send(struct sk_buff *skb, int loop) } if (newskb) - netif_rx(newskb); + netif_rx_ti(newskb); /* update statistics */ can_stats.tx_frames++; diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 5608f6c..bbcb4cb 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -606,7 +606,7 @@ static void ieee80211_send_layer2_update(struct sta_info *sta) skb->dev = sta->sdata->dev; skb->protocol = eth_type_trans(skb, sta->sdata->dev); memset(skb->cb, 0, sizeof(skb->cb)); - netif_rx(skb); + netif_rx_ti(skb); } static void sta_apply_parameters(struct ieee80211_local *local, diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 797f539..1109f99 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c @@ -591,7 +591,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) skb2 = skb_clone(skb, GFP_ATOMIC); if (skb2) { skb2->dev = prev_dev; - netif_rx(skb2); + netif_rx_ti(skb2); } } @@ -600,7 +600,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) } if (prev_dev) { skb->dev = prev_dev; - netif_rx(skb); + netif_rx_ti(skb); skb = NULL; } rcu_read_unlock(); diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index c01588f..5bb7c04 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c @@ -309,7 +309,7 @@ ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb, skb2 = skb_clone(skb, GFP_ATOMIC); if (skb2) { skb2->dev = prev_dev; - netif_rx(skb2); + netif_rx_ti(skb2); } } @@ -320,7 +320,7 @@ ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb, if (prev_dev) { skb->dev = prev_dev; - netif_rx(skb); + netif_rx_ti(skb); } else dev_kfree_skb(skb); @@ -1349,7 +1349,7 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx) /* deliver to local stack */ skb->protocol = eth_type_trans(skb, dev); memset(skb->cb, 0, sizeof(skb->cb)); - netif_rx(skb); + netif_rx_ti(skb); } } @@ -1943,7 +1943,7 @@ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx) skb2 = skb_clone(skb, GFP_ATOMIC); if (skb2) { skb2->dev = prev_dev; - netif_rx(skb2); + netif_rx_ti(skb2); } } @@ -1954,7 +1954,7 @@ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx) if (prev_dev) { skb->dev = prev_dev; - netif_rx(skb); + netif_rx_ti(skb); skb = NULL; } else goto out_free_skb; ^ permalink raw reply related [flat|nested] 27+ messages in thread
[parent not found: <4AABCF28.6090505-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org>]
* Re: mac80211: NOHZ: local_softirq_pending 08 [not found] ` <4AABCF28.6090505-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org> @ 2009-09-12 16:51 ` Michael Buesch [not found] ` <200909121851.46002.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> 0 siblings, 1 reply; 27+ messages in thread From: Michael Buesch @ 2009-09-12 16:51 UTC (permalink / raw) To: Oliver Hartkopp Cc: Kalle Valo, linux-wireless-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA, Johannes Berg, John W. Linville On Saturday 12 September 2009 18:41:12 Oliver Hartkopp wrote: > Michael Buesch wrote: > > >> As there are several users in the kernel do exact this test and call the > >> appropriate netif_rx() function, i would suggest to create a static inline > >> function: > >> > >> static inline int netif_rx_ti(struct sk_buff *skb) > >> { > >> if (in_interrupt()) > >> return netif_rx(skb); > >> return netif_rx_ni(skb); > >> } > >> > >> ('ti' for test in_interrupt()) > >> > >> in include/linux/netdevice.h > >> > >> What do you think about that? > > > > Yeah, I'm fine with that. > > > > Hi Michael, > > i cooked a patch that introduces netif_rx_ti() and fixes up the problems in > mac80211 and the CAN subsystem. > > Currently i'm pondering whether netif_rx_ti() is needed in all cases or if > there are code sections that'll never be executed from irq-context. > > In theses cases netif_rx_ni() should be prefered to netif_rx_ti() to prevent > the obsolete check ... > > Is there any of your changes that should better use netif_rx_ni() ? > > Regards, > Oliver > Well, I'd say this check does not cost much at all. If I were the net maintainer, I'd get rid of netif_rx_ni() _and_ netif_rx_ti() and do the check internally in netif_rx(). But as I don't have to decide that, I just want the mac80211 issue fixed. -- Greetings, Michael. -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
[parent not found: <200909121851.46002.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org>]
* Re: mac80211: NOHZ: local_softirq_pending 08 [not found] ` <200909121851.46002.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> @ 2009-09-12 18:07 ` Oliver Hartkopp 0 siblings, 0 replies; 27+ messages in thread From: Oliver Hartkopp @ 2009-09-12 18:07 UTC (permalink / raw) To: Michael Buesch Cc: Kalle Valo, linux-wireless-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA, Johannes Berg, John W. Linville Michael Buesch wrote: > On Saturday 12 September 2009 18:41:12 Oliver Hartkopp wrote: >> Michael Buesch wrote: >> >>>> As there are several users in the kernel do exact this test and call the >>>> appropriate netif_rx() function, i would suggest to create a static inline >>>> function: >>>> >>>> static inline int netif_rx_ti(struct sk_buff *skb) >>>> { >>>> if (in_interrupt()) >>>> return netif_rx(skb); >>>> return netif_rx_ni(skb); >>>> } >>>> >>>> ('ti' for test in_interrupt()) >>>> >>>> in include/linux/netdevice.h >>>> >>>> What do you think about that? >>> Yeah, I'm fine with that. >>> >> Hi Michael, >> >> i cooked a patch that introduces netif_rx_ti() and fixes up the problems in >> mac80211 and the CAN subsystem. >> >> Currently i'm pondering whether netif_rx_ti() is needed in all cases or if >> there are code sections that'll never be executed from irq-context. >> >> In theses cases netif_rx_ni() should be prefered to netif_rx_ti() to prevent >> the obsolete check ... >> >> Is there any of your changes that should better use netif_rx_ni() ? >> >> Regards, >> Oliver >> > > Well, I'd say this check does not cost much at all. > If I were the net maintainer, I'd get rid of netif_rx_ni() _and_ netif_rx_ti() and > do the check internally in netif_rx(). > But as I don't have to decide that, I just want the mac80211 issue fixed. > Like this? int netif_rx(struct sk_buff *skb) { int err; if (likely(in_interrupt())) err = __netif_rx(skb); else { preempt_disable(); err = __netif_rx(skb); if (local_softirq_pending()) do_softirq(); preempt_enable(); } return err; } I don't know how expensive in_interrupt() is ... checking the code does not give any answers to *me* ;-) But i found 356 netif_rx() but only 18 netif_rx_ni() in the kernel tree. And three of them check for in_interrupt() before using netif_rx() or netif_rx_ni() ... Finally i would tend to introduce netif_rx_ti() in include/linux/netdevice.h as described above, for the rare code that can be used inside and outside the irq context. I assume the affected code in the CAN stuff has to use netif_rx_ni() - but i will doublecheck that (and prepare a separate CAN patch). For the mac80211 i would suggest to check whether you really need netif_rx()/netif_rx_ni()/netif_rx_ti() in all the regarded cases. I assume always using netif_rx_ti() (as you proposed in the original patch) is not the most efficient approach. Best regards, Oliver -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: mac80211: NOHZ: local_softirq_pending 08 2009-09-12 16:41 ` Oliver Hartkopp [not found] ` <4AABCF28.6090505-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org> @ 2009-09-29 19:29 ` John W. Linville [not found] ` <20090929192928.GF2678-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org> 1 sibling, 1 reply; 27+ messages in thread From: John W. Linville @ 2009-09-29 19:29 UTC (permalink / raw) To: Oliver Hartkopp Cc: Michael Buesch, Kalle Valo, linux-wireless, netdev, Johannes Berg On Sat, Sep 12, 2009 at 06:41:12PM +0200, Oliver Hartkopp wrote: > i cooked a patch that introduces netif_rx_ti() and fixes up the problems in > mac80211 and the CAN subsystem. Oliver, Are you going to send this patch to Dave? If you want me to carry it instead, please resend it with a proper changelog including a Signed-off-by line. For that matter, Dave will most certainly want that as well... Thanks! John -- John W. Linville Someday the world will need a hero, and you linville@tuxdriver.com might be all we have. Be ready. ^ permalink raw reply [flat|nested] 27+ messages in thread
[parent not found: <20090929192928.GF2678-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>]
* Re: mac80211: NOHZ: local_softirq_pending 08 [not found] ` <20090929192928.GF2678-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org> @ 2009-09-30 11:56 ` Oliver Hartkopp 2009-09-30 14:33 ` Michael Buesch 0 siblings, 1 reply; 27+ messages in thread From: Oliver Hartkopp @ 2009-09-30 11:56 UTC (permalink / raw) To: John W. Linville Cc: Michael Buesch, Kalle Valo, linux-wireless-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA, Johannes Berg John W. Linville wrote: > On Sat, Sep 12, 2009 at 06:41:12PM +0200, Oliver Hartkopp wrote: > >> i cooked a patch that introduces netif_rx_ti() and fixes up the problems in >> mac80211 and the CAN subsystem. > > Oliver, > > Are you going to send this patch to Dave? If you want me to carry > it instead, please resend it with a proper changelog including a > Signed-off-by line. For that matter, Dave will most certainly want > that as well... Hello John, as i wrote here http://marc.info/?l=linux-netdev&m=125277885910179&w=2 there are currently only three occurrences of checks that use netif_rx() and netif_rx_ni() depending on in_interrupt(). And regarding the suggested fix from Michael, that checked every(!) netif_rx() whether it is in interrupt or not, i was unsure if a netif_tx_ti() would make sense for only three cases?!? If you think it makes sense, i can post a patch for that ... but: Indeed it costs some additional investigation to prove whether netif_rx() or netif_rx_ni() should be used in each case. But IMHO this has to be done before providing a pump-gun function that solves the problem without thinking if we are in irq-context or not. I want to avoid that people are using netif_rx_ti() as some kind of default ... I don't know how expensive in_interrupt() is, but it IMO should be avoided when the context for a code section can be determined in another way. Regards, Oliver -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: mac80211: NOHZ: local_softirq_pending 08 2009-09-30 11:56 ` Oliver Hartkopp @ 2009-09-30 14:33 ` Michael Buesch [not found] ` <200909301633.04376.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> 0 siblings, 1 reply; 27+ messages in thread From: Michael Buesch @ 2009-09-30 14:33 UTC (permalink / raw) To: Oliver Hartkopp Cc: John W. Linville, Kalle Valo, linux-wireless, netdev, Johannes Berg On Wednesday 30 September 2009 13:56:12 Oliver Hartkopp wrote: > John W. Linville wrote: > > On Sat, Sep 12, 2009 at 06:41:12PM +0200, Oliver Hartkopp wrote: > > > >> i cooked a patch that introduces netif_rx_ti() and fixes up the problems in > >> mac80211 and the CAN subsystem. > > > > Oliver, > > > > Are you going to send this patch to Dave? If you want me to carry > > it instead, please resend it with a proper changelog including a > > Signed-off-by line. For that matter, Dave will most certainly want > > that as well... > > Hello John, > > as i wrote here > > http://marc.info/?l=linux-netdev&m=125277885910179&w=2 > > there are currently only three occurrences of checks that use netif_rx() and > netif_rx_ni() depending on in_interrupt(). > > And regarding the suggested fix from Michael, that checked every(!) netif_rx() > whether it is in interrupt or not, i was unsure if a netif_tx_ti() would make > sense for only three cases?!? > > If you think it makes sense, i can post a patch for that ... but: > > Indeed it costs some additional investigation to prove whether netif_rx() or > netif_rx_ni() should be used in each case. But IMHO this has to be done before > providing a pump-gun function that solves the problem without thinking if we > are in irq-context or not. I want to avoid that people are using netif_rx_ti() > as some kind of default ... > > I don't know how expensive in_interrupt() is, but it IMO should be avoided > when the context for a code section can be determined in another way. What if we just get the fix merged and discuss later whether it's worth to optimize a picosecond or not?? My patch fixes the _bug_. You can merge a more "efficient" fix later that saves one or two CPU cycles. -- Greetings, Michael. ^ permalink raw reply [flat|nested] 27+ messages in thread
[parent not found: <200909301633.04376.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org>]
* Re: mac80211: NOHZ: local_softirq_pending 08 [not found] ` <200909301633.04376.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> @ 2009-09-30 14:47 ` Kalle Valo 2009-09-30 14:54 ` Johannes Berg 0 siblings, 1 reply; 27+ messages in thread From: Kalle Valo @ 2009-09-30 14:47 UTC (permalink / raw) To: Michael Buesch Cc: Oliver Hartkopp, John W. Linville, linux-wireless-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA, Johannes Berg Michael Buesch <mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> writes: >> I don't know how expensive in_interrupt() is, but it IMO should be >> avoided when the context for a code section can be determined in >> another way. > > What if we just get the fix merged and discuss later whether it's > worth to optimize a picosecond or not?? My patch fixes the _bug_. > You can merge a more "efficient" fix later that saves one or two CPU > cycles. I agree with Michael. The bug is real and I have verified that Michael's patch fixes the issue. Better to apply the patch now, it's trivial to change the implementation if/when the network stack has support for this. -- Kalle Valo -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: mac80211: NOHZ: local_softirq_pending 08 2009-09-30 14:47 ` Kalle Valo @ 2009-09-30 14:54 ` Johannes Berg [not found] ` <1254322466.3959.5.camel-YfaajirXv2244ywRPIzf9A@public.gmane.org> 0 siblings, 1 reply; 27+ messages in thread From: Johannes Berg @ 2009-09-30 14:54 UTC (permalink / raw) To: Kalle Valo Cc: Michael Buesch, Oliver Hartkopp, John W. Linville, linux-wireless, netdev [-- Attachment #1: Type: text/plain, Size: 489 bytes --] On Wed, 2009-09-30 at 17:47 +0300, Kalle Valo wrote: > I agree with Michael. The bug is real and I have verified that > Michael's patch fixes the issue. Better to apply the patch now, it's > trivial to change the implementation if/when the network stack has > support for this. FWIW, I think in mac80211 the in_interrupt() check can never return true since we postpone all RX to the tasklet. But the tasklet seems to be ok -- so should it really be in_interrupt()? johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 801 bytes --] ^ permalink raw reply [flat|nested] 27+ messages in thread
[parent not found: <1254322466.3959.5.camel-YfaajirXv2244ywRPIzf9A@public.gmane.org>]
* Re: mac80211: NOHZ: local_softirq_pending 08 [not found] ` <1254322466.3959.5.camel-YfaajirXv2244ywRPIzf9A@public.gmane.org> @ 2009-09-30 15:10 ` Michael Buesch 2009-09-30 15:21 ` Johannes Berg 0 siblings, 1 reply; 27+ messages in thread From: Michael Buesch @ 2009-09-30 15:10 UTC (permalink / raw) To: Johannes Berg Cc: Kalle Valo, Oliver Hartkopp, John W. Linville, linux-wireless-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA On Wednesday 30 September 2009 16:54:26 Johannes Berg wrote: > On Wed, 2009-09-30 at 17:47 +0300, Kalle Valo wrote: > > > I agree with Michael. The bug is real and I have verified that > > Michael's patch fixes the issue. Better to apply the patch now, it's > > trivial to change the implementation if/when the network stack has > > support for this. > > FWIW, I think in mac80211 the in_interrupt() check can never return true > since we postpone all RX to the tasklet. But the tasklet seems to be ok > -- so should it really be in_interrupt()? I think a tasklet is also in_interrupt(), because it's a softirq. in_interrupt() returns false in process context. The problem appeared when the b43 driver started passing RX frames while being in process context (threaded IRQ). It previously was in tasklet (= softirq) context. -- Greetings, Michael. -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: mac80211: NOHZ: local_softirq_pending 08 2009-09-30 15:10 ` Michael Buesch @ 2009-09-30 15:21 ` Johannes Berg [not found] ` <1254324077.3959.7.camel-YfaajirXv2244ywRPIzf9A@public.gmane.org> 0 siblings, 1 reply; 27+ messages in thread From: Johannes Berg @ 2009-09-30 15:21 UTC (permalink / raw) To: Michael Buesch Cc: Kalle Valo, Oliver Hartkopp, John W. Linville, linux-wireless, netdev [-- Attachment #1: Type: text/plain, Size: 773 bytes --] On Wed, 2009-09-30 at 17:10 +0200, Michael Buesch wrote: > On Wednesday 30 September 2009 16:54:26 Johannes Berg wrote: > > On Wed, 2009-09-30 at 17:47 +0300, Kalle Valo wrote: > > > > > I agree with Michael. The bug is real and I have verified that > > > Michael's patch fixes the issue. Better to apply the patch now, it's > > > trivial to change the implementation if/when the network stack has > > > support for this. > > > > FWIW, I think in mac80211 the in_interrupt() check can never return true > > since we postpone all RX to the tasklet. But the tasklet seems to be ok > > -- so should it really be in_interrupt()? > > I think a tasklet is also in_interrupt(), because it's a softirq. Ah, yes, indeed, in_interrupt() vs. in_irq(). johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 801 bytes --] ^ permalink raw reply [flat|nested] 27+ messages in thread
[parent not found: <1254324077.3959.7.camel-YfaajirXv2244ywRPIzf9A@public.gmane.org>]
* Re: mac80211: NOHZ: local_softirq_pending 08 [not found] ` <1254324077.3959.7.camel-YfaajirXv2244ywRPIzf9A@public.gmane.org> @ 2009-09-30 17:51 ` Oliver Hartkopp [not found] ` <4AC39A90.6060602-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org> 0 siblings, 1 reply; 27+ messages in thread From: Oliver Hartkopp @ 2009-09-30 17:51 UTC (permalink / raw) To: Johannes Berg Cc: Michael Buesch, Kalle Valo, John W. Linville, linux-wireless-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA Johannes Berg wrote: > On Wed, 2009-09-30 at 17:10 +0200, Michael Buesch wrote: >> On Wednesday 30 September 2009 16:54:26 Johannes Berg wrote: >>> On Wed, 2009-09-30 at 17:47 +0300, Kalle Valo wrote: >>> >>>> I agree with Michael. The bug is real and I have verified that >>>> Michael's patch fixes the issue. Better to apply the patch now, it's >>>> trivial to change the implementation if/when the network stack has >>>> support for this. >>> FWIW, I think in mac80211 the in_interrupt() check can never return true >>> since we postpone all RX to the tasklet. But the tasklet seems to be ok >>> -- so should it really be in_interrupt()? >> I think a tasklet is also in_interrupt(), because it's a softirq. > > Ah, yes, indeed, in_interrupt() vs. in_irq(). > Oops! I missed that for my previous patch i added for two occurrences in the CAN sources. I'm currently compiling the patch for netif_rx_ti() and will post it in some minutes (for CAN and mac80211) when it runs without probs. Regards, Oliver -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
[parent not found: <4AC39A90.6060602-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org>]
* [PATCH] net: fix NOHZ: local_softirq_pending 08 [not found] ` <4AC39A90.6060602-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org> @ 2009-09-30 18:18 ` Oliver Hartkopp [not found] ` <4AC3A0F1.3060306-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org> 0 siblings, 1 reply; 27+ messages in thread From: Oliver Hartkopp @ 2009-09-30 18:18 UTC (permalink / raw) To: David Miller Cc: Johannes Berg, Michael Buesch, Kalle Valo, John W. Linville, linux-wireless-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA [-- Attachment #1: Type: text/plain, Size: 505 bytes --] Socket buffers that are generated and received inside softirqs or from process context must not use netif_rx() that's intended to be used from irq context only. This patch introduces a new helper function netif_rx_ti(skb) that tests for in_interrupt() before invoking netif_rx() or netif_rx_ni(). It fixes the ratelimited kernel warning NOHZ: local_softirq_pending 08 in the mac80211 and can subsystems. Signed-off-by: Oliver Hartkopp <oliver-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org> --- [-- Attachment #2: net-NOHZ-local_softirq_pending-08.patch --] [-- Type: text/x-patch, Size: 4031 bytes --] diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c index 80ac563..899f3d3 100644 --- a/drivers/net/can/vcan.c +++ b/drivers/net/can/vcan.c @@ -80,7 +80,7 @@ static void vcan_rx(struct sk_buff *skb, struct net_device *dev) skb->dev = dev; skb->ip_summed = CHECKSUM_UNNECESSARY; - netif_rx_ni(skb); + netif_rx_ti(skb); } static netdev_tx_t vcan_tx(struct sk_buff *skb, struct net_device *dev) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 94958c1..dc8dfb2 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -1509,6 +1509,19 @@ extern int netdev_budget; extern void netdev_run_todo(void); /** + * netif_rx_ti - test for irq context and post buffer to the network code + * @skb: buffer to post + * + */ +static inline int netif_rx_ti(struct sk_buff *skb) +{ + if (in_interrupt()) + return netif_rx(skb); + else + return netif_rx_ni(skb); +} + +/** * dev_put - release reference to device * @dev: network device * diff --git a/net/can/af_can.c b/net/can/af_can.c index 6068321..c21e7f4 100644 --- a/net/can/af_can.c +++ b/net/can/af_can.c @@ -199,8 +199,6 @@ static int can_create(struct net *net, struct socket *sock, int protocol) * @skb: pointer to socket buffer with CAN frame in data section * @loop: loopback for listeners on local CAN sockets (recommended default!) * - * Due to the loopback this routine must not be called from hardirq context. - * * Return: * 0 on success * -ENETDOWN when the selected interface is down @@ -280,7 +278,7 @@ int can_send(struct sk_buff *skb, int loop) } if (newskb) - netif_rx_ni(newskb); + netif_rx_ti(newskb); /* update statistics */ can_stats.tx_frames++; diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 5608f6c..bbcb4cb 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -606,7 +606,7 @@ static void ieee80211_send_layer2_update(struct sta_info *sta) skb->dev = sta->sdata->dev; skb->protocol = eth_type_trans(skb, sta->sdata->dev); memset(skb->cb, 0, sizeof(skb->cb)); - netif_rx(skb); + netif_rx_ti(skb); } static void sta_apply_parameters(struct ieee80211_local *local, diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 797f539..1109f99 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c @@ -591,7 +591,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) skb2 = skb_clone(skb, GFP_ATOMIC); if (skb2) { skb2->dev = prev_dev; - netif_rx(skb2); + netif_rx_ti(skb2); } } @@ -600,7 +600,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) } if (prev_dev) { skb->dev = prev_dev; - netif_rx(skb); + netif_rx_ti(skb); skb = NULL; } rcu_read_unlock(); diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index c01588f..5bb7c04 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c @@ -309,7 +309,7 @@ ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb, skb2 = skb_clone(skb, GFP_ATOMIC); if (skb2) { skb2->dev = prev_dev; - netif_rx(skb2); + netif_rx_ti(skb2); } } @@ -320,7 +320,7 @@ ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb, if (prev_dev) { skb->dev = prev_dev; - netif_rx(skb); + netif_rx_ti(skb); } else dev_kfree_skb(skb); @@ -1349,7 +1349,7 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx) /* deliver to local stack */ skb->protocol = eth_type_trans(skb, dev); memset(skb->cb, 0, sizeof(skb->cb)); - netif_rx(skb); + netif_rx_ti(skb); } } @@ -1943,7 +1943,7 @@ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx) skb2 = skb_clone(skb, GFP_ATOMIC); if (skb2) { skb2->dev = prev_dev; - netif_rx(skb2); + netif_rx_ti(skb2); } } @@ -1954,7 +1954,7 @@ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx) if (prev_dev) { skb->dev = prev_dev; - netif_rx(skb); + netif_rx_ti(skb); skb = NULL; } else goto out_free_skb; ^ permalink raw reply related [flat|nested] 27+ messages in thread
[parent not found: <4AC3A0F1.3060306-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org>]
* Re: [PATCH] net: fix NOHZ: local_softirq_pending 08 [not found] ` <4AC3A0F1.3060306-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org> @ 2009-09-30 18:47 ` John W. Linville 2009-09-30 23:33 ` David Miller 1 sibling, 0 replies; 27+ messages in thread From: John W. Linville @ 2009-09-30 18:47 UTC (permalink / raw) To: Oliver Hartkopp Cc: David Miller, Johannes Berg, Michael Buesch, Kalle Valo, linux-wireless-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA On Wed, Sep 30, 2009 at 08:18:25PM +0200, Oliver Hartkopp wrote: > Socket buffers that are generated and received inside softirqs or from process > context must not use netif_rx() that's intended to be used from irq context only. > > This patch introduces a new helper function netif_rx_ti(skb) that tests for > in_interrupt() before invoking netif_rx() or netif_rx_ni(). > > It fixes the ratelimited kernel warning > > NOHZ: local_softirq_pending 08 > > in the mac80211 and can subsystems. > > Signed-off-by: Oliver Hartkopp <oliver-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org> http://bugzilla.kernel.org/show_bug.cgi?id=14278 Acked-by: John W. Linville <linville-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org> -- John W. Linville Someday the world will need a hero, and you linville-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org might be all we have. Be ready. -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH] net: fix NOHZ: local_softirq_pending 08 [not found] ` <4AC3A0F1.3060306-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org> 2009-09-30 18:47 ` John W. Linville @ 2009-09-30 23:33 ` David Miller 2009-10-01 7:08 ` Oliver Hartkopp 2009-10-01 14:04 ` Michael Buesch 1 sibling, 2 replies; 27+ messages in thread From: David Miller @ 2009-09-30 23:33 UTC (permalink / raw) To: oliver-fJ+pQTUTwRTk1uMJSBkQmQ Cc: johannes-cdvu00un1VgdHxzADdlk8Q, mb-fseUSCV1ubazQB+pC5nmwQ, kalle.valo-X3B1VOXEql0, linville-2XuSBdqkA4R54TAoqtyWWQ, linux-wireless-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA From: Oliver Hartkopp <oliver-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org> Date: Wed, 30 Sep 2009 20:18:25 +0200 > Socket buffers that are generated and received inside softirqs or from process > context must not use netif_rx() that's intended to be used from irq context only. > > This patch introduces a new helper function netif_rx_ti(skb) that tests for > in_interrupt() before invoking netif_rx() or netif_rx_ni(). > > It fixes the ratelimited kernel warning > > NOHZ: local_softirq_pending 08 > > in the mac80211 and can subsystems. > > Signed-off-by: Oliver Hartkopp <oliver-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org> I bet all of these code paths can use netif_receive_skb() or don't need this conditional blob at all. Looking at some specific cases in this patch: 1) VCAN: This RX routine is only invoked from the drivers ->ndo_start_xmit() handler, and therefore like the loopback driver we know that BH's are already disabled and therefore it can always use netif_rx() safely. Why did you convert this case? And if this needs to be converted, why doesn't loopback need to be? 2) af_can.c: In what situation will netif_rx_ni() not be appropriate here? It should always execute in softirq or user context, now hardirq context. And the list goes on and on, I don't really like this new conditional testing of interrupt state. As always, that's usually a red flag and as far as I can see these spots where you're changing things are only trying to receive packets in one of the two possible cases not both. I'm not applying this until all of these details are sorted out and you add some verbosity to the commit message explaining each and every case you are changing, what contexts those cases can be called from, and from where. Thanks. -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH] net: fix NOHZ: local_softirq_pending 08 2009-09-30 23:33 ` David Miller @ 2009-10-01 7:08 ` Oliver Hartkopp 2009-10-01 14:04 ` Michael Buesch 1 sibling, 0 replies; 27+ messages in thread From: Oliver Hartkopp @ 2009-10-01 7:08 UTC (permalink / raw) To: David Miller; +Cc: johannes, mb, kalle.valo, linville, linux-wireless, netdev David Miller wrote: > From: Oliver Hartkopp <oliver@hartkopp.net> > Date: Wed, 30 Sep 2009 20:18:25 +0200 > >> Socket buffers that are generated and received inside softirqs or from process >> context must not use netif_rx() that's intended to be used from irq context only. >> >> This patch introduces a new helper function netif_rx_ti(skb) that tests for >> in_interrupt() before invoking netif_rx() or netif_rx_ni(). >> >> It fixes the ratelimited kernel warning >> >> NOHZ: local_softirq_pending 08 >> >> in the mac80211 and can subsystems. >> >> Signed-off-by: Oliver Hartkopp <oliver@hartkopp.net> > > I bet all of these code paths can use netif_receive_skb() or > don't need this conditional blob at all. > > Looking at some specific cases in this patch: > > 1) VCAN: This RX routine is only invoked from the drivers > ->ndo_start_xmit() handler, and therefore like the loopback > driver we know that BH's are already disabled and therefore > it can always use netif_rx() safely. > > Why did you convert this case? > > And if this needs to be converted, why doesn't loopback need > to be? > > 2) af_can.c: In what situation will netif_rx_ni() not be appropriate > here? It should always execute in softirq or user context, now > hardirq context. > > And the list goes on and on, I don't really like this new conditional > testing of interrupt state. Hello Dave, i'm confused about in_interrupt(), in_softirq() and in_irq() as pointed out by Johannes here: http://marc.info/?l=linux-wireless&m=125432410405562&w=2 Indeed in the two cases for the CAN stuff (in vcan.c and af_can.c) the skb's are received in process-context and softirq-context only. Therefore i used netif_rx_ni() in my last change of this code. Now i was reading from Johannes that in_interrupt() is used for hardirq-context /and/ softirq-context, so i was just *unsure* and used the newly introduced netif_rx_ti() for that, which tests for in_interrupt(). Indeed i'm not really happy with that, as it is always better to check each receive case in which context it can be used and used exactly the right function for that. So when netif_rx_ni() or netif_receive_skb() is the best i can use when in process-context or in softirq-context, i'll do it with pleasure. And if it is like this the problematic netif_rx() calls in mac80211 need to be sorted out in detail also ... Regards, Oliver ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH] net: fix NOHZ: local_softirq_pending 08 2009-09-30 23:33 ` David Miller 2009-10-01 7:08 ` Oliver Hartkopp @ 2009-10-01 14:04 ` Michael Buesch [not found] ` <200910011604.42916.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> 1 sibling, 1 reply; 27+ messages in thread From: Michael Buesch @ 2009-10-01 14:04 UTC (permalink / raw) To: David Miller Cc: oliver, johannes, kalle.valo, linville, linux-wireless, netdev On Thursday 01 October 2009 01:33:33 David Miller wrote: > I'm not applying this until all of these details are sorted out John, please apply my fix to wireless-testing to get rid of the regression. You can revert it later, if there's a better fix available. -- Greetings, Michael. ^ permalink raw reply [flat|nested] 27+ messages in thread
[parent not found: <200910011604.42916.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org>]
* Re: [PATCH] net: fix NOHZ: local_softirq_pending 08 [not found] ` <200910011604.42916.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> @ 2009-10-01 14:24 ` Kalle Valo 2009-10-01 18:42 ` Johannes Berg 1 sibling, 0 replies; 27+ messages in thread From: Kalle Valo @ 2009-10-01 14:24 UTC (permalink / raw) To: Michael Buesch Cc: David Miller, oliver-fJ+pQTUTwRTk1uMJSBkQmQ, johannes-cdvu00un1VgdHxzADdlk8Q, linville-2XuSBdqkA4R54TAoqtyWWQ, linux-wireless-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA Michael Buesch <mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> writes: > On Thursday 01 October 2009 01:33:33 David Miller wrote: > >> I'm not applying this until all of these details are sorted out > > John, please apply my fix to wireless-testing to get rid of the > regression. You can revert it later, if there's a better fix > available. I agree, please take Michael's patch. It's trivial to change mac80211 part whenever there's better support available. But I don't think this is a regression because I see the bug also with 2.6.28, most probably it has been in mac80211 forever. But it's still a bug which needs to be fixed. -- Kalle Valo -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH] net: fix NOHZ: local_softirq_pending 08 [not found] ` <200910011604.42916.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> 2009-10-01 14:24 ` Kalle Valo @ 2009-10-01 18:42 ` Johannes Berg [not found] ` <1254422548.3959.24.camel-YfaajirXv2244ywRPIzf9A@public.gmane.org> 1 sibling, 1 reply; 27+ messages in thread From: Johannes Berg @ 2009-10-01 18:42 UTC (permalink / raw) To: Michael Buesch Cc: David Miller, oliver-fJ+pQTUTwRTk1uMJSBkQmQ, kalle.valo-X3B1VOXEql0, linville-2XuSBdqkA4R54TAoqtyWWQ, linux-wireless-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA [-- Attachment #1: Type: text/plain, Size: 460 bytes --] On Thu, 2009-10-01 at 16:04 +0200, Michael Buesch wrote: > On Thursday 01 October 2009 01:33:33 David Miller wrote: > > > I'm not applying this until all of these details are sorted out > > John, please apply my fix to wireless-testing to get rid of the regression. > You can revert it later, if there's a better fix available. I agree with davem, don't. Just fix the driver to local_bh_disable() around the rx function if necessary. johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 801 bytes --] ^ permalink raw reply [flat|nested] 27+ messages in thread
[parent not found: <1254422548.3959.24.camel-YfaajirXv2244ywRPIzf9A@public.gmane.org>]
* Re: [PATCH] net: fix NOHZ: local_softirq_pending 08 [not found] ` <1254422548.3959.24.camel-YfaajirXv2244ywRPIzf9A@public.gmane.org> @ 2009-10-01 19:10 ` Michael Buesch [not found] ` <200910012110.34216.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> 2009-10-01 19:32 ` David Miller 0 siblings, 2 replies; 27+ messages in thread From: Michael Buesch @ 2009-10-01 19:10 UTC (permalink / raw) To: Johannes Berg Cc: David Miller, oliver-fJ+pQTUTwRTk1uMJSBkQmQ, kalle.valo-X3B1VOXEql0, linville-2XuSBdqkA4R54TAoqtyWWQ, linux-wireless-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA On Thursday 01 October 2009 20:42:28 Johannes Berg wrote: > On Thu, 2009-10-01 at 16:04 +0200, Michael Buesch wrote: > > On Thursday 01 October 2009 01:33:33 David Miller wrote: > > > > > I'm not applying this until all of these details are sorted out > > > > John, please apply my fix to wireless-testing to get rid of the regression. > > You can revert it later, if there's a better fix available. > > I agree with davem, don't. Just fix the driver to local_bh_disable() > around the rx function if necessary. For the benefit of a much bigger critical section? I don't get it why this would be any better. I _am_ going to do one thing now, however. That is ignoring any regression bugreport. (Yes, it _is_ a regression for b43) -- Greetings, Michael. -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 27+ messages in thread
[parent not found: <200910012110.34216.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org>]
* Re: [PATCH] net: fix NOHZ: local_softirq_pending 08 [not found] ` <200910012110.34216.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> @ 2009-10-01 19:26 ` Johannes Berg 0 siblings, 0 replies; 27+ messages in thread From: Johannes Berg @ 2009-10-01 19:26 UTC (permalink / raw) To: Michael Buesch Cc: David Miller, oliver-fJ+pQTUTwRTk1uMJSBkQmQ, kalle.valo-X3B1VOXEql0, linville-2XuSBdqkA4R54TAoqtyWWQ, linux-wireless-u79uwXL29TY76Z2rM5mHXA, netdev-u79uwXL29TY76Z2rM5mHXA [-- Attachment #1: Type: text/plain, Size: 489 bytes --] On Thu, 2009-10-01 at 21:10 +0200, Michael Buesch wrote: > > I agree with davem, don't. Just fix the driver to local_bh_disable() > > around the rx function if necessary. > > For the benefit of a much bigger critical section? I don't get it why this would be any better. And how do you know mac80211 is actually safe with this change? It uses tasklets too. At the very least you'd have to require drivers to never mix & match the regular/irqsafe functions at all. johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 801 bytes --] ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH] net: fix NOHZ: local_softirq_pending 08 2009-10-01 19:10 ` Michael Buesch [not found] ` <200910012110.34216.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org> @ 2009-10-01 19:32 ` David Miller 1 sibling, 0 replies; 27+ messages in thread From: David Miller @ 2009-10-01 19:32 UTC (permalink / raw) To: mb; +Cc: johannes, oliver, kalle.valo, linville, linux-wireless, netdev From: Michael Buesch <mb@bu3sch.de> Date: Thu, 1 Oct 2009 21:10:32 +0200 > For the benefit of a much bigger critical section? I don't get it > why this would be any better. Think about what you are saying when you introduce things like this into your code: if (in_interrupt()) foo(); else bar(); That thing there means you don't know anything about how you'll need to do locking properly, because you have no idea about even the context in which your code is executed. Sure, you can lock for the most stringent case, but that's silly and wasteful. ^ permalink raw reply [flat|nested] 27+ messages in thread
end of thread, other threads:[~2009-10-01 19:32 UTC | newest]
Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-09-11 14:48 mac80211: NOHZ: local_softirq_pending 08 Michael Buesch
2009-09-11 14:57 ` Kalle Valo
2009-09-11 15:07 ` Michael Buesch
[not found] ` <200909111707.23971.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org>
2009-09-11 16:07 ` Kalle Valo
2009-09-11 16:07 ` Oliver Hartkopp
[not found] ` <4AAA75CB.6040803-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org>
2009-09-11 16:13 ` Michael Buesch
2009-09-12 16:41 ` Oliver Hartkopp
[not found] ` <4AABCF28.6090505-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org>
2009-09-12 16:51 ` Michael Buesch
[not found] ` <200909121851.46002.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org>
2009-09-12 18:07 ` Oliver Hartkopp
2009-09-29 19:29 ` John W. Linville
[not found] ` <20090929192928.GF2678-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org>
2009-09-30 11:56 ` Oliver Hartkopp
2009-09-30 14:33 ` Michael Buesch
[not found] ` <200909301633.04376.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org>
2009-09-30 14:47 ` Kalle Valo
2009-09-30 14:54 ` Johannes Berg
[not found] ` <1254322466.3959.5.camel-YfaajirXv2244ywRPIzf9A@public.gmane.org>
2009-09-30 15:10 ` Michael Buesch
2009-09-30 15:21 ` Johannes Berg
[not found] ` <1254324077.3959.7.camel-YfaajirXv2244ywRPIzf9A@public.gmane.org>
2009-09-30 17:51 ` Oliver Hartkopp
[not found] ` <4AC39A90.6060602-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org>
2009-09-30 18:18 ` [PATCH] net: fix " Oliver Hartkopp
[not found] ` <4AC3A0F1.3060306-fJ+pQTUTwRTk1uMJSBkQmQ@public.gmane.org>
2009-09-30 18:47 ` John W. Linville
2009-09-30 23:33 ` David Miller
2009-10-01 7:08 ` Oliver Hartkopp
2009-10-01 14:04 ` Michael Buesch
[not found] ` <200910011604.42916.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org>
2009-10-01 14:24 ` Kalle Valo
2009-10-01 18:42 ` Johannes Berg
[not found] ` <1254422548.3959.24.camel-YfaajirXv2244ywRPIzf9A@public.gmane.org>
2009-10-01 19:10 ` Michael Buesch
[not found] ` <200910012110.34216.mb-fseUSCV1ubazQB+pC5nmwQ@public.gmane.org>
2009-10-01 19:26 ` Johannes Berg
2009-10-01 19:32 ` David Miller
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).