[PATCH] Unaligned accesses in the ethernet bridge

Peter Chubb
2006-03-23T02:06:13Z

I see lots of
kernel unaligned access to 0xa0000001009dbb6f, ip=0xa000000100811591
kernel unaligned access to 0xa0000001009dbb6b, ip=0xa0000001008115c1
kernel unaligned access to 0xa0000001009dbb6d, ip=0xa0000001008115f1
messages in my logs on IA64 when using the ethernet bridge with 2.6.16.

Appended is a patch to fix them.

Signed-off-by: Peter Chubb <peterc@gelato.unsw.edu.au>

net/bridge/br_stp_bpdu.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)

Index: linux-2.6-import/net/bridge/br_stp_bpdu.c
===================================================================
--- linux-2.6-import.orig/net/bridge/br_stp_bpdu.c 2006-03-22 09:11:01.349886375 +1100
+++ linux-2.6-import/net/bridge/br_stp_bpdu.c 2006-03-23 12:52:13.719239205 +1100
@@ -19,6 +19,7 @@
#include <linux/llc.h>
#include <net/llc.h>
#include <net/llc_pdu.h>
+#include <asm/unaligned.h>

#include "br_private.h"
#include "br_private_stp.h"
@@ -59,12 +60,12 @@ static inline void br_set_ticks(unsigned
{
unsigned long ticks = (STP_HZ * j)/ HZ;

- *((__be16 *) dest) = htons(ticks);
+ put_unaligned(htons(ticks), (__be16 *)dest);
}

static inline int br_get_ticks(const unsigned char *src)
{
- unsigned long ticks = ntohs(*(__be16 *)src);
+ unsigned long ticks = ntohs(get_unaligned((__be16 *)src));

return (ticks * HZ + STP_HZ - 1) / STP_HZ;
}