summaryrefslogtreecommitdiffstats
path: root/patches/u-boot-2011.09/0011-ext2load-increase-read-speed.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/u-boot-2011.09/0011-ext2load-increase-read-speed.patch')
-rw-r--r--patches/u-boot-2011.09/0011-ext2load-increase-read-speed.patch74
1 files changed, 74 insertions, 0 deletions
diff --git a/patches/u-boot-2011.09/0011-ext2load-increase-read-speed.patch b/patches/u-boot-2011.09/0011-ext2load-increase-read-speed.patch
new file mode 100644
index 0000000..ba86266
--- /dev/null
+++ b/patches/u-boot-2011.09/0011-ext2load-increase-read-speed.patch
@@ -0,0 +1,74 @@
+From 486ce56b1203dd71bad310940b321d3ae13cadec Mon Sep 17 00:00:00 2001
+From: u-boot@lakedaemon.net <u-boot@lakedaemon.net>
+Date: Wed, 28 Mar 2012 04:37:11 +0000
+Subject: [PATCH 11/15] ext2load: increase read speed
+
+This patch dramatically drops the amount of time u-boot needs to read a
+file from an ext2 partition. On a typical 2 to 5 MB file (kernels and
+initrds) it goes from tens of seconds to a couple seconds.
+
+All we are doing here is grouping contiguous blocks into one read.
+
+Boot tested on Globalscale Technologies Dreamplug (Kirkwood ARM SoC)
+with three different files. sha1sums were calculated in Linux
+userspace, and then confirmed after ext2load.
+
+Signed-off-by: Jason Cooper <u-boot@lakedaemon.net>
+---
+ fs/ext2/ext2fs.c | 26 ++++++++++++++++++++++++--
+ 1 files changed, 24 insertions(+), 2 deletions(-)
+
+diff --git a/fs/ext2/ext2fs.c b/fs/ext2/ext2fs.c
+index e119e13..8531db5 100644
+--- a/fs/ext2/ext2fs.c
++++ b/fs/ext2/ext2fs.c
+@@ -414,7 +414,6 @@ int ext2fs_read_file
+ if (blknr < 0) {
+ return (-1);
+ }
+- blknr = blknr << log2blocksize;
+
+ /* Last block. */
+ if (i == blockcnt - 1) {
+@@ -432,6 +431,29 @@ int ext2fs_read_file
+ blockend -= skipfirst;
+ }
+
++ /* grab middle blocks in one go */
++ if (i != pos / blocksize && i != blockcnt - 1 && blockcnt > 3) {
++ int oldblk = blknr;
++ int blocknxt;
++ while (i < blockcnt - 1) {
++ blocknxt = ext2fs_read_block(node, i + 1);
++ if (blocknxt == (oldblk + 1)) {
++ oldblk = blocknxt;
++ i++;
++ } else {
++ blocknxt = ext2fs_read_block(node, i);
++ break;
++ }
++ }
++
++ if (oldblk == blknr)
++ blockend = blocksize;
++ else
++ blockend = (1 + blocknxt - blknr) * blocksize;
++ }
++
++ blknr = blknr << log2blocksize;
++
+ /* If the block number is 0 this block is not stored on disk but
+ is zero filled instead. */
+ if (blknr) {
+@@ -444,7 +466,7 @@ int ext2fs_read_file
+ } else {
+ memset (buf, 0, blocksize - skipfirst);
+ }
+- buf += blocksize - skipfirst;
++ buf += blockend - skipfirst;
+ }
+ return (len);
+ }
+--
+1.7.2.5
+