netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Chris Metcalf <cmetcalf@tilera.com>
To: <linux-kernel@vger.kernel.org>, <netdev@vger.kernel.org>
Subject: [PATCH 08/13] tile: fix panic bug in napi support for tilegx network driver
Date: Tue, 23 Jul 2013 16:05:48 -0400	[thread overview]
Message-ID: <7d5cffa369c00feb0fcda0386c6c241ef2e253a3.1374609949.git.cmetcalf@tilera.com> (raw)
In-Reply-To: <cover.1374609948.git.cmetcalf@tilera.com>

The code used to call napi_disable() in an interrupt handler
(from smp_call_function), which in turn could call msleep().
Unfortunately you can't sleep in an interrupt context.

Luckily it turns out all the NAPI support functions are
just operating on data structures and not on any deeply
per-cpu data, so we can arrange to set up and tear down all
the NAPI state on the core driving the process, and just
do the IRQ enable/disable as a smp_call_function thing.

Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
---
 drivers/net/ethernet/tile/tilegx.c | 65 +++++++++++++++++++-------------------
 1 file changed, 33 insertions(+), 32 deletions(-)

diff --git a/drivers/net/ethernet/tile/tilegx.c b/drivers/net/ethernet/tile/tilegx.c
index a245858..b34fd2c 100644
--- a/drivers/net/ethernet/tile/tilegx.c
+++ b/drivers/net/ethernet/tile/tilegx.c
@@ -686,37 +686,13 @@ static enum hrtimer_restart tile_net_handle_egress_timer(struct hrtimer *t)
 	return HRTIMER_NORESTART;
 }
 
-/* Helper function for "tile_net_update()".
- * "dev" (i.e. arg) is the device being brought up or down,
- * or NULL if all devices are now down.
- */
-static void tile_net_update_cpu(void *arg)
+/* Helper function for "tile_net_update()". */
+static void manage_ingress_irq(void *enable)
 {
-	struct tile_net_info *info = &__get_cpu_var(per_cpu_info);
-	struct net_device *dev = arg;
-
-	if (!info->has_iqueue)
-		return;
-
-	if (dev != NULL) {
-		if (!info->napi_added) {
-			netif_napi_add(dev, &info->napi,
-				       tile_net_poll, TILE_NET_WEIGHT);
-			info->napi_added = true;
-		}
-		if (!info->napi_enabled) {
-			napi_enable(&info->napi);
-			info->napi_enabled = true;
-		}
+	if (enable)
 		enable_percpu_irq(ingress_irq, 0);
-	} else {
+	else
 		disable_percpu_irq(ingress_irq);
-		if (info->napi_enabled) {
-			napi_disable(&info->napi);
-			info->napi_enabled = false;
-		}
-		/* FIXME: Drain the iqueue. */
-	}
 }
 
 /* Helper function for tile_net_open() and tile_net_stop().
@@ -753,10 +729,35 @@ static int tile_net_update(struct net_device *dev)
 		return -EIO;
 	}
 
-	/* Update all cpus, sequentially (to protect "netif_napi_add()"). */
-	for_each_online_cpu(cpu)
-		smp_call_function_single(cpu, tile_net_update_cpu,
-					 (saw_channel ? dev : NULL), 1);
+	/* Update all cpus, sequentially (to protect "netif_napi_add()").
+	 * We use on_each_cpu to handle the IPI mask or unmask.
+	 */
+	if (!saw_channel)
+		on_each_cpu(manage_ingress_irq, (void *)0, 1);
+	for_each_online_cpu(cpu) {
+		struct tile_net_info *info = &per_cpu(per_cpu_info, cpu);
+		if (!info->has_iqueue)
+			continue;
+		if (saw_channel) {
+			if (!info->napi_added) {
+				netif_napi_add(dev, &info->napi,
+					       tile_net_poll, TILE_NET_WEIGHT);
+				info->napi_added = true;
+			}
+			if (!info->napi_enabled) {
+				napi_enable(&info->napi);
+				info->napi_enabled = true;
+			}
+		} else {
+			if (info->napi_enabled) {
+				napi_disable(&info->napi);
+				info->napi_enabled = false;
+			}
+			/* FIXME: Drain the iqueue. */
+		}
+	}
+	if (saw_channel)
+		on_each_cpu(manage_ingress_irq, (void *)1, 1);
 
 	/* HACK: Allow packets to flow in the simulator. */
 	if (saw_channel)
