Re: [PATCH 05/10] local_t : mips extension

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Mathieu Desnoyers
Date: Friday, January 26, 2007 - 9:36 am

Hi Ralf,

* Ralf Baechle (ralf@linux-mips.org) wrote:

Although you are right about the correctness of sending the MIPS related
work to linux-mips, the other people I sent it to seemed interested in
my work. Thanks for the precision.


"oops", will fix.


Right, will fix (CONFIG_64BIT)

ok, I will add it, but it worked because of :
#include <asm/atomic.h> -> #include <asm/war.h>


Yes, this whole file is wrong about this, I will change &(l->a.counter)
for l->a.counter (for variable assignment and for asm operands).


Same problem as above.


Yeah, I know. Until we find some way to share atomic operation code for
both operation on local and shared data, we have to duplicate this. We
could think about a header that would support multiple inclusion and
behave differently (different function prefix and LOCKing/memory
barriers) depending on defines set by the top level header.

Something like

asm/atomic.h
  #define ATOMIC_SHARED
  #include <asm/atomic-ops.h>  /* shared */
  #undef ATOMIC_SHARED
  #include <asm/atomic-ops.h>  /* local */

asm/atomic-ops.h 
  #ifdef ATOMIC_SHARED
  #define ATOMIC_PREFIX atomic
  #define ATOMIC_BARRIER() smp_mb()
  #define ATOMIC_TYPE atomic_t
  #define ATOMIC_VAR (v->counter)
  #else
  #define ATOMIC_PREFIX local
  #define ATOMIC_BARRIER()
  #define ATOMIC_TYPE local_t
  #define ATOMIC_VAR (v->a.counter)
  #endif
  
  static __inline__ ATOMIC_PREFIX##_add_return(int i, ATOMIC_TYPE *v)
  .....
  #undef ATOMIC_PREFIX
  #undef ATOMIC_BARRIER
  #undef ATOMIC_TYPE
  #undef ATOMIC_VAR

What do you think about this ?

Thanks!

Mathieu


Correction of MIPS variables and config options.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>

--- a/include/asm-mips/local.h
+++ b/include/asm-mips/local.h
@@ -1,8 +1,9 @@
-#ifndef _ARCH_POWERPC_LOCAL_H
-#define _ARCH_POWERPC_LOCAL_H
+#ifndef _ARCH_MIPS_LOCAL_H
+#define _ARCH_MIPSRPC_LOCAL_H
 
 #include <linux/percpu.h>
 #include <asm/atomic.h>
