* [PATCH 3/4] include asm-mips add missing edac h file
@ 2007-07-25 20:55 dougthompson
2007-07-26 5:25 ` Andrew Morton
0 siblings, 1 reply; 3+ messages in thread
From: dougthompson @ 2007-07-25 20:55 UTC (permalink / raw)
To: greg, ralf, egor, dougthompson, alan, linux-kernel, akpm
From: Doug Thompson <dougthompson@xmission.h>
EDAC has a foundation to perform software memory scrubbing, but it
requires a per architecture (atomic_scrub) function for performing an atomic
update operation. Under X86, this is done with a
lock: add [addr],0
in the file asm-x86/edac.h
This patch provides the MIPS arch with that atomic function, atomic_scrub() in
asm-mips/edac.h
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Doug Thompson <dougthompson@xmission.com>
---
edac.h | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
Index: linux-2.6.23-rc1/include/asm-mips/edac.h
===================================================================
--- /dev/null
+++ linux-2.6.23-rc1/include/asm-mips/edac.h
@@ -0,0 +1,35 @@
+#ifndef ASM_EDAC_H
+#define ASM_EDAC_H
+
+/* ECC atomic, DMA, SMP and interrupt safe scrub function */
+
+static __inline__ void atomic_scrub(void *va, u32 size)
+{
+ unsigned long *virt_addr = va;
+ unsigned long temp;
+ u32 i;
+
+ for (i = 0; i < size / sizeof(unsigned long); i++, virt_addr++) {
+
+ /*
+ * Very carefully read and write to memory atomically
+ * so we are interrupt, DMA and SMP safe.
+ *
+ * Intel: asm("lock; addl $0, %0"::"m"(*virt_addr));
+ */
+
+ __asm__ __volatile__ (
+ " .set mips3 \n"
+ "1: ll %0, %1 # atomic_add \n"
+ " ll %0, %1 # atomic_add \n"
+ " addu %0, $0 \n"
+ " sc %0, %1 \n"
+ " beqz %0, 1b \n"
+ " .set mips0 \n"
+ : "=&r" (temp), "=m" (*virt_addr)
+ : "m" (*virt_addr));
+
+ }
+}
+
+#endif
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH 3/4] include asm-mips add missing edac h file
2007-07-25 20:55 [PATCH 3/4] include asm-mips add missing edac h file dougthompson
@ 2007-07-26 5:25 ` Andrew Morton
2007-07-26 15:19 ` Doug Thompson
0 siblings, 1 reply; 3+ messages in thread
From: Andrew Morton @ 2007-07-26 5:25 UTC (permalink / raw)
To: dougthompson; +Cc: greg, ralf, egor, alan, linux-kernel
On Wed, 25 Jul 2007 14:55:01 -0600 dougthompson@xmission.com wrote:
> --- /dev/null
> +++ linux-2.6.23-rc1/include/asm-mips/edac.h
> @@ -0,0 +1,35 @@
> +#ifndef ASM_EDAC_H
> +#define ASM_EDAC_H
> +
> +/* ECC atomic, DMA, SMP and interrupt safe scrub function */
> +
> +static __inline__ void atomic_scrub(void *va, u32 size)
Please don't use __inline__ or __inline. Good old "inline" will do.
<cc's the checkpatch maintainer>
<edits the diff>
> +{
> + unsigned long *virt_addr = va;
> + unsigned long temp;
> + u32 i;
> +
> + for (i = 0; i < size / sizeof(unsigned long); i++, virt_addr++) {
> +
> + /*
> + * Very carefully read and write to memory atomically
> + * so we are interrupt, DMA and SMP safe.
> + *
> + * Intel: asm("lock; addl $0, %0"::"m"(*virt_addr));
> + */
> +
> + __asm__ __volatile__ (
> + " .set mips3 \n"
> + "1: ll %0, %1 # atomic_add \n"
> + " ll %0, %1 # atomic_add \n"
> + " addu %0, $0 \n"
> + " sc %0, %1 \n"
> + " beqz %0, 1b \n"
> + " .set mips0 \n"
> + : "=&r" (temp), "=m" (*virt_addr)
> + : "m" (*virt_addr));
> +
> + }
> +}
hm, I'd have thought that we could us plain old atomic_add() for this.
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH 3/4] include asm-mips add missing edac h file
2007-07-26 5:25 ` Andrew Morton
@ 2007-07-26 15:19 ` Doug Thompson
0 siblings, 0 replies; 3+ messages in thread
From: Doug Thompson @ 2007-07-26 15:19 UTC (permalink / raw)
To: Andrew Morton, dougthompson; +Cc: greg, ralf, egor, alan, linux-kernel
--- Andrew Morton <akpm@linux-foundation.org> wrote:
> On Wed, 25 Jul 2007 14:55:01 -0600 dougthompson@xmission.com wrote:
>
> > --- /dev/null
> > +++ linux-2.6.23-rc1/include/asm-mips/edac.h
> > @@ -0,0 +1,35 @@
> > +#ifndef ASM_EDAC_H
> > +#define ASM_EDAC_H
> > +
> > +/* ECC atomic, DMA, SMP and interrupt safe scrub function */
> > +
> > +static __inline__ void atomic_scrub(void *va, u32 size)
>
> Please don't use __inline__ or __inline. Good old "inline" will do.
ok, thanks.
I have to admit, since I don't know MIPS assembly, the guys at Sicortex.com developed
this function.
>
> <cc's the checkpatch maintainer>
>
> <edits the diff>
thanks
>
> > +{
> > + unsigned long *virt_addr = va;
> > + unsigned long temp;
> > + u32 i;
> > +
> > + for (i = 0; i < size / sizeof(unsigned long); i++, virt_addr++) {
> > +
> > + /*
> > + * Very carefully read and write to memory atomically
> > + * so we are interrupt, DMA and SMP safe.
> > + *
> > + * Intel: asm("lock; addl $0, %0"::"m"(*virt_addr));
> > + */
> > +
> > + __asm__ __volatile__ (
> > + " .set mips3 \n"
> > + "1: ll %0, %1 # atomic_add \n"
> > + " ll %0, %1 # atomic_add \n"
> > + " addu %0, $0 \n"
> > + " sc %0, %1 \n"
> > + " beqz %0, 1b \n"
> > + " .set mips0 \n"
> > + : "=&r" (temp), "=m" (*virt_addr)
> > + : "m" (*virt_addr));
> > +
> > + }
> > +}
>
> hm, I'd have thought that we could us plain old atomic_add() for this.
This code is used as a primitive to perform software memory scrubbing.
We (many people as I remember) had a discussion a couple of years ago on lkml on this,
so this is where this implementation pattern came from.
It might be that your thought just could be correct now after some more research.
doug t
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2007-07-26 15:19 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-07-25 20:55 [PATCH 3/4] include asm-mips add missing edac h file dougthompson
2007-07-26 5:25 ` Andrew Morton
2007-07-26 15:19 ` Doug Thompson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox