linux-mips.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] use __always_inline for __xchg
@ 2005-01-29 16:54 Imre Kaloz
  2009-11-24 13:26 ` Ralf Baechle
  0 siblings, 1 reply; 2+ messages in thread
From: Imre Kaloz @ 2005-01-29 16:54 UTC (permalink / raw)
  To: linux-mips

[-- Attachment #1: Type: text/plain, Size: 269 bytes --]


The following patch changes inline for __xchg to __always_inline in  
include/asm-mips/system.h, following the changes in git. Without this  
change linking the kernel fails.

Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
Signed-off-by: Felix Fietkau <nbd@openwrt.org>

[-- Attachment #2: use-__always_inline-for-__xchg.patch --]
[-- Type: application/octet-stream, Size: 504 bytes --]

--- linux-2.6.15.1.old/include/asm-mips/system.h	2006-01-28 15:02:54.481032280 +0100
+++ linux-2.6.15.1.dev/include/asm-mips/system.h	2006-01-28 14:47:51.634285848 +0100
@@ -273,7 +273,7 @@
    if something tries to do an invalid xchg().  */
 extern void __xchg_called_with_bad_pointer(void);
 
-static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
+static __always_inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
 {
 	switch (size) {
 		case 4:

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

* Re: [PATCH] use __always_inline for __xchg
  2005-01-29 16:54 [PATCH] use __always_inline for __xchg Imre Kaloz
@ 2009-11-24 13:26 ` Ralf Baechle
  0 siblings, 0 replies; 2+ messages in thread
From: Ralf Baechle @ 2009-11-24 13:26 UTC (permalink / raw)
  To: Imre Kaloz; +Cc: nbd, linux-mips

On Sat, Jan 29, 2005 at 05:54:44PM +0100, Imre Kaloz wrote:

> The following patch changes inline for __xchg to __always_inline in  
> include/asm-mips/system.h, following the changes in git. Without this  
> change linking the kernel fails.
>
> Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
> Signed-off-by: Felix Fietkau <nbd@openwrt.org>

Imre just pointed me at this antique patch again saying it was still needed.
Back then I ditched it because I couldn't see what the problem it was
trying to fix was - but after a little brainstorming it got obvious.

Now I don't like __always_inline which forces the optimizer to do things
which may not really be what we want, for example when building with -Os
so I found a different fix using BUILD_BUG_ON().  Patch below.

Cheers,

  Ralf

From: Ralf Baechle <ralf@linux-mips.org>

MIPS: Fix build error if __xchg() is not getting inlined.

If __xchg() is not getting inlined the outline version of the function
will have a reference to __xchg_called_with_bad_pointer() which does not
exist remaining.  Fixed by using BUILD_BUG_ON() xchg() to check for
allowable operand sizes.

Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

diff --git a/arch/mips/include/asm/system.h b/arch/mips/include/asm/system.h
index fcf5f98..587a48a 100644
--- a/arch/mips/include/asm/system.h
+++ b/arch/mips/include/asm/system.h
@@ -193,10 +193,6 @@ extern __u64 __xchg_u64_unsupported_on_32bit_kernels(volatile __u64 * m, __u64 v
 #define __xchg_u64 __xchg_u64_unsupported_on_32bit_kernels
 #endif
 
-/* This function doesn't exist, so you'll get a linker error
-   if something tries to do an invalid xchg().  */
-extern void __xchg_called_with_bad_pointer(void);
-
 static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
 {
 	switch (size) {
@@ -205,11 +201,17 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz
 	case 8:
 		return __xchg_u64(ptr, x);
 	}
-	__xchg_called_with_bad_pointer();
+
 	return x;
 }
 
-#define xchg(ptr, x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x), (ptr), sizeof(*(ptr))))
+#define xchg(ptr, x)							\
+({									\
+	BUILD_BUG_ON(sizeof(*(ptr)) & ~0xc);				\
+									\
+	((__typeof__(*(ptr)))						\
+		__xchg((unsigned long)(x), (ptr), sizeof(*(ptr))));	\
+})
 
 extern void set_handler(unsigned long offset, void *addr, unsigned long len);
 extern void set_uncached_handler(unsigned long offset, void *addr, unsigned long len);

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

end of thread, other threads:[~2009-11-24 13:25 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-01-29 16:54 [PATCH] use __always_inline for __xchg Imre Kaloz
2009-11-24 13:26 ` Ralf Baechle

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).