From: Alexey Brodkin
> Sent: 09 July 2018 05:45
> Depending on ABI "long long" type of a particular 32-bit CPU
> might be aligned by either word (32-bits) or double word (64-bits).
> Make sure "data" is really 64-bit aligned for any 32-bit CPU.
> 
> At least for 32-bit ARC cores ABI requires "long long" types
> to be aligned by normal 32-bit word. This makes "data" field aligned to
> 12 bytes. Which is still OK as long as we use 32-bit data only.
> 
> But once we want to use native atomic64_t type (i.e. when we use special
> instructions LLOCKD/SCONDD for accessing 64-bit data) we easily hit
> misaligned access exception.

Shouldn't there be a typedef for the actual type.
Perhaps it is even atomic64_t ?
And have the __aligned(8) applied to that typedef ??

> That's because even on CPUs capable of non-aligned data access LL/SC
> instructions require strict alignment.
...
> --- a/drivers/base/devres.c
> +++ b/drivers/base/devres.c
> @@ -24,8 +24,12 @@ struct devres_node {
> 
>  struct devres {
>       struct devres_node              node;
> -     /* -- 3 pointers */
> -     unsigned long long              data[]; /* guarantee ull alignment */
> +     /*
> +      * Depending on ABI "long long" type of a particular 32-bit CPU
> +      * might be aligned by either word (32-bits) or double word (64-bits).
> +      * Make sure "data" is really 64-bit aligned for any 32-bit CPU.

Just:
        /* data[] must be 64 bit aligned even on 32 bit architectures
         * because it might be accessed by instructions that require
         * aligned memory arguments.

> +      */
> +     unsigned long long              data[] __aligned(sizeof(unsigned long 
> long));

One day assuming that 'unsigned long long' is exactly 64 bits will bite.
This probably ought to be u64 (or similar).
(If not atomic64_t)

        David




_______________________________________________
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc

Reply via email to