-- 
1.8.3.1

  parent reply	other threads:[~2013-07-23 20:05 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-23 20:05 [PATCH 00/13] update tile network drivers Chris Metcalf
2013-07-23 20:05 ` [PATCH 04/13] tile: remove dead is_dup_ack() function from tilepro net driver Chris Metcalf
2013-07-23 20:05 ` [PATCH 03/13] tile: avoid bug in tilepro net driver built with old hypervisor Chris Metcalf
2013-07-23 20:05 ` [PATCH 11/13] tile: support TSO for IPv6 in tilegx network driver Chris Metcalf
2013-07-23 20:05 ` [PATCH 02/13] tile: support rx_dropped/rx_errors in tilepro net driver Chris Metcalf
2013-07-23 20:05 ` Chris Metcalf [this message]
2013-07-23 20:05 ` [PATCH 01/13] tile: handle 64-bit statistics in tilepro network driver Chris Metcalf
2013-07-24  9:31   ` David Miller
2013-07-25 16:41   ` [PATCH v2] " Chris Metcalf
2013-07-30 23:16     ` David Miller
2013-07-31  0:34       ` Chris Metcalf
2013-07-31  0:36         ` David Miller
2013-07-23 20:05 ` [PATCH 07/13] tile: update dev->stats directly in tilegx " Chris Metcalf
2013-07-23 20:05 ` [PATCH 05/13] tile: support PTP using the tilegx mPIPE (IEEE 1588) Chris Metcalf
2013-07-24  6:25   ` Richard Cochran
2013-07-24  6:29   ` Richard Cochran
2013-07-24 16:17     ` Chris Metcalf
2013-07-25 15:19   ` [PATCH v2] " Chris Metcalf
2013-07-25 17:55     ` Richard Cochran
2013-07-23 20:05 ` [PATCH 09/13] tile: enable GRO in the tilegx network driver Chris Metcalf
2013-07-23 21:19   ` Eric Dumazet
2013-07-23 22:26     ` Chris Metcalf
2013-07-23 20:05 ` [PATCH 12/13] tile: make "tile_net.custom" a proper bool module parameter Chris Metcalf
2013-07-23 20:05 ` [PATCH 10/13] tile: support multiple mPIPE shims in tilegx network driver Chris Metcalf
2013-07-23 20:05 ` [PATCH 13/13] tile: remove deprecated NETIF_F_LLTX flag from tile drivers Chris Metcalf
2013-07-23 20:05 ` [PATCH 06/13] tile: support jumbo frames in the tilegx network driver Chris Metcalf
2013-07-31 15:05 ` [PATCH v2 00/12] update tile network drivers Chris Metcalf
2013-07-31 15:05   ` [PATCH 03/12] tile: remove dead is_dup_ack() function from tilepro net driver Chris Metcalf
2013-07-31 15:05   ` [PATCH 04/12] tile: support jumbo frames in the tilegx network driver Chris Metcalf
2013-07-31 15:05   ` [PATCH 06/12] tile: fix panic bug in napi support for " Chris Metcalf
2013-07-31 15:05   ` [PATCH 01/12] tile: support rx_dropped/rx_errors in tilepro net driver Chris Metcalf
2013-07-31 15:05   ` [PATCH 11/12] tile: remove deprecated NETIF_F_LLTX flag from tile drivers Chris Metcalf
2013-07-31 15:05   ` [PATCH 12/12] tile: support PTP using the tilegx mPIPE (IEEE 1588) Chris Metcalf
2013-07-31 15:05   ` [PATCH 10/12] tile: make "tile_net.custom" a proper bool module parameter Chris Metcalf
2013-07-31 15:05   ` [PATCH 07/12] tile: enable GRO in the tilegx network driver Chris Metcalf
2013-07-31 15:05   ` [PATCH 09/12] tile: support TSO for IPv6 in " Chris Metcalf
2013-07-31 19:25     ` David Miller
2013-08-01 15:36       ` [PATCH v2 13/12] tile: set hw_features and vlan_features in setup Chris Metcalf
2013-08-01 18:31         ` David Miller
2013-08-01 19:25         ` [PATCH v3 00/13] update tile network drivers Chris Metcalf
2013-08-01 15:36           ` [PATCH v3 02/13] tile: support rx_dropped/rx_errors in tilepro net driver Chris Metcalf
2013-08-01 15:36           ` [PATCH v3 06/13] tile: update dev->stats directly in tilegx network driver Chris Metcalf
2013-08-01 15:36           ` [PATCH v3 08/13] tile: enable GRO in the " Chris Metcalf
2013-08-01 15:36           ` [PATCH v3 09/13] tile: support multiple mPIPE shims in " Chris Metcalf
2013-08-01 15:36           ` [PATCH v3 05/13] tile: support jumbo frames in the " Chris Metcalf
2013-08-01 15:36           ` [PATCH v3 04/13] tile: remove dead is_dup_ack() function from tilepro net driver Chris Metcalf
2013-08-01 15:36           ` [PATCH v3 03/13] tile: avoid bug in tilepro net driver built with old hypervisor Chris Metcalf
2013-08-01 15:36           ` [PATCH v3 13/13] tile: support PTP using the tilegx mPIPE (IEEE 1588) Chris Metcalf
2013-08-01 15:36           ` [PATCH v3 10/13] tile: support TSO for IPv6 in tilegx network driver Chris Metcalf
2013-08-01 15:36           ` [PATCH v3 12/13] tile: remove deprecated NETIF_F_LLTX flag from tile drivers Chris Metcalf
2013-08-01 15:36           ` [PATCH v3 01/13] tile: set hw_features and vlan_features in setup Chris Metcalf
2013-08-01 15:36           ` [PATCH v3 07/13] tile: fix panic bug in napi support for tilegx network driver Chris Metcalf
2013-08-01 15:36           ` [PATCH v3 11/13] tile: make "tile_net.custom" a proper bool module parameter Chris Metcalf
2013-08-01 21:42           ` [PATCH v3 00/13] update tile network drivers David Miller
2013-07-31 15:05   ` [PATCH 08/12] tile: support multiple mPIPE shims in tilegx network driver Chris Metcalf
2013-07-31 15:05   ` [PATCH 02/12] tile: avoid bug in tilepro net driver built with old hypervisor Chris Metcalf
2013-07-31 15:05   ` [PATCH 05/12] tile: update dev->stats directly in tilegx network driver Chris Metcalf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7d5cffa369c00feb0fcda0386c6c241ef2e253a3.1374609949.git.cmetcalf@tilera.com \
    --to=cmetcalf@tilera.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).