Commit 243cd55e authored by Michael Ellerman's avatar Michael Ellerman Committed by Linus Torvalds
Browse files

[PATCH] iseries_veth: Supress spurious WARN_ON() at module unload



My patch from a few weeks back (now in mainline), called "Cleanup skbs to
prevent unregister_netdevice() hanging", can cause our TX timeout code to
fire on machines with lots of VLANs (because it takes > 2 seconds between
when we stop the queues and when we're finished stopping the connections).

When that happens the TX timeout code freaks out and does a WARN_ON()
because as far as it's concerned there shouldn't be a TX timeout happening,
which is fair enough.

I have a "proper" fix for this, which is to a) do refcounting on
connections and b) implement a proper ack timer so we don't keep unacked
skbs lying around for ever.  But for 2.6.12 I propose just supressing the
WARN_ON().  Users will still see the "NETDEV WATCHDOG" warning, but that's
not nearly as bad as a WARN_ON() which users interpret as an Oops.

Signed-off-by: default avatarMichael Ellerman <michael@ellerman.id.au>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 7fbdf1a2
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -802,13 +802,14 @@ static void veth_tx_timeout(struct net_device *dev)

	spin_lock_irqsave(&port->pending_gate, flags);

	if (!port->pending_lpmask) {
		spin_unlock_irqrestore(&port->pending_gate, flags);
		return;
	}

	printk(KERN_WARNING "%s: Tx timeout!  Resetting lp connections: %08x\n",
	       dev->name, port->pending_lpmask);

	/* If we've timed out the queue must be stopped, which should
	 * only ever happen when there is a pending packet. */
	WARN_ON(! port->pending_lpmask);

	for (i = 0; i < HVMAXARCHITECTEDLPS; i++) {
		struct veth_lpar_connection *cnx = veth_cnx[i];