Re: [PATCH] sata_sx4: speed up ECC initialization

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Apr 14, 2009 at 07:57:57AM -0400, Jeff Garzik wrote:
> Alexander Beregalov wrote:
> > ECC initialization takes too long. It writes zeroes by portions of 4
> > byte, it takes more than 6 minutes to initialize 512Mb DIMM module.
> > Change portion to 1Mb.
> > 
> > before:
> > [10857.207576] pdc20621_dimm_init: Start ECC initialization
> > [11235.333118] pdc20621_dimm_init: Finish ECC initialization
> > 
> > after:
> > [ 1005.126437] pdc20621_dimm_init: Local DIMM Speed = 100
> > [ 1005.128111] pdc20621_dimm_init: Local DIMM Size = 512MB
> > [ 1005.133508] Local DIMM ECC Enabled
> > [ 1005.236482] pdc20621_dimm_init: Start ECC initialization
> > [ 1031.278098] pdc20621_dimm_init: Finish ECC initialization
> > 
> Comments:
> 
> 1) on an older machine, where these things might be found, 1MB might be 
> a lot -- particularly if there is a lot of VM fragmentation.  Please 
> reduce the size a bit -- I suppose 128k is not unbearably slow?
> 
> 2) Rather than repeating 'page size * 32' calculation multiple times, 
> put it into a named constant somewhere.
> 
> Other than that, looks ok!


>From 00e980a4651ef12811fbe9a893a7e72510b955d1 Mon Sep 17 00:00:00 2001
From: Alexander Beregalov <a.beregalov@xxxxxxxxx>
Date: Tue, 14 Apr 2009 23:55:52 +0400
Subject: [PATCH v2] sata_sx4: speed up ECC initialization

ECC initialization takes too long. It writes zeroes by portions
of 4 byte, it takes more than 6 minutes on my machine to initialize
512Mb ECC DIMM module. Change portion to 128Kb - it significantly
reduces initialization time.

Signed-off-by: Alexander Beregalov <a.beregalov@xxxxxxxxx>
---
 drivers/ata/sata_sx4.c |   11 +++++++----
 1 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/ata/sata_sx4.c b/drivers/ata/sata_sx4.c
index dce3dcc..197a4d7 100644
--- a/drivers/ata/sata_sx4.c
+++ b/drivers/ata/sata_sx4.c
@@ -193,6 +193,7 @@ enum {
 					  PDC_TIMER_MASK_INT,
 };
 
+#define ECC_ERASE_BUF 128 * 1024;
 
 struct pdc_port_priv {
 	u8			dimm_buf[(ATA_PRD_SZ * ATA_MAX_PRD) + 512];
@@ -1208,7 +1209,6 @@ static unsigned int pdc20621_dimm_init(struct ata_host *host)
 {
 	int speed, size, length;
 	u32 addr, spd0, pci_status;
-	u32 tmp = 0;
 	u32 time_period = 0;
 	u32 tcount = 0;
 	u32 ticks = 0;
@@ -1323,14 +1323,17 @@ static unsigned int pdc20621_dimm_init(struct ata_host *host)
 	pdc20621_i2c_read(host, PDC_DIMM0_SPD_DEV_ADDRESS,
 			  PDC_DIMM_SPD_TYPE, &spd0);
 	if (spd0 == 0x02) {
+		void *buf;
 		VPRINTK("Start ECC initialization\n");
 		addr = 0;
 		length = size * 1024 * 1024;
+		buf = kzalloc(ECC_ERASE_BUF, GFP_KERNEL);
 		while (addr < length) {
-			pdc20621_put_to_dimm(host, (void *) &tmp, addr,
-					     sizeof(u32));
-			addr += sizeof(u32);
+			pdc20621_put_to_dimm(host, buf, addr,
+					     ECC_ERASE_BUF);
+			addr += ECC_ERASE_BUF;
 		}
+		kfree(buf);
 		VPRINTK("Finish ECC initialization\n");
 	}
 	return 0;
-- 
1.6.2.3

--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Filesystems]     [Linux SCSI]     [Linux RAID]     [Git]     [Kernel Newbies]     [Linux Newbie]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Samba]     [Device Mapper]

  Powered by Linux