Tested-by: Marek Behún <marek.be...@nic.cz> On Sat, 22 Sep 2018 04:13:35 +0200 Marek Vasut <ma...@denx.de> wrote:
> The btrfs implementation passes cache-unaligned buffers into the > block layer, which triggers cache alignment problems down in the > block device drivers. Align the buffers to prevent this. > > Signed-off-by: Marek Vasut <ma...@denx.de> > Cc: Marek Behun <marek.be...@nic.cz> > --- > fs/btrfs/ctree.c | 24 +++++++++++++----------- > fs/btrfs/extent-io.c | 3 ++- > fs/btrfs/super.c | 3 ++- > 3 files changed, 17 insertions(+), 13 deletions(-) > > diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c > index 4da36a9bc7..18b47d92fe 100644 > --- a/fs/btrfs/ctree.c > +++ b/fs/btrfs/ctree.c > @@ -7,6 +7,7 @@ > > #include "btrfs.h" > #include <malloc.h> > +#include <memalign.h> > > int btrfs_comp_keys(struct btrfs_key *a, struct btrfs_key *b) > { > @@ -105,23 +106,24 @@ void btrfs_free_path(struct btrfs_path *p) > > static int read_tree_node(u64 physical, union btrfs_tree_node **buf) > { > - struct btrfs_header hdr; > - unsigned long size, offset = sizeof(hdr); > + ALLOC_CACHE_ALIGN_BUFFER(struct btrfs_header, hdr, > + sizeof(struct btrfs_header)); > + unsigned long size, offset = sizeof(*hdr); > union btrfs_tree_node *res; > u32 i; > > - if (!btrfs_devread(physical, sizeof(hdr), &hdr)) > + if (!btrfs_devread(physical, sizeof(*hdr), hdr)) > return -1; > > - btrfs_header_to_cpu(&hdr); > + btrfs_header_to_cpu(hdr); > > - if (hdr.level) > + if (hdr->level) > size = sizeof(struct btrfs_node) > - + hdr.nritems * sizeof(struct btrfs_key_ptr); > + + hdr->nritems * sizeof(struct btrfs_key_ptr); > else > size = btrfs_info.sb.nodesize; > > - res = malloc(size); > + res = malloc_cache_aligned(size); > if (!res) { > debug("%s: malloc failed\n", __func__); > return -1; > @@ -133,12 +135,12 @@ static int read_tree_node(u64 physical, union > btrfs_tree_node **buf) return -1; > } > > - res->header = hdr; > - if (hdr.level) > - for (i = 0; i < hdr.nritems; ++i) > + memcpy(&res->header, hdr, sizeof(*hdr)); > + if (hdr->level) > + for (i = 0; i < hdr->nritems; ++i) > btrfs_key_ptr_to_cpu(&res->node.ptrs[i]); > else > - for (i = 0; i < hdr.nritems; ++i) > + for (i = 0; i < hdr->nritems; ++i) > btrfs_item_to_cpu(&res->leaf.items[i]); > > *buf = res; > diff --git a/fs/btrfs/extent-io.c b/fs/btrfs/extent-io.c > index 7263f41644..66d0e1c7d6 100644 > --- a/fs/btrfs/extent-io.c > +++ b/fs/btrfs/extent-io.c > @@ -7,6 +7,7 @@ > > #include "btrfs.h" > #include <malloc.h> > +#include <memalign.h> > > u64 btrfs_read_extent_inline(struct btrfs_path *path, > struct btrfs_file_extent_item *extent, > u64 offset, @@ -89,7 +90,7 @@ u64 btrfs_read_extent_reg(struct > btrfs_path *path, return size; > } > > - cbuf = malloc(dlen > size ? clen + dlen : clen); > + cbuf = malloc_cache_aligned(dlen > size ? clen + dlen : > clen); if (!cbuf) > return -1ULL; > > diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c > index e680caa56a..7aaf8f9b0d 100644 > --- a/fs/btrfs/super.c > +++ b/fs/btrfs/super.c > @@ -6,6 +6,7 @@ > */ > > #include "btrfs.h" > +#include <memalign.h> > > #define BTRFS_SUPER_FLAG_SUPP > (BTRFS_HEADER_FLAG_WRITTEN \ | BTRFS_HEADER_FLAG_RELOC \ > @@ -179,7 +180,7 @@ int btrfs_read_superblock(void) > 0x4000000000ull, > 0x4000000000000ull > }; > - char raw_sb[BTRFS_SUPER_INFO_SIZE]; > + ALLOC_CACHE_ALIGN_BUFFER(char, raw_sb, > BTRFS_SUPER_INFO_SIZE); struct btrfs_super_block *sb = (struct > btrfs_super_block *) raw_sb; u64 dev_total_bytes; > int i; _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot