On Fri, 2008-08-22 at 13:36 -0700, Luck, Tony wrote: > > How about long instead of int. int leaves us with the possibility that > > something else will expect 8 byte alignment. > > How about this? > > Align __cmd to ward off kernel unaligned access consoles messages on > ia64 (and perhaps make an almost imperceptible performance improvement > on other architectures that can handle unaligned access, but do so > more slowly than aligned accesses). > > Signed-off-by: Tony Luck <tony.luck@xxxxxxxxx> Yuk, really ... you're blowing out the size of a critical structure by padding which is unnecessary in 99% of cases. Commands are supposed to be byte streams. Adding extra alignment to generic code because some driver has strange rules isn't very well layered. Also, these are string out instructions ... They don't have any alignment requirements (or they're not supposed to; they're like memcpy); they're modelled on the x86 instructions What about this as the obvious solution? It makes the ia64 version of this command behave exactly as the x86 version does. James --- diff --git a/arch/ia64/include/asm/io.h b/arch/ia64/include/asm/io.h index 260a85a..7f25750 100644 --- a/arch/ia64/include/asm/io.h +++ b/arch/ia64/include/asm/io.h @@ -19,6 +19,8 @@ * Copyright (C) 1999 Don Dugger <don.dugger@xxxxxxxxx> */ +#include <asm/unaligned.h> + /* We don't use IO slowdowns on the ia64, but.. */ #define __SLOW_DOWN_IO do { } while (0) #define SLOW_DOWN_IO do { } while (0) @@ -241,7 +243,7 @@ __insw (unsigned long port, void *dst, unsigned long count) unsigned short *dp = dst; while (count--) - *dp++ = platform_inw(port); + put_unaligned(platform_inw(port), dp++); } static inline void @@ -250,7 +252,7 @@ __insl (unsigned long port, void *dst, unsigned long count) unsigned int *dp = dst; while (count--) - *dp++ = platform_inl(port); + put_unaligned(platform_inl(port), dp++); } static inline void @@ -268,7 +270,7 @@ __outsw (unsigned long port, const void *src, unsigned long count) const unsigned short *sp = src; while (count--) - platform_outw(*sp++, port); + platform_outw(get_unaligned(sp++), port); } static inline void @@ -277,7 +279,7 @@ __outsl (unsigned long port, const void *src, unsigned long count) const unsigned int *sp = src; while (count--) - platform_outl(*sp++, port); + platform_outl(get_unaligned(sp++), port); } /* -- To unsubscribe from this list: send the line "unsubscribe linux-ia64" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
![]() |