linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH RFC] mac80211: fix "NOHZ: local_softirq_pending 08"
@ 2010-11-29 14:54 Johannes Stezenbach
  2010-11-29 15:09 ` Johannes Berg
  0 siblings, 1 reply; 12+ messages in thread
From: Johannes Stezenbach @ 2010-11-29 14:54 UTC (permalink / raw)
  To: linux-wireless
  Cc: Ivo van Doorn, Gertjan van Wingerde, John W. Linville,
	Johannes Berg

ieee80211_tx_status() documentation says "This function may not be
called in IRQ context", and it is called by rt2800usb
from a workqueue context.  Thus it needs to call
netif_rx_ni() instead of netif_rx().
This change fixes the "NOHZ: local_softirq_pending 08"
messages I've been getting with rt2800usb.

Signed-off-by: Johannes Stezenbach <js@sig21.net>
--
 net/mac80211/status.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/net/mac80211/status.c b/net/mac80211/status.c
index bed7e32..ba8dd8e 100644
--- a/net/mac80211/status.c
+++ b/net/mac80211/status.c
@@ -403,7 +403,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_ni(skb2);
 				}
 			}
 
@@ -412,7 +412,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_ni(skb);
 		skb = NULL;
 	}
 	rcu_read_unlock();

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH RFC] mac80211: fix "NOHZ: local_softirq_pending 08"
  2010-11-29 14:54 [PATCH RFC] mac80211: fix "NOHZ: local_softirq_pending 08" Johannes Stezenbach
@ 2010-11-29 15:09 ` Johannes Berg
  2010-11-29 15:27   ` Johannes Stezenbach
  0 siblings, 1 reply; 12+ messages in thread
From: Johannes Berg @ 2010-11-29 15:09 UTC (permalink / raw)
  To: Johannes Stezenbach
  Cc: linux-wireless, Ivo van Doorn, Gertjan van Wingerde,
	John W. Linville

On Mon, 2010-11-29 at 15:54 +0100, Johannes Stezenbach wrote:
> ieee80211_tx_status() documentation says "This function may not be
> called in IRQ context", and it is called by rt2800usb
> from a workqueue context.  Thus it needs to call
> netif_rx_ni() instead of netif_rx().
> This change fixes the "NOHZ: local_softirq_pending 08"
> messages I've been getting with rt2800usb.

> -					netif_rx(skb2);
> +					netif_rx_ni(skb2);

That's kinda pointless though for drivers that already call it from a
tasklet or similar -- how about instead adding an
ieee80211_tx_status_ni() inline along the lines of ieee80211_rx_ni()?

johannes


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH RFC] mac80211: fix "NOHZ: local_softirq_pending 08"
  2010-11-29 15:09 ` Johannes Berg
@ 2010-11-29 15:27   ` Johannes Stezenbach
  2010-11-29 15:37     ` Johannes Berg
  0 siblings, 1 reply; 12+ messages in thread
From: Johannes Stezenbach @ 2010-11-29 15:27 UTC (permalink / raw)
  To: Johannes Berg
  Cc: linux-wireless, Ivo van Doorn, Gertjan van Wingerde,
	John W. Linville

On Mon, Nov 29, 2010 at 04:09:09PM +0100, Johannes Berg wrote:
> On Mon, 2010-11-29 at 15:54 +0100, Johannes Stezenbach wrote:
> > ieee80211_tx_status() documentation says "This function may not be
> > called in IRQ context", and it is called by rt2800usb
> > from a workqueue context.  Thus it needs to call
> > netif_rx_ni() instead of netif_rx().
> > This change fixes the "NOHZ: local_softirq_pending 08"
> > messages I've been getting with rt2800usb.
> 
> > -					netif_rx(skb2);
> > +					netif_rx_ni(skb2);
> 
> That's kinda pointless though for drivers that already call it from a
> tasklet or similar -- how about instead adding an
> ieee80211_tx_status_ni() inline along the lines of ieee80211_rx_ni()?

It gets confusing...
There already is ieee80211_tx_status_irqsafe(), but you want a third
option, right?

