netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Excess use of packed attribute
@ 2006-08-07 20:34 Stephen Hemminger
  2006-08-07 23:20 ` David Miller
  2006-08-08  0:02 ` Sridhar Samudrala
  0 siblings, 2 replies; 7+ messages in thread
From: Stephen Hemminger @ 2006-08-07 20:34 UTC (permalink / raw)
  To: Roland Dreier; +Cc: netdev

After reading:
	http://bugzilla.kernel.org/show_bug.cgi?id=6693

I noticed there were stupid uses of packed attribute in several network headers.

Silly offenders:	include/net/ipx.h
			include/net/ieee80211.h
			include/net/ip6_tunnel.h
			include/net/ndisc.h
			include/linux/if_ether.h
			include/linux/if_fddi.h
		
			include/linux/sctp.h -- really bad
		
-- 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Excess use of packed attribute
  2006-08-07 20:34 Excess use of packed attribute Stephen Hemminger
@ 2006-08-07 23:20 ` David Miller
  2006-08-09 19:17   ` Ville Nuorvala
  2006-08-08  0:02 ` Sridhar Samudrala
  1 sibling, 1 reply; 7+ messages in thread
From: David Miller @ 2006-08-07 23:20 UTC (permalink / raw)
  To: shemminger; +Cc: rdreier, netdev

From: Stephen Hemminger <shemminger@osdl.org>
Date: Mon, 7 Aug 2006 13:34:23 -0700

> Silly offenders:	include/net/ipx.h
> 			include/net/ieee80211.h
> 			include/net/ip6_tunnel.h
> 			include/net/ndisc.h
> 			include/linux/if_ether.h
> 			include/linux/if_fddi.h
> 		
> 			include/linux/sctp.h -- really bad

The ndisc.h one, for example, is needed for cases like ARM.

The if_ether.h one is also needed, or else for:

	struct ethhdr *eth;

"eth + 1" would do the wrong thing as the compiler would
align the structure to the native pointer size or similar.
This is an issue because ethhdr is 14 bytes in size.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Excess use of packed attribute
  2006-08-07 20:34 Excess use of packed attribute Stephen Hemminger
  2006-08-07 23:20 ` David Miller
@ 2006-08-08  0:02 ` Sridhar Samudrala
  2006-08-08  0:39   ` David Miller
  1 sibling, 1 reply; 7+ messages in thread
From: Sridhar Samudrala @ 2006-08-08  0:02 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: Roland Dreier, netdev

On Mon, 2006-08-07 at 13:34 -0700, Stephen Hemminger wrote:
> After reading:
> 	http://bugzilla.kernel.org/show_bug.cgi?id=6693
> 
> I noticed there were stupid uses of packed attribute in several network headers.
> 
> Silly offenders:	include/net/ipx.h
> 			include/net/ieee80211.h
> 			include/net/ip6_tunnel.h
> 			include/net/ndisc.h
> 			include/linux/if_ether.h
> 			include/linux/if_fddi.h
> 		
> 			include/linux/sctp.h -- really bad

All the structures in sctp.h that use packed atrribute define
standard on-wire SCTP chunk/parameter formats. They need to be at the
exact offsets as they go on wire.
I think we saw some issues without the packed attribute on 64-bit archs
and just to be safe we added packed to all the on-wire structures.

Thanks
Sridhar


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Excess use of packed attribute
  2006-08-08  0:02 ` Sridhar Samudrala
@ 2006-08-08  0:39   ` David Miller
  2006-08-09 18:37     ` Roland Dreier
  0 siblings, 1 reply; 7+ messages in thread
From: David Miller @ 2006-08-08  0:39 UTC (permalink / raw)
  To: sri; +Cc: shemminger, rdreier, netdev

From: Sridhar Samudrala <sri@us.ibm.com>
Date: Mon, 07 Aug 2006 17:02:08 -0700

> All the structures in sctp.h that use packed atrribute define
> standard on-wire SCTP chunk/parameter formats. They need to be at the
> exact offsets as they go on wire.
> I think we saw some issues without the packed attribute on 64-bit archs
> and just to be safe we added packed to all the on-wire structures.

For the cases where it is no actually necessary, the code generation
cost on RISC cpus is very high.  Byte loads and stores will be used to
access _every_ member of such structures on RISC machines because
the compiler cannot guarentee the alignment of any data object
when packed is specified.

It's OK to do this when it's really needed, but when it's not it
should be heavily avoided.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Excess use of packed attribute
  2006-08-08  0:39   ` David Miller
@ 2006-08-09 18:37     ` Roland Dreier
  2006-08-10  4:11       ` David Miller
  0 siblings, 1 reply; 7+ messages in thread
From: Roland Dreier @ 2006-08-09 18:37 UTC (permalink / raw)
  To: David Miller; +Cc: sri, shemminger, netdev

    David> For the cases where it is no actually necessary, the code
    David> generation cost on RISC cpus is very high.  Byte loads and
    David> stores will be used to access _every_ member of such
    David> structures on RISC machines because the compiler cannot
    David> guarentee the alignment of any data object when packed is
    David> specified.

Agreed (although not really RISC -- sparc64 and ia64 have this
problem, while ppc is fine with unaligned access).  However
__attribute__((packed,aligned)) has just been brought to my attention.
For example, on sparc64,

	struct foo { char x; int a; } __attribute__((packed,aligned));
	struct bar { char x; int b; } __attribute__((packed));
	
	int c(struct foo *x) { return x->a; }
	int d(struct bar *x) { return x->b; }