+#include <asm/war.h>
 
 typedef struct
 {
@@ -20,7 +21,7 @@ typedef struct
 #define local_dec(l)	local_long_dec(&(l)->a)
 
 
-#ifndef CONFIG_64BITS
+#ifndef CONFIG_64BIT
 
 /*
  * Same as above, but return the result value
@@ -40,8 +41,8 @@ static __inline__ int local_add_return(int i, local_t * l)
 		"	beqzl	%0, 1b					\n"
 		"	addu	%0, %1, %3				\n"
 		"	.set	mips0					\n"
-		: "=&r" (result), "=&r" (temp), "=m" (&(l->a.counter))
-		: "Ir" (i), "m" (&(l->a.counter))
+		: "=&r" (result), "=&r" (temp), "=m" (l->a.counter)
+		: "Ir" (i), "m" (l->a.counter)
 		: "memory");
 	} else if (cpu_has_llsc) {
 		unsigned long temp;
@@ -54,16 +55,16 @@ static __inline__ int local_add_return(int i, local_t * l)
 		"	beqz	%0, 1b					\n"
 		"	addu	%0, %1, %3				\n"
 		"	.set	mips0					\n"
-		: "=&r" (result), "=&r" (temp), "=m" (&(l->a.counter))
-		: "Ir" (i), "m" (&(l->a.counter))
+		: "=&r" (result), "=&r" (temp), "=m" (l->a.counter)
+		: "Ir" (i), "m" (l->a.counter)
 		: "memory");
 	} else {
 		unsigned long flags;
 
 		local_irq_save(flags);
-		result = &(l->a.counter);
+		result = l->a.counter;
 		result += i;
-		&(l->a.counter) = result;
+		l->a.counter = result;
 		local_irq_restore(flags);
 	}
 
@@ -85,8 +86,8 @@ static __inline__ int local_sub_return(int i, local_t * l)
 		"	beqzl	%0, 1b					\n"
 		"	subu	%0, %1, %3				\n"
 		"	.set	mips0					\n"
-		: "=&r" (result), "=&r" (temp), "=m" (&(l->a.counter))
-		: "Ir" (i), "m" (&(l->a.counter))
+		: "=&r" (result), "=&r" (temp), "=m" (l->a.counter)
+		: "Ir" (i), "m" (l->a.counter)
 		: "memory");
 	} else if (cpu_has_llsc) {
 		unsigned long temp;
@@ -99,16 +100,16 @@ static __inline__ int local_sub_return(int i, local_t * l)
 		"	beqz	%0, 1b					\n"
 		"	subu	%0, %1, %3				\n"
 		"	.set	mips0					\n"
-		: "=&r" (result), "=&r" (temp), "=m" (&(l->a.counter))
-		: "Ir" (i), "m" (&(l->a.counter))
+		: "=&r" (result), "=&r" (temp), "=m" (l->a.counter)
+		: "Ir" (i), "m" (l->a.counter)
 		: "memory");
 	} else {
 		unsigned long flags;
 
 		local_irq_save(flags);
-		result = &(l->a.counter);
+		result = l->a.counter;
 		result -= i;
-		&(l->a.counter) = result;
+		l->a.counter = result;
 		local_irq_restore(flags);
 	}
 
@@ -142,8 +143,8 @@ static __inline__ int local_sub_if_positive(int i, local_t * l)
 		"	.set	reorder					\n"
 		"1:							\n"
 		"	.set	mips0					\n"
-		: "=&r" (result), "=&r" (temp), "=m" (&(l->a.counter))
-		: "Ir" (i), "m" (&(l->a.counter))
+		: "=&r" (result), "=&r" (temp), "=m" (l->a.counter)
+		: "Ir" (i), "m" (l->a.counter)
 		: "memory");
 	} else if (cpu_has_llsc) {
 		unsigned long temp;
@@ -160,17 +161,17 @@ static __inline__ int local_sub_if_positive(int i, local_t * l)
 		"	.set	reorder					\n"
 		"1:							\n"
 		"	.set	mips0					\n"
-		: "=&r" (result), "=&r" (temp), "=m" (&(l->a.counter))
-		: "Ir" (i), "m" (&(l->a.counter))
+		: "=&r" (result), "=&r" (temp), "=m" (l->a.counter)
+		: "Ir" (i), "m" (l->a.counter)
 		: "memory");
 	} else {
 		unsigned long flags;
 
 		local_irq_save(flags);
-		result = &(l->a.counter);
+		result = l->a.counter;
 		result -= i;
 		if (result >= 0)
-			&(l->a.counter) = result;
+			l->a.counter = result;
 		local_irq_restore(flags);
 	}
 
@@ -251,7 +252,7 @@ static __inline__ int local_sub_if_positive(int i, local_t * l)
  */
 #define local_add_negative(i,l) (local_add_return(i, (l)) < 0)
 
-#else /* CONFIG_64BITS */
+#else /* CONFIG_64BIT */
 
 /*
  * Same as above, but return the result value
@@ -271,8 +272,8 @@ static __inline__ long local_add_return(long i, local_t * l)
 		"	beqzl	%0, 1b					\n"
 		"	addu	%0, %1, %3				\n"
 		"	.set	mips0					\n"
-		: "=&r" (result), "=&r" (temp), "=m" (&(l->a.counter))
-		: "Ir" (i), "m" (&(l->a.counter))
+		: "=&r" (result), "=&r" (temp), "=m" (l->a.counter)
+		: "Ir" (i), "m" (l->a.counter)
 		: "memory");
 	} else if (cpu_has_llsc) {
 		unsigned long temp;
@@ -285,16 +286,16 @@ static __inline__ long local_add_return(long i, local_t * l)
 		"	beqz	%0, 1b					\n"
 		"	addu	%0, %1, %3				\n"
 		"	.set	mips0					\n"
-		: "=&r" (result), "=&r" (temp), "=m" (&(l->a.counter))
-		: "Ir" (i), "m" (&(l->a.counter))
+		: "=&r" (result), "=&r" (temp), "=m" (l->a.counter)
+		: "Ir" (i), "m" (l->a.counter)
 		: "memory");
 	} else {
 		unsigned long flags;
 
 		local_irq_save(flags);
-		result = &(l->a.counter);
+		result = l->a.counter;
 		result += i;
-		&(l->a.counter) = result;
+		l->a.counter = result;
 		local_irq_restore(flags);
 	}
 
@@ -316,8 +317,8 @@ static __inline__ long local_sub_return(long i, local_t * l)
 		"	beqzl	%0, 1b					\n"
 		"	subu	%0, %1, %3				\n"
 		"	.set	mips0					\n"
-		: "=&r" (result), "=&r" (temp), "=m" (&(l->a.counter))
-		: "Ir" (i), "m" (&(l->a.counter))
+		: "=&r" (result), "=&r" (temp), "=m" (l->a.counter)
+		: "Ir" (i), "m" (l->a.counter)
 		: "memory");
 	} else if (cpu_has_llsc) {
 		unsigned long temp;
@@ -330,16 +331,16 @@ static __inline__ long local_sub_return(long i, local_t * l)
 		"	beqz	%0, 1b					\n"
 		"	subu	%0, %1, %3				\n"
 		"	.set	mips0					\n"
-		: "=&r" (result), "=&r" (temp), "=m" (&(l->a.counter))
-		: "Ir" (i), "m" (&(l->a.counter))
+		: "=&r" (result), "=&r" (temp), "=m" (l->a.counter)
+		: "Ir" (i), "m" (l->a.counter)
 		: "memory");
 	} else {
 		unsigned long flags;
 
 		local_irq_save(flags);
-		result = &(l->a.counter);
+		result = l->a.counter;
 		result -= i;
-		&(l->a.counter) = result;
+		l->a.counter = result;
 		local_irq_restore(flags);
 	}
 
@@ -373,8 +374,8 @@ static __inline__ long local_sub_if_positive(long i, local_t * l)
 		"	.set	reorder					\n"
 		"1:							\n"
 		"	.set	mips0					\n"
-		: "=&r" (result), "=&r" (temp), "=m" (&(l->a.counter))
-		: "Ir" (i), "m" (&(l->a.counter))
+		: "=&r" (result), "=&r" (temp), "=m" (l->a.counter)
+		: "Ir" (i), "m" (l->a.counter)
 		: "memory");
 	} else if (cpu_has_llsc) {
 		unsigned long temp;
@@ -391,17 +392,17 @@ static __inline__ long local_sub_if_positive(long i, local_t * l)
 		"	.set	reorder					\n"
 		"1:							\n"
 		"	.set	mips0					\n"
-		: "=&r" (result), "=&r" (temp), "=m" (&(l->a.counter))
-		: "Ir" (i), "m" (&(l->a.counter))
+		: "=&r" (result), "=&r" (temp), "=m" (l->a.counter)
+		: "Ir" (i), "m" (l->a.counter)
 		: "memory");
 	} else {
 		unsigned long flags;
 
 		local_irq_save(flags);
-		result = &(l->a.counter);
+		result = l->a.counter;
 		result -= i;
 		if (result >= 0)
-			&(l->a.counter) = result;
+			l->a.counter = result;
 		local_irq_restore(flags);
 	}
 
@@ -483,7 +484,7 @@ static __inline__ long local_sub_if_positive(long i, local_t * l)
  */
 #define local_add_negative(i,l) (local_add_return(i, (l)) < 0)
 
-#endif /* !CONFIG_64BITS */
+#endif /* !CONFIG_64BIT */
 
 
 /* Use these for per-cpu local_t variables: on some archs they are
@@ -521,4 +522,4 @@ static __inline__ long local_sub_if_positive(long i, local_t * l)
 #define __cpu_local_add(i, l)	cpu_local_add((i), (l))
 #define __cpu_local_sub(i, l)	cpu_local_sub((i), (l))
 
-#endif /* _ARCH_POWERPC_LOCAL_H */
+#endif /* _ARCH_MIPS_LOCAL_H */


-- 
OpenPGP public key:              http://krystal.dyndns.org:8080/key/compudj.gpg
Key fingerprint:     8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68 
-
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 00/10] local_t : adding and standardising local ato ..., Mathieu Desnoyers, (Thu Jan 25, 9:16 am)
[PATCH 01/10] local_t : architecture independant extension, Mathieu Desnoyers, (Thu Jan 25, 9:16 am)
[PATCH 02/10] local_t : alpha extension, Mathieu Desnoyers, (Thu Jan 25, 9:16 am)
[PATCH 03/10] local_t : i386 extension, Mathieu Desnoyers, (Thu Jan 25, 9:16 am)
[PATCH 04/10] local_t : ia64 extension, Mathieu Desnoyers, (Thu Jan 25, 9:16 am)
[PATCH 05/10] local_t : mips extension, Mathieu Desnoyers, (Thu Jan 25, 9:16 am)
[PATCH 06/10] local_t : parisc cleanup, Mathieu Desnoyers, (Thu Jan 25, 9:16 am)
[PATCH 07/10] local_t : powerpc extension, Mathieu Desnoyers, (Thu Jan 25, 9:16 am)
[PATCH 08/10] local_t : s390 cleanup, Mathieu Desnoyers, (Thu Jan 25, 9:16 am)
[PATCH 09/10] local_t : sparc64 cleanup, Mathieu Desnoyers, (Thu Jan 25, 9:16 am)
[PATCH 10/10] local_t : x86_64 extension, Mathieu Desnoyers, (Thu Jan 25, 9:16 am)
Re: [PATCH 05/10] local_t : mips extension, Ralf Baechle, (Fri Jan 26, 5:04 am)
Re: [PATCH 05/10] local_t : mips extension, Mathieu Desnoyers, (Fri Jan 26, 9:36 am)
Re: [PATCH 05/10] local_t : mips extension, Mathieu Desnoyers, (Fri Jan 26, 9:57 am)