Johannes

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH RFC] mac80211: fix "NOHZ: local_softirq_pending 08"
  2010-11-29 15:27   ` Johannes Stezenbach
@ 2010-11-29 15:37     ` Johannes Berg
  2010-11-29 15:51       ` [PATCH v2 " Johannes Stezenbach
  0 siblings, 1 reply; 12+ messages in thread
From: Johannes Berg @ 2010-11-29 15:37 UTC (permalink / raw)
  To: Johannes Stezenbach
  Cc: linux-wireless, Ivo van Doorn, Gertjan van Wingerde,
	John W. Linville

On Mon, 2010-11-29 at 16:27 +0100, Johannes Stezenbach wrote:

> > That's kinda pointless though for drivers that already call it from a
> > tasklet or similar -- how about instead adding an
> > ieee80211_tx_status_ni() inline along the lines of ieee80211_rx_ni()?
> 
> It gets confusing...
> There already is ieee80211_tx_status_irqsafe(), but you want a third
> option, right?

Yes: _irqsafe has to go through the tasklet, _ni just has to disable
local BHs.

johannes


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2 RFC] mac80211: fix "NOHZ: local_softirq_pending 08"
  2010-11-29 15:37     ` Johannes Berg
@ 2010-11-29 15:51       ` Johannes Stezenbach
  2010-11-29 15:58         ` Johannes Berg
  0 siblings, 1 reply; 12+ messages in thread
From: Johannes Stezenbach @ 2010-11-29 15:51 UTC (permalink / raw)
  To: Johannes Berg
  Cc: linux-wireless, Ivo van Doorn, Gertjan van Wingerde,
	John W. Linville

ieee80211_tx_status() documentation says "This function may not be
called in IRQ context", and it is called by rt2800usb
from a workqueue context.  However, ieee80211_tx_status() is
meant to be called from tasklets and thus uses netif_rx().
Add a new ieee80211_tx_status_ni() which does the same
thing but uses netif_rx_ni() instead of netif_rx().

This change fixes the "NOHZ: local_softirq_pending 08"
messages I've been getting with rt2800usb.

Signed-off-by: Johannes Stezenbach <js@sig21.net>
---
v2: add ieee80211_tx_status_ni()

Note: the patch is now incomplete, rt2x00lib_txdone() is used by
several drivers and I'm currently checking if ieee80211_tx_status_ni()
can be used by all of them of if I need to split rt2x00lib_txdone()
in two versions.  An updated patch with the rt2x00
changes will follow, but I'm seeking feedback if the base
change here is OK.


 include/net/mac80211.h |   23 +++++++++++++++++++----
 net/mac80211/status.c  |   19 ++++++++++++++++---
 2 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index eaa4aff..df42312 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -2055,8 +2055,8 @@ static inline void ieee80211_rx_ni(struct ieee80211_hw *hw,
  *
  * This function may not be called in IRQ context. Calls to this function
  * for a single hardware must be synchronized against each other. Calls
- * to this function and ieee80211_tx_status_irqsafe() may not be mixed
- * for a single hardware.
+ * to this function, ieee80211_tx_status_ni() and ieee80211_tx_status_irqsafe()
+ * may not be mixed for a single hardware.
  *
  * @hw: the hardware the frame was transmitted by
  * @skb: the frame that was transmitted, owned by mac80211 after this call
@@ -2065,13 +2065,28 @@ void ieee80211_tx_status(struct ieee80211_hw *hw,
 			 struct sk_buff *skb);
 
 /**
+ * ieee80211_tx_status_ni - transmit status callback (in process context)
+ *
+ * Like ieee80211_tx_status() but can be called in process context.
+ *
+ * Calls to this function, ieee80211_tx_status() and
+ * ieee80211_tx_status_irqsafe() may not be mixed
+ * for a single hardware.
+ *
+ * @hw: the hardware the frame was transmitted by
+ * @skb: the frame that was transmitted, owned by mac80211 after this call
+ */
+void ieee80211_tx_status_ni(struct ieee80211_hw *hw,
+			    struct sk_buff *skb);
+
+/**
  * ieee80211_tx_status_irqsafe - IRQ-safe transmit status callback
  *
  * Like ieee80211_tx_status() but can be called in IRQ context
  * (internally defers to a tasklet.)
  *
- * Calls to this function and ieee80211_tx_status() may not be mixed for a
- * single hardware.
+ * Calls to this function, ieee80211_tx_status() and
+ * ieee80211_tx_status_ni() may not be mixed for a single hardware.
  *
  * @hw: the hardware the frame was transmitted by
  * @skb: the frame that was transmitted, owned by mac80211 after this call
diff --git a/net/mac80211/status.c b/net/mac80211/status.c
index bed7e32..ce4d239 100644
--- a/net/mac80211/status.c
+++ b/net/mac80211/status.c
@@ -170,7 +170,8 @@ static void ieee80211_frame_acked(struct sta_info *sta, struct sk_buff *skb)
  */
 #define STA_LOST_PKT_THRESHOLD	50
 
-void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
+void __ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb,
+			   int (*netif_rx_func)(struct sk_buff *skb))
 {
 	struct sk_buff *skb2;
 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
@@ -403,7 +404,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_func(skb2);
 				}
 			}
 
