Date: Wed, 11 Aug 2010 15:35:28 +0200 (CEST) From: Oliver Fromme <olli@fromme.com> To: des@des.no (=?utf-8?Q?Dag-Erling_Sm=C3=B8rgrav?=) Cc: src-committers@FreeBSD.org, jilles@stack.nl, svn-src-all@FreeBSD.org, olli@FreeBSD.org, svn-src-head@FreeBSD.org, "M. Warner Losh" <imp@bsdimp.com> Subject: Re: svn commit: r211023 - head/usr.sbin/syslogd Message-ID: <201008111335.o7BDZSQs052430@haluter.fromme.com> In-Reply-To: <86fwylecm1.fsf@ds4.des.no>
next in thread | previous in thread | raw e-mail | index | archive | help
Dag-Erling Smørgrav wrote: > "M. Warner Losh" <imp@bsdimp.com> writes: > > You'll find that a number of structures are potentially already > > allocated with less than required alignment. There's about a dozen > > places in the tree that would start to fail if we did this, or the > > stronger form of __aligned(8). We could add that to the other > > structures, but then we're breaking ABI rules, I think. > > __aligned(4) won't affect struct addrinfo since the sockaddr immediately > follows a socklen_t, which is 32 bits wide and has 32-bit alignment. A > sockaddr_* allocated with malloc() will already be aligned, and so will > a sockaddr_* created on the stack. The only problem is sockaddr_un, > because its size is not a multiple of 4, so if you allocate an array of > sockaddr_un, every other element will be misaligned. I did a small survey of all the sockaddr_ variants: struct align size modulo where ------------------------------------------------------------------------- osockaddr 2 16 16 <sys/socket.h> sockaddr 1 16 16 <sys/socket.h> sockaddr_at 2 16 16 <netatalk/at.h> sockaddr_dl 2 54 2 <net/if_dl.h> sockaddr_hci 1 34 2 <netgraph/bluetooth/include/ng_btsocket.h> sockaddr_in 4 16 16 <netinet/in.h> sockaddr_in6 4 28 4 <netinet6/in6.h> sockaddr_inarp 4 16 16 <netinet/if_ether.h> sockaddr_ipx 2 16 16 <netipx/ipx.h> sockaddr_l2cap 2 10 2 <netgraph/bluetooth/include/ng_btsocket.h> sockaddr_natm 2 22 2 <netnatm/natm.h> sockaddr_nb 4 56 8 <netsmb/netbios.h> sockaddr_ng 1 16 16 <netgraph/ng_socket.h> sockaddr_rfcomm 1 9 1 <netgraph/bluetooth/include/ng_btsocket.h> sockaddr_sco 1 8 8 <netgraph/bluetooth/include/ng_btsocket.h> sockaddr_storage 8 128 128 <sys/_sockaddr_storage.h> sockaddr_un 1 106 2 <sys/un.h> If we push struct sockaddr to align(4), then we will also have to do the same with all others that are not already aligned to at least 4 bytes. That would be almost all of them. I agree that there will be ABI problems with those structs whose size is not a multiple of 4 (that's the ones with a value < 4 in the "modulo" column above). So we cannot do that, right? Best regards Oliver -- ``We are all but compressed light'' (Albert Einstein)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008111335.o7BDZSQs052430>