lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:	Thu, 15 Jan 2009 19:30:16 +0100
From:	Richard Röjfors <richard.rojfors@...ian.se>
To:	netdev@...r.kernel.org
Subject: [PATCH] macb: avoid lockup when TGO during underrun

This patch against linux-2.6.28 solves an issue where macb might run out of TX buffers.

In rare cases when an underrun occur, all macb buffers where consumed and the netif_queue was stopped infinitely. This
happens then the TGO (transfer ongoing) bit in the TSR is set (and UND). It seems like clening up after the underrun
makes the driver and the macb hardware end up in an inconsistent state. The result of this is that in the following
calls to macb_tx no TX buffers are released -> the netif_queue was stopped, and never woken up again.

The solution is to disable the transmitter, if TGO is set, before clening up after the underrun, and re-enable the
transmitter when the cleaning up is done.


A patch to avoid lockup in the macb driver in some rare underrun cases.
Signed-off-by: Richard Röjfors <richard.rojfors@...ian.se>

---

diff -urpN linux-2.6.28/drivers/net/macb.c linux-2.6.28-macb/drivers/net/macb.c
--- linux-2.6.28/drivers/net/macb.c	2008-12-25 00:26:37.000000000 +0100
+++ linux-2.6.28-macb/drivers/net/macb.c	2009-01-15 19:06:04.000000000 +0100
@@ -321,6 +321,10 @@ static void macb_tx(struct macb *bp)
 		printk(KERN_ERR "%s: TX underrun, resetting buffers\n",
 			bp->dev->name);

+		/* Transfer ongoing, disable transmitter, to avoid confusion */
+		if (status & MACB_BIT(TGO))
+			macb_writel(bp, NCR, macb_readl(bp, NCR) & ~MACB_BIT(TE));
+
 		head = bp->tx_head;

 		/*Mark all the buffer as used to avoid sending a lost buffer*/
@@ -343,6 +347,10 @@ static void macb_tx(struct macb *bp)
 		}

 		bp->tx_head = bp->tx_tail = 0;
+
+		/* Enable the transmitter again */
+		if (status & MACB_BIT(TGO))
+			macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(TE));
 	}

 	if (!(status & MACB_BIT(COMP)))

--Richard

View attachment "macb-und-tgo.patch" of type "text/plain" (1032 bytes)

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