[systemd-devel] [PATCH] libsystemd-bus: make sure buf transfered into kenrel is 8 aligned

Yin Kangkai kangkai.yin at linux.intel.com
Mon Dec 16 18:34:39 PST 2013


On 2013-12-16, 16:01 +0100, Lennart Poettering wrote:
> On Mon, 16.12.13 15:50, Lennart Poettering (lennart at poettering.net) wrote:
> 
> > > diff --git a/src/libsystemd-bus/bus-control.c b/src/libsystemd-bus/bus-control.c
> > > index 0072c37..6b2790d 100644
> > > --- a/src/libsystemd-bus/bus-control.c
> > > +++ b/src/libsystemd-bus/bus-control.c
> > > @@ -207,7 +207,7 @@ _public_ int sd_bus_release_name(sd_bus *bus, const char *name) {
> > >  }
> > >  
> > >  static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) {
> > > -        struct kdbus_cmd_name_list cmd = {};
> > > +        struct kdbus_cmd_name_list __attribute__ ((__aligned__(8)))
> > > cmd = {};
> > 
> > Hmm, this feels a bit like this would be better part of the type rather
> > than the variable. THus, kdbus.h should add this to all is structs,
> > rather then we decorate the variables...
> > 
> > Kay, would this make sense to you to add to kdbus.h?
> 
> Hmm, so thinking about this: the kdbus_cmd_name_list structure contains
> 64bit values anyway, so should naturally be aligned to 64bit boundaries
> anyway... Or am I mistaken there and you are suggesting that on your
> 32bit architecture (which one is it if I may ask?) 64bit values don't

I am doing tests in 32bit system.

> have to be aligned on an even 8byte boundary, but instead because the
> arch is 32bit anyway and thus 64bit values need to be read in two steps
> alignment on 4 is done in the abi?

I am getting a little more clearer about how gcc tries to make stack
boundary aligned..

I am using this example test code:

------------------------8<------------------------
#include <stdio.h>
#include <linux/types.h>

struct kdbus_cmd_hello {
  __u64 size;
  __u64 conn_flags;
  __u64 attach_flags;
  __u64 bus_flags;
  __u64 id;
  __u64 bloom_size;
  __u64 pool_size;
  __u8 id128[16];
};

int main(int argc, char **argv)
{
        struct kdbus_cmd_hello hello;
        int r;

        printf("hello addr: %08x\n", &hello);
        r = 1;

        return 0;
}
------------------------>8------------------------

By default, gcc will *try* to make stack boundary 16 bytes aligned
(pls refer to -mpreferred-stack-boundary=num in gcc mannual).

struct kdbus_cmd_hello itself is 64bit aligned, yes. However, if you
have a "int r" after the kdbus_cmd_hello, address of "hello" might be
"16 bytes boundary" + 4 (so that after pushing "r", stack boundary
will be 16 bytes aligned).

$ ./test 
hello addr: bfe8d334
$ ./test 
hello addr: bf9aa9f4
$ ./test 
hello addr: bfe443c4
$ ./test 
hello addr: bfe8d334
$ ./test 
hello addr: bf9fdf24

Regards,
Kangkai



More information about the systemd-devel mailing list