[U-Boot] [PATCH] ext2: Cache line aligned partial sector bounce buffer

Anton Staaf robotboy at google.com
Mon Aug 22 22:08:04 CEST 2011


Ooops, expect a follow up without that last minute addition of a C++
style comment about ENOMEM, sorry...

-Anton

On Mon, Aug 22, 2011 at 1:03 PM, Anton Staaf <robotboy at chromium.org> wrote:
> Currently, if a device read request is done that does not begin or end
> on a sector boundary a stack allocated bounce buffer is used to perform
> the read, and then just the part of the sector that is needed is copied
> into the users buffer.  This stack allocation can mean that the bounce
> buffer will not be aligned to the dcache line size.  This is a problem
> when caches are enabled because unaligned cache invalidates are not
> safe.
>
> This patch allocates a cache line size aligned sector sized bounce
> buffer the first time that ext2fs_devread is called.
>
> Signed-off-by: Anton Staaf <robotboy at chromium.org>
> Cc: Lukasz Majewski <l.majewski at samsung.com>
> Cc: Mike Frysinger <vapier at gentoo.org>
> Cc: Dave Liu <r63238 at freescale.com>
> Cc: Andy Fleming <afleming at gmail.com>
> Cc: Albert ARIBAUD <albert.u.boot at aribaud.net>
> ---
>
> This patch depends on Lukasz Majewski's dcache line size patch sent to the
> list in: http://patchwork.ozlabs.org/patch/110501/
>
>  fs/ext2/dev.c |    9 ++++++++-
>  1 files changed, 8 insertions(+), 1 deletions(-)
>
> diff --git a/fs/ext2/dev.c b/fs/ext2/dev.c
> index 78851d0..4b2aeef 100644
> --- a/fs/ext2/dev.c
> +++ b/fs/ext2/dev.c
> @@ -26,6 +26,7 @@
>
>  #include <common.h>
>  #include <config.h>
> +#include <malloc.h>
>  #include <ext2fs.h>
>
>  static block_dev_desc_t *ext2fs_block_dev_desc;
> @@ -52,9 +53,15 @@ int ext2fs_set_blk_dev(block_dev_desc_t *rbdd, int part)
>
>  int ext2fs_devread(int sector, int byte_offset, int byte_len, char *buf)
>  {
> -       char sec_buf[SECTOR_SIZE];
> +       static char *sec_buf;
>        unsigned sectors;
>
> +       if (sec_buf == NULL)
> +               sec_buf = memalign(get_dcache_line_size(), SECTOR_SIZE);
> +
> +       if (sec_buf == NULL)
> +               return 0; //-ENOMEM
> +
>        /*
>         *  Check partition boundaries
>         */
> --
> 1.7.3.1
>
>


More information about the U-Boot mailing list