summaryrefslogtreecommitdiffstats
path: root/recipes-bsp/u-boot/u-boot/2011.09git/0006-ext2load-increase-read-speed.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-bsp/u-boot/u-boot/2011.09git/0006-ext2load-increase-read-speed.patch')
-rw-r--r--recipes-bsp/u-boot/u-boot/2011.09git/0006-ext2load-increase-read-speed.patch74
1 files changed, 74 insertions, 0 deletions
diff --git a/recipes-bsp/u-boot/u-boot/2011.09git/0006-ext2load-increase-read-speed.patch b/recipes-bsp/u-boot/u-boot/2011.09git/0006-ext2load-increase-read-speed.patch
new file mode 100644
index 00000000..ee33d908
--- /dev/null
+++ b/recipes-bsp/u-boot/u-boot/2011.09git/0006-ext2load-increase-read-speed.patch
@@ -0,0 +1,74 @@
1From f6894e8bc193d225267e4d58a633354e9937c93d Mon Sep 17 00:00:00 2001
2From: "u-boot@lakedaemon.net" <u-boot@lakedaemon.net>
3Date: Wed, 28 Mar 2012 04:37:11 +0000
4Subject: [PATCH 06/10] ext2load: increase read speed
5
6This patch dramatically drops the amount of time u-boot needs to read a
7file from an ext2 partition. On a typical 2 to 5 MB file (kernels and
8initrds) it goes from tens of seconds to a couple seconds.
9
10All we are doing here is grouping contiguous blocks into one read.
11
12Boot tested on Globalscale Technologies Dreamplug (Kirkwood ARM SoC)
13with three different files. sha1sums were calculated in Linux
14userspace, and then confirmed after ext2load.
15
16Signed-off-by: Jason Cooper <u-boot@lakedaemon.net>
17---
18 fs/ext2/ext2fs.c | 26 ++++++++++++++++++++++++--
19 1 file changed, 24 insertions(+), 2 deletions(-)
20
21diff --git a/fs/ext2/ext2fs.c b/fs/ext2/ext2fs.c
22index e119e13..8531db5 100644
23--- a/fs/ext2/ext2fs.c
24+++ b/fs/ext2/ext2fs.c
25@@ -414,7 +414,6 @@ int ext2fs_read_file
26 if (blknr < 0) {
27 return (-1);
28 }
29- blknr = blknr << log2blocksize;
30
31 /* Last block. */
32 if (i == blockcnt - 1) {
33@@ -432,6 +431,29 @@ int ext2fs_read_file
34 blockend -= skipfirst;
35 }
36
37+ /* grab middle blocks in one go */
38+ if (i != pos / blocksize && i != blockcnt - 1 && blockcnt > 3) {
39+ int oldblk = blknr;
40+ int blocknxt;
41+ while (i < blockcnt - 1) {
42+ blocknxt = ext2fs_read_block(node, i + 1);
43+ if (blocknxt == (oldblk + 1)) {
44+ oldblk = blocknxt;
45+ i++;
46+ } else {
47+ blocknxt = ext2fs_read_block(node, i);
48+ break;
49+ }
50+ }
51+
52+ if (oldblk == blknr)
53+ blockend = blocksize;
54+ else
55+ blockend = (1 + blocknxt - blknr) * blocksize;
56+ }
57+
58+ blknr = blknr << log2blocksize;
59+
60 /* If the block number is 0 this block is not stored on disk but
61 is zero filled instead. */
62 if (blknr) {
63@@ -444,7 +466,7 @@ int ext2fs_read_file
64 } else {
65 memset (buf, 0, blocksize - skipfirst);
66 }
67- buf += blocksize - skipfirst;
68+ buf += blockend - skipfirst;
69 }
70 return (len);
71 }
72--
731.7.10
74