On 10/02/2018 01:27 PM, Marek Behún wrote:
> Tested-by: Marek Behún <marek.be...@nic.cz>

btw don't you see those warnings/problems on the Armada platform ? I
presume this is mostly used on the Omnia. Maybe the cache alignment
checking there is not as verbose as on other platforms.

> 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;
> 


-- 
Best regards,
Marek Vasut
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to