On Thu, Jan 18, 2007 at 07:50:35PM +0200, Michael S. Tsirkin wrote: > > The int -> long change is needed because struct ib_umad_packet > > includes struct ib_user_mad (which has 4 byte alignment) but > > is then cast to struct ib_mad_hdr which has 8 byte alignment. > But I thought it is the data field which is cast to ib_mad_hdr > and not ib_user_mad? If so Jason's suggestion of using > u64 data[0] > makes more sense.
I'm not sure why, but on closer inspection the code in user_mad.c actually casts both mad.data[0] and mad to ib_mad_hdr (it looks 'correct' but inconsistent, see the last copy_from_user in ib_umad_write) So, changing the data[0] to u64 should still fix both since it will place the .data casting region on the correct alignment and increase the alignment requirement of ib_user_mad - but it is indirect that the 2nd cast is corrected.. > > Plus you only get the pad if you actually need it. > You mean, no pad if ib_user_mad_hdr is used separately? That and platforms that don't require 8 byte alignment for u64 will not generate pads. John: Open ended structures always require care when selecting the type used for the 0 size array so that it 'matches' the structures you intend to cast it to. Unless you are using it for a string, u8 is always a bad choice :> Jason _______________________________________________ openib-general mailing list [email protected] http://openib.org/mailman/listinfo/openib-general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