@@ -412,10 +413,22 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
 	}
 	if (prev_dev) {
 		skb->dev = prev_dev;
-		netif_rx(skb);
+		netif_rx_func(skb);
 		skb = NULL;
 	}
 	rcu_read_unlock();
 	dev_kfree_skb(skb);
 }
+
+void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
+{
+	__ieee80211_tx_status(hw, skb, netif_rx);
+}
 EXPORT_SYMBOL(ieee80211_tx_status);
+
+void ieee80211_tx_status_ni(struct ieee80211_hw *hw,
+			    struct sk_buff *skb)
+{
+	__ieee80211_tx_status(hw, skb, netif_rx_ni);
+}
+EXPORT_SYMBOL(ieee80211_tx_status_ni);

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v2 RFC] mac80211: fix "NOHZ: local_softirq_pending 08"
  2010-11-29 15:51       ` [PATCH v2 " Johannes Stezenbach
@ 2010-11-29 15:58         ` Johannes Berg
  2010-11-29 16:13           ` [PATCH v3 RFC] mac80211: add ieee80211_tx_status_ni() Johannes Stezenbach
  0 siblings, 1 reply; 12+ messages in thread
From: Johannes Berg @ 2010-11-29 15:58 UTC (permalink / raw)
  To: Johannes Stezenbach
  Cc: linux-wireless, Ivo van Doorn, Gertjan van Wingerde,
	John W. Linville

On Mon, 2010-11-29 at 16:51 +0100, Johannes Stezenbach wrote:


> -void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
> +void __ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb,
> +			   int (*netif_rx_func)(struct sk_buff *skb))

This seems weird to me -- why not just do

static inline void ieee80211_tx_status_ni(...)
{
	local_bh_disable();
	ieee80211_tx_status(...);
	local_bh_enable();
}

johannes


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v3 RFC] mac80211: add ieee80211_tx_status_ni()
  2010-11-29 15:58         ` Johannes Berg
@ 2010-11-29 16:13           ` Johannes Stezenbach
  2010-11-30 15:49             ` [PATCH v4] mac80211/rt2x00: " Johannes Stezenbach
  0 siblings, 1 reply; 12+ messages in thread
From: Johannes Stezenbach @ 2010-11-29 16:13 UTC (permalink / raw)
  To: Johannes Berg
  Cc: linux-wireless, Ivo van Doorn, Gertjan van Wingerde,
	John W. Linville, Helmut Schaa

ieee80211_tx_status() documentation says "This function may not be
called in IRQ context", and it is called by rt2800usb
from a workqueue context.  However, ieee80211_tx_status() is
meant to be called from tasklets and thus uses netif_rx().
Add a new ieee80211_tx_status_ni() which does the same
thing but is safe to be called from process context.

Using ieee80211_tx_status_ni() for rt2800usb fixes the
"NOHZ: local_softirq_pending 08" messages I've been getting.