compiles to:

	0000000000000000 <c>:
	   0:   d0 5a 00 00     ldx  [ %o0 ], %o0
	   4:   91 2a 30 08     sllx  %o0, 8, %o0
	   8:   81 c3 e0 08     retl
	   c:   91 3a 30 20     srax  %o0, 0x20, %o0
	  10:   30 68 00 04     b,a   %xcc, 20 <d>
	  14:   01 00 00 00     nop
	  18:   01 00 00 00     nop
	  1c:   01 00 00 00     nop
	
	0000000000000020 <d>:
	  20:   c6 0a 20 01     ldub  [ %o0 + 1 ], %g3
	  24:   c2 0a 20 02     ldub  [ %o0 + 2 ], %g1
	  28:   c4 0a 20 03     ldub  [ %o0 + 3 ], %g2
	  2c:   87 28 f0 18     sllx  %g3, 0x18, %g3
	  30:   d0 0a 20 04     ldub  [ %o0 + 4 ], %o0
	  34:   83 28 70 10     sllx  %g1, 0x10, %g1
	  38:   82 10 40 03     or  %g1, %g3, %g1
	  3c:   85 28 b0 08     sllx  %g2, 8, %g2
	  40:   84 10 80 01     or  %g2, %g1, %g2
	  44:   90 12 00 02     or  %o0, %g2, %o0
	  48:   81 c3 e0 08     retl
	  4c:   91 3a 20 00     sra  %o0, 0, %o0
	  50:   30 68 00 04     b,a   %xcc, 60 <d+0x40>
	  54:   01 00 00 00     nop
	  58:   01 00 00 00     nop
	  5c:   01 00 00 00     nop

which suggests that adding "aligned" is a good idea for many of the
uses of "packed".  However I don't know how all gcc version do with
this.  Anyone have any comments on "__attribute__((packed,aligned))"?

Thanks,
  Roland

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Excess use of packed attribute
  2006-08-07 23:20 ` David Miller
@ 2006-08-09 19:17   ` Ville Nuorvala
  0 siblings, 0 replies; 7+ messages in thread
From: Ville Nuorvala @ 2006-08-09 19:17 UTC (permalink / raw)
  To: David Miller; +Cc: shemminger, rdreier, netdev

David Miller wrote:
> From: Stephen Hemminger <shemminger@osdl.org>
> Date: Mon, 7 Aug 2006 13:34:23 -0700
> 
>> Silly offenders:	include/net/ipx.h
>> 			include/net/ieee80211.h
>> 			include/net/ip6_tunnel.h
>> 			include/net/ndisc.h
>> 			include/linux/if_ether.h
>> 			include/linux/if_fddi.h
>> 		
>> 			include/linux/sctp.h -- really bad
> 
> The ndisc.h one, for example, is needed for cases like ARM.
> 
> The if_ether.h one is also needed, or else for:
> 
> 	struct ethhdr *eth;
> 
> "eth + 1" would do the wrong thing as the compiler would
> align the structure to the native pointer size or similar.
> This is an issue because ethhdr is 14 bytes in size.

Similarly the ipv6_tlv_tnl_enc_lim in ip6_tunnel.h is a 3-octet IPv6
destination sub-option. The sub-option can be located anywhere inside
the destination option header and can only be found by parsing
the whole header.

Regards,
Ville

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Excess use of packed attribute
  2006-08-09 18:37     ` Roland Dreier
@ 2006-08-10  4:11       ` David Miller
  0 siblings, 0 replies; 7+ messages in thread
From: David Miller @ 2006-08-10  4:11 UTC (permalink / raw)
  To: rdreier; +Cc: sri, shemminger, netdev

From: Roland Dreier <rdreier@cisco.com>
Date: Wed, 09 Aug 2006 11:37:31 -0700

> Agreed (although not really RISC -- sparc64 and ia64 have this
> problem, while ppc is fine with unaligned access).  However
> __attribute__((packed,aligned)) has just been brought to my attention.
> For example, on sparc64,
> 
> 	struct foo { char x; int a; } __attribute__((packed,aligned));
> 	struct bar { char x; int b; } __attribute__((packed));
> 	
> 	int c(struct foo *x) { return x->a; }
> 	int d(struct bar *x) { return x->b; }
> 
> compiles to:
 ...
> which suggests that adding "aligned" is a good idea for many of the
> uses of "packed".  However I don't know how all gcc version do with
> this.  Anyone have any comments on "__attribute__((packed,aligned))"?

Good find.

It might usable in some of the questionable cases, however it changes
the size of the struct which eliminates most of the gains.

For example:

davem@sunset:~/src/GIT/net-2.6$ cat foo.c
#include <stdio.h>

struct foo_packed {
	char x; int a;
} __attribute__((packed));

struct foo_packed_aligned {
	char x; int a;
} __attribute__((packed,aligned));

int main(void)
{
	printf("foo_packed: sizeof(%Zd)\n",
	       sizeof(struct foo_packed));
	printf("foo_packed_aligned: sizeof(%Zd)\n",
	       sizeof(struct foo_packed_aligned));

	return 0;
}
davem@sunset:~/src/GIT/net-2.6$ gcc -O -o foo foo.c
davem@sunset:~/src/GIT/net-2.6$ ./foo
foo_packed: sizeof(5)
foo_packed_aligned: sizeof(8)
davem@sunset:~/src/GIT/net-2.6$ 

This doesn't work for things like packet headers, for example.

Oh well.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2006-08-10  4:11 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-07 20:34 Excess use of packed attribute Stephen Hemminger
2006-08-07 23:20 ` David Miller
2006-08-09 19:17   ` Ville Nuorvala
2006-08-08  0:02 ` Sridhar Samudrala
2006-08-08  0:39   ` David Miller
2006-08-09 18:37     ` Roland Dreier
2006-08-10  4:11       ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).