diff options
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.patch | 74 |
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 + |