Signed-off-by: Johannes Stezenbach <js@sig21.net>
---
v2: add ieee80211_tx_status_ni()
v3: simplify accorindg to review

Note: the patch is now incomplete, rt2x00lib_txdone() is used by
several drivers, rt2800usb calls it from a workqueue while
e.g. while rt2800pci calls it from a tasklet
(rt2800pci_txstatus_tasklet).  I need to sort this out with
the rt2x00 developers.


 include/net/mac80211.h |   28 ++++++++++++++++++++++++----
 1 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index eaa4aff..e411cf8 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -2055,8 +2055,8 @@ static inline void ieee80211_rx_ni(struct ieee80211_hw *hw,
  *
  * This function may not be called in IRQ context. Calls to this function
  * for a single hardware must be synchronized against each other. Calls
- * to this function and ieee80211_tx_status_irqsafe() may not be mixed
- * for a single hardware.
+ * to this function, ieee80211_tx_status_ni() and ieee80211_tx_status_irqsafe()
+ * may not be mixed for a single hardware.
  *
  * @hw: the hardware the frame was transmitted by
  * @skb: the frame that was transmitted, owned by mac80211 after this call
@@ -2065,13 +2065,33 @@ void ieee80211_tx_status(struct ieee80211_hw *hw,
 			 struct sk_buff *skb);
 
 /**
+ * ieee80211_tx_status_ni - transmit status callback (in process context)
+ *
+ * Like ieee80211_tx_status() but can be called in process context.
+ *
+ * Calls to this function, ieee80211_tx_status() and
+ * ieee80211_tx_status_irqsafe() may not be mixed
+ * for a single hardware.
+ *
+ * @hw: the hardware the frame was transmitted by
+ * @skb: the frame that was transmitted, owned by mac80211 after this call
+ */
+static inline void ieee80211_tx_status_ni(struct ieee80211_hw *hw,
+					  struct sk_buff *skb)
+{
+	local_bh_disable();
+	ieee80211_tx_status(hw, skb);
+	local_bh_enable();
+}
+
+/**
  * ieee80211_tx_status_irqsafe - IRQ-safe transmit status callback
  *
  * Like ieee80211_tx_status() but can be called in IRQ context
  * (internally defers to a tasklet.)
  *
- * Calls to this function and ieee80211_tx_status() may not be mixed for a
- * single hardware.
+ * Calls to this function, ieee80211_tx_status() and
+ * ieee80211_tx_status_ni() may not be mixed for a single hardware.
  *
  * @hw: the hardware the frame was transmitted by
  * @skb: the frame that was transmitted, owned by mac80211 after this call

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v4] mac80211/rt2x00: add ieee80211_tx_status_ni()
  2010-11-29 16:13           ` [PATCH v3 RFC] mac80211: add ieee80211_tx_status_ni() Johannes Stezenbach
@ 2010-11-30 15:49             ` Johannes Stezenbach
  2010-11-30 15:53               ` Johannes Berg
  0 siblings, 1 reply; 12+ messages in thread
From: Johannes Stezenbach @ 2010-11-30 15:49 UTC (permalink / raw)
  To: Johannes Berg
  Cc: linux-wireless, Ivo van Doorn, Gertjan van Wingerde,
	John W. Linville, Helmut Schaa

All rt2x00 drivers except rt2800pci call ieee80211_tx_status() from
a workqueue, which causes "NOHZ: local_softirq_pending 08" messages.

To fix it, add ieee80211_tx_status_ni() similar to ieee80211_rx_ni()
which can be called from process context, and call it from
rt2x00lib_txdone().  For the rt2800pci special case a driver
flag is introduced.

Signed-off-by: Johannes Stezenbach <js@sig21.net>
---
v2: add ieee80211_tx_status_ni()
v3: simplify accorindg to review
v4: add rt2x00 as first user of ieee80211_tx_status_ni()

The DRIVER_REQUIRE_TASKLET_CONTEXT flag may seem ugly, but there is
a pending rewrite of the rt2800pci irq handling code by
Helmut, so we decided to use this easy solution.

Note: Only tested with rt2800usb.

 drivers/net/wireless/rt2x00/rt2800pci.c |    1 +
 drivers/net/wireless/rt2x00/rt2x00.h    |    1 +
 drivers/net/wireless/rt2x00/rt2x00dev.c |    9 ++++++---
 include/net/mac80211.h                  |   28 ++++++++++++++++++++++++----
 4 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
index b48d2d3..3ef0228 100644
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
@@ -932,6 +932,7 @@ static int rt2800pci_probe_hw(struct rt2x00_dev *rt2x00dev)
 	__set_bit(DRIVER_REQUIRE_DMA, &rt2x00dev->flags);
 	__set_bit(DRIVER_REQUIRE_L2PAD, &rt2x00dev->flags);
 	__set_bit(DRIVER_REQUIRE_TXSTATUS_FIFO, &rt2x00dev->flags);
+	__set_bit(DRIVER_REQUIRE_TASKLET_CONTEXT, &rt2x00dev->flags);
 	if (!modparam_nohwcrypt)
 		__set_bit(CONFIG_SUPPORT_HW_CRYPTO, &rt2x00dev->flags);
 	__set_bit(DRIVER_SUPPORT_LINK_TUNING, &rt2x00dev->flags);
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index 556b744..28ea59a 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -670,6 +670,7 @@ enum rt2x00_flags {
 	DRIVER_REQUIRE_COPY_IV,
 	DRIVER_REQUIRE_L2PAD,
 	DRIVER_REQUIRE_TXSTATUS_FIFO,
+	DRIVER_REQUIRE_TASKLET_CONTEXT,
 
 	/*
 	 * Driver features
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index 87a421b..fa74acd 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -376,9 +376,12 @@ void rt2x00lib_txdone(struct queue_entry *entry,
 	 * through a mac80211 library call (RTS/CTS) then we should not
 	 * send the status report back.
 	 */
-	if (!(skbdesc_flags & SKBDESC_NOT_MAC80211))
-		ieee80211_tx_status(rt2x00dev->hw, entry->skb);
-	else
+	if (!(skbdesc_flags & SKBDESC_NOT_MAC80211)) {
+		if (test_bit(DRIVER_REQUIRE_TASKLET_CONTEXT, &rt2x00dev->flags))
+			ieee80211_tx_status(rt2x00dev->hw, entry->skb);
+		else
+			ieee80211_tx_status_ni(rt2x00dev->hw, entry->skb);
+	} else
 		dev_kfree_skb_any(entry->skb);
 
 	/*
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index eaa4aff..e411cf8 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -2055,8 +2055,8 @@ static inline void ieee80211_rx_ni(struct ieee80211_hw *hw,
  *
  * This function may not be called in IRQ context. Calls to this function
  * for a single hardware must be synchronized against each other. Calls
- * to this function and ieee80211_tx_status_irqsafe() may not be mixed
- * for a single hardware.
+ * to this function, ieee80211_tx_status_ni() and ieee80211_tx_status_irqsafe()
+ * may not be mixed for a single hardware.
  *
  * @hw: the hardware the frame was transmitted by
  * @skb: the frame that was transmitted, owned by mac80211 after this call
@@ -2065,13 +2065,33 @@ void ieee80211_tx_status(struct ieee80211_hw *hw,
 			 struct sk_buff *skb);
 
 /**
+ * ieee80211_tx_status_ni - transmit status callback (in process context)
+ *
+ * Like ieee80211_tx_status() but can be called in process context.
+ *
+ * Calls to this function, ieee80211_tx_status() and
+ * ieee80211_tx_status_irqsafe() may not be mixed
+ * for a single hardware.
+ *
+ * @hw: the hardware the frame was transmitted by
+ * @skb: the frame that was transmitted, owned by mac80211 after this call
+ */
+static inline void ieee80211_tx_status_ni(struct ieee80211_hw *hw,
+					  struct sk_buff *skb)
+{
+	local_bh_disable();
+	ieee80211_tx_status(hw, skb);
+	local_bh_enable();
+}
+
+/**
  * ieee80211_tx_status_irqsafe - IRQ-safe transmit status callback
  *
  * Like ieee80211_tx_status() but can be called in IRQ context
  * (internally defers to a tasklet.)
  *
- * Calls to this function and ieee80211_tx_status() may not be mixed for a
- * single hardware.
+ * Calls to this function, ieee80211_tx_status() and
+ * ieee80211_tx_status_ni() may not be mixed for a single hardware.
  *
  * @hw: the hardware the frame was transmitted by
  * @skb: the frame that was transmitted, owned by mac80211 after this call
-- 
1.7.2.3


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v4] mac80211/rt2x00: add ieee80211_tx_status_ni()
  2010-11-30 15:49             ` [PATCH v4] mac80211/rt2x00: " Johannes Stezenbach
@ 2010-11-30 15:53               ` Johannes Berg
  2010-11-30 16:34                 ` Johannes Stezenbach
  0 siblings, 1 reply; 12+ messages in thread
From: Johannes Berg @ 2010-11-30 15:53 UTC (permalink / raw)
  To: Johannes Stezenbach
  Cc: linux-wireless, Ivo van Doorn, Gertjan van Wingerde,
	John W. Linville, Helmut Schaa

On Tue, 2010-11-30 at 16:49 +0100, Johannes Stezenbach wrote:

>   * This function may not be called in IRQ context. Calls to this function
>   * for a single hardware must be synchronized against each other. Calls
> - * to this function and ieee80211_tx_status_irqsafe() may not be mixed
> - * for a single hardware.
> + * to this function, ieee80211_tx_status_ni() and ieee80211_tx_status_irqsafe()
> + * may not be mixed for a single hardware.

I'm ok with this, although technically you can mix
ieee80211_tx_status_ni() and ieee80211_tx_status(), just not either or
both of them with _irqsafe().

johannes


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v4] mac80211/rt2x00: add ieee80211_tx_status_ni()
  2010-11-30 15:53               ` Johannes Berg
@ 2010-11-30 16:34                 ` Johannes Stezenbach
  2010-11-30 16:35                   ` Johannes Berg
  0 siblings, 1 reply; 12+ messages in thread
From: Johannes Stezenbach @ 2010-11-30 16:34 UTC (permalink / raw)
  To: Johannes Berg
  Cc: linux-wireless, Ivo van Doorn, Gertjan van Wingerde,
	John W. Linville, Helmut Schaa

On Tue, Nov 30, 2010 at 04:53:00PM +0100, Johannes Berg wrote:
> On Tue, 2010-11-30 at 16:49 +0100, Johannes Stezenbach wrote:
> 
> >   * This function may not be called in IRQ context. Calls to this function
> >   * for a single hardware must be synchronized against each other. Calls
> > - * to this function and ieee80211_tx_status_irqsafe() may not be mixed
> > - * for a single hardware.
> > + * to this function, ieee80211_tx_status_ni() and ieee80211_tx_status_irqsafe()
> > + * may not be mixed for a single hardware.
> 
> I'm ok with this, although technically you can mix
> ieee80211_tx_status_ni() and ieee80211_tx_status(), just not either or
> both of them with _irqsafe().

I copied these from ieee80211_rx() etc. since I wasn't sure if there's
not some subtlety I didn't get.  One can mix ieee80211_rx() and
ieee80211_rx_ni(), too, right?


Thanks
Johannes

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v4] mac80211/rt2x00: add ieee80211_tx_status_ni()
  2010-11-30 16:34                 ` Johannes Stezenbach
@ 2010-11-30 16:35                   ` Johannes Berg
  2010-11-30 18:38                     ` John W. Linville
  0 siblings, 1 reply; 12+ messages in thread
From: Johannes Berg @ 2010-11-30 16:35 UTC (permalink / raw)
  To: Johannes Stezenbach
  Cc: linux-wireless, Ivo van Doorn, Gertjan van Wingerde,
	John W. Linville, Helmut Schaa

On Tue, 2010-11-30 at 17:34 +0100, Johannes Stezenbach wrote:
> On Tue, Nov 30, 2010 at 04:53:00PM +0100, Johannes Berg wrote:
> > On Tue, 2010-11-30 at 16:49 +0100, Johannes Stezenbach wrote:
> > 
> > >   * This function may not be called in IRQ context. Calls to this function
> > >   * for a single hardware must be synchronized against each other. Calls
> > > - * to this function and ieee80211_tx_status_irqsafe() may not be mixed
> > > - * for a single hardware.
> > > + * to this function, ieee80211_tx_status_ni() and ieee80211_tx_status_irqsafe()
> > > + * may not be mixed for a single hardware.
> > 
> > I'm ok with this, although technically you can mix
> > ieee80211_tx_status_ni() and ieee80211_tx_status(), just not either or
> > both of them with _irqsafe().
> 
> I copied these from ieee80211_rx() etc. since I wasn't sure if there's
> not some subtlety I didn't get.  One can mix ieee80211_rx() and
> ieee80211_rx_ni(), too, right?

Yes. Note that all this doesn't make any sense though, since you must
never call them concurrently. And it's hard to imagine a situation where
a single driver calls _ni and non-_ni versions, while making sure they
can't both happen at the same time ...

johannes


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v4] mac80211/rt2x00: add ieee80211_tx_status_ni()
  2010-11-30 16:35                   ` Johannes Berg
@ 2010-11-30 18:38                     ` John W. Linville
  0 siblings, 0 replies; 12+ messages in thread
From: John W. Linville @ 2010-11-30 18:38 UTC (permalink / raw)
  To: Johannes Berg
  Cc: Johannes Stezenbach, linux-wireless, Ivo van Doorn,
	Gertjan van Wingerde, Helmut Schaa

On Tue, Nov 30, 2010 at 05:35:58PM +0100, Johannes Berg wrote:
> On Tue, 2010-11-30 at 17:34 +0100, Johannes Stezenbach wrote:
> > On Tue, Nov 30, 2010 at 04:53:00PM +0100, Johannes Berg wrote:
> > > On Tue, 2010-11-30 at 16:49 +0100, Johannes Stezenbach wrote:
> > > 
> > > >   * This function may not be called in IRQ context. Calls to this function
> > > >   * for a single hardware must be synchronized against each other. Calls
> > > > - * to this function and ieee80211_tx_status_irqsafe() may not be mixed
> > > > - * for a single hardware.
> > > > + * to this function, ieee80211_tx_status_ni() and ieee80211_tx_status_irqsafe()
> > > > + * may not be mixed for a single hardware.
> > > 
> > > I'm ok with this, although technically you can mix
> > > ieee80211_tx_status_ni() and ieee80211_tx_status(), just not either or
> > > both of them with _irqsafe().
> > 
> > I copied these from ieee80211_rx() etc. since I wasn't sure if there's
> > not some subtlety I didn't get.  One can mix ieee80211_rx() and
> > ieee80211_rx_ni(), too, right?
> 
> Yes. Note that all this doesn't make any sense though, since you must
> never call them concurrently. And it's hard to imagine a situation where
> a single driver calls _ni and non-_ni versions, while making sure they
> can't both happen at the same time ...

Maybe someone can clarify the wording of the comments and send a follow-on patch?

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] 12+ messages in thread

end of thread, other threads:[~2010-11-30 18:44 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-29 14:54 [PATCH RFC] mac80211: fix "NOHZ: local_softirq_pending 08" Johannes Stezenbach
2010-11-29 15:09 ` Johannes Berg
2010-11-29 15:27   ` Johannes Stezenbach
2010-11-29 15:37     ` Johannes Berg
2010-11-29 15:51       ` [PATCH v2 " Johannes Stezenbach
2010-11-29 15:58         ` Johannes Berg
2010-11-29 16:13           ` [PATCH v3 RFC] mac80211: add ieee80211_tx_status_ni() Johannes Stezenbach
2010-11-30 15:49             ` [PATCH v4] mac80211/rt2x00: " Johannes Stezenbach
2010-11-30 15:53               ` Johannes Berg
2010-11-30 16:34                 ` Johannes Stezenbach
2010-11-30 16:35                   ` Johannes Berg
2010-11-30 18:38                     ` John W. Linville

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).