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-prev] [thread-next>] [day] [month] [year] [list]
Date:	Tue, 29 Dec 2009 09:30:23 -0800
From:	Stephen Hemminger <shemminger@...ux-foundation.org>
To:	Michael Breuer <mbreuer@...jas.com>
Cc:	Andrew Morton <akpm@...ux-foundation.org>,
	"Berck E. Nash" <flyboy@...il.com>,
	"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
	netdev@...r.kernel.org
Subject: Re: sky2 panic in 2.6.32.1 under load (new oops)

There could be DMA problems, either because chip isn't remembering
upper address, or because of lack of wires from chip to memory controller;
there have been problems on motherboards where I/O devices couldn't access
all of memory.

Try this, it forces each transmit to have full 64 bit address. It drops an
optimization that was done to reduce the number of transmit descriptors
used.

--- a/drivers/net/sky2.c	2009-12-29 09:23:37.114074275 -0800
+++ b/drivers/net/sky2.c	2009-12-29 09:26:38.699912035 -0800
@@ -1038,10 +1038,11 @@ static void tx_init(struct sky2_port *sk
 	sky2->tx_tcpsum = 0;
 	sky2->tx_last_mss = 0;
 
-	le = get_tx_le(sky2, &sky2->tx_prod);
-	le->addr = 0;
-	le->opcode = OP_ADDR64 | HW_OWNER;
-	sky2->tx_last_upper = 0;
+	if (sizeof(dma_addr_t) == sizeof(u32)) {
+		le = get_tx_le(sky2, &sky2->tx_prod);
+		le->addr = 0;
+		le->opcode = OP_ADDR64 | HW_OWNER;
+	}
 }
 
 /* Update chip's next pointer */
@@ -1669,10 +1670,9 @@ static netdev_tx_t sky2_xmit_frame(struc
 
 	/* Send high bits if needed */
 	upper = upper_32_bits(mapping);
-	if (upper != sky2->tx_last_upper) {
+	if (sizeof(mapping) > sizeof(u32)) {
 		le = get_tx_le(sky2, &slot);
 		le->addr = cpu_to_le32(upper);
-		sky2->tx_last_upper = upper;
 		le->opcode = OP_ADDR64 | HW_OWNER;
 	}
 
@@ -1762,10 +1762,9 @@ static netdev_tx_t sky2_xmit_frame(struc
 			goto mapping_unwind;
 
 		upper = upper_32_bits(mapping);
-		if (upper != sky2->tx_last_upper) {
+		if (sizeof(mapping) > sizeof(u32)) {
 			le = get_tx_le(sky2, &slot);
 			le->addr = cpu_to_le32(upper);
-			sky2->tx_last_upper = upper;
 			le->opcode = OP_ADDR64 | HW_OWNER;
 		}
 
--- a/drivers/net/sky2.h	2009-12-29 09:23:37.164072886 -0800
+++ b/drivers/net/sky2.h	2009-12-29 09:25:15.302197993 -0800
@@ -2191,7 +2191,6 @@ struct sky2_port {
 
 	u16		     tx_pending;
 	u16		     tx_last_mss;
-	u32		     tx_last_upper;
 	u32		     tx_tcpsum;
 
 	struct rx_ring_info  *rx_ring ____cacheline_aligned_in_smp;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