RE: [patch] linux 2.4.17: The second mb() rework (final)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



My only comment about this is:

Aren't there more processors that have sync?  I thought the RM7000
(PMC-Sierra) did too...

Matt

--
Matthew D. Dharm                            Senior Software Designer
Momentum Computer Inc.                      1815 Aston Ave.  Suite 107
(760) 431-8663 X-115                        Carlsbad, CA 92008-7310
Momentum Works For You                      www.momenco.com

> -----Original Message-----
> From: owner-linux-mips@oss.sgi.com
> [mailto:owner-linux-mips@oss.sgi.com]On Behalf Of Maciej W. Rozycki
> Sent: Monday, February 11, 2002 7:46 AM
> To: Ralf Baechle
> Cc: linux-mips@fnet.fr; linux-mips@oss.sgi.com
> Subject: [patch] linux 2.4.17: The second mb() rework (final)
>
>
> Ralf,
>
>  I haven't seen any objections.  Could you please apply it?
>
>   Maciej
>
> --
> +  Maciej W. Rozycki, Technical University of Gdansk, Poland   +
> +--------------------------------------------------------------+
> +        e-mail: macro@ds2.pg.gda.pl, PGP key available        +
>
> patch-mips-2.4.17-20020129-mb-wb-5
> diff -up --recursive --new-file
> linux-mips-2.4.17-20020129.macro/arch/mips/config.in
> linux-mips-2.4.17-20020129/arch/mips/config.in
> --- linux-mips-2.4.17-20020129.macro/arch/mips/config.in
> Fri Jan 25 05:26:34 2002
> +++ linux-mips-2.4.17-20020129/arch/mips/config.in	Mon
> Feb  4 00:07:13 2002
> @@ -384,6 +384,12 @@ else
>        fi
>     fi
>  fi
> +if [ "$CONFIG_CPU_R3000" = "y" -o \
> +     "$CONFIG_CPU_TX39XX" = "y" ]; then
> +   define_bool CONFIG_CPU_HAS_SYNC n
> +else
> +   define_bool CONFIG_CPU_HAS_SYNC y
> +fi
>  endmenu
>
>  mainmenu_option next_comment
> diff -up --recursive --new-file
> linux-mips-2.4.17-20020129.macro/include/asm-mips/system.h
> linux-mips-2.4.17-20020129/include/asm-mips/system.h
> ---
> linux-mips-2.4.17-20020129.macro/include/asm-mips/system.h
> Sun Jan 27 05:27:59 2002
> +++ linux-mips-2.4.17-20020129/include/asm-mips/system.h
> Mon Feb  4 02:10:33 2002
> @@ -18,9 +18,12 @@
>
>  #include <linux/config.h>
>  #include <asm/sgidefs.h>
> -#include <asm/ptrace.h>
> +
>  #include <linux/kernel.h>
>
> +#include <asm/addrspace.h>
> +#include <asm/ptrace.h>
> +
>  __asm__ (
>  	".macro\t__sti\n\t"
>  	".set\tpush\n\t"
> @@ -166,32 +169,57 @@ extern void __global_restore_flags(unsig
>  #define local_irq_disable()	__cli();
>  #define local_irq_enable()	__sti();
>
> -/*
> - * These are probably defined overly paranoid ...
> - */
> +#ifdef CONFIG_CPU_HAS_SYNC
> +#define __sync()				\
> +	__asm__ __volatile__(			\
> +		".set	push\n\t"		\
> +		".set	noreorder\n\t"		\
> +		"sync\n\t"			\
> +		".set	pop"			\
> +		: /* no output */		\
> +		: /* no input */		\
> +		: "memory")
> +#else
> +#define __sync()	do { } while(0)
> +#endif
> +
> +#define __fast_iob()				\
> +	__asm__ __volatile__(			\
> +		".set	push\n\t"		\
> +		".set	noreorder\n\t"		\
> +		"lw	$0,%0\n\t"		\
> +		"nop\n\t"			\
> +		".set	pop"			\
> +		: /* no output */		\
> +		: "m" (*(int *)KSEG1)		\
> +		: "memory")
> +
> +#define fast_wmb()	__sync()
> +#define fast_rmb()	__sync()
> +#define fast_mb()	__sync()
> +#define fast_iob()				\
> +	do {					\
> +		__sync();			\
> +		__fast_iob();			\
> +	} while (0)
> +
>  #ifdef CONFIG_CPU_HAS_WB
>
>  #include <asm/wbflush.h>
> -#define rmb()	do { } while(0)
> -#define wmb()	wbflush()
> -#define mb()	wbflush()
> -
> -#else /* CONFIG_CPU_HAS_WB  */
> -
> -#define mb()						\
> -__asm__ __volatile__(					\
> -	"# prevent instructions being moved around\n\t"	\
> -	".set\tnoreorder\n\t"				\
> -	"# 8 nops to fool the R4400 pipeline\n\t"	\
> -	"nop;nop;nop;nop;nop;nop;nop;nop\n\t"		\
> -	".set\treorder"					\
> -	: /* no output */				\
> -	: /* no input */				\
> -	: "memory")
> -#define rmb() mb()
> -#define wmb() mb()
>
> -#endif /* CONFIG_CPU_HAS_WB  */
> +#define wmb()		fast_wmb()
> +#define rmb()		fast_rmb()
> +#define mb()		wbflush();
> +#define iob()		wbflush();
> +
> +#else /* !CONFIG_CPU_HAS_WB */
> +
> +#define wmb()		fast_wmb()
> +#define rmb()		fast_rmb()
> +#define mb()		fast_mb()
> +#define iob()		fast_iob()
> +
> +#endif /* !CONFIG_CPU_HAS_WB */
>
>  #ifdef CONFIG_SMP
>  #define smp_mb()	mb()
> diff -up --recursive --new-file
> linux-mips-2.4.17-20020129.macro/include/asm-mips/wbflush.h
> linux-mips-2.4.17-20020129/include/asm-mips/wbflush.h
> ---
> linux-mips-2.4.17-20020129.macro/include/asm-mips/wbflush.h
> Fri Sep  7 04:26:33 2001
> +++ linux-mips-2.4.17-20020129/include/asm-mips/wbflush.h
> Mon Feb  4 02:52:11 2002
> @@ -6,29 +6,30 @@
>   * for more details.
>   *
>   * Copyright (c) 1998 Harald Koerfgen
> + * Copyright (C) 2002 Maciej W. Rozycki
>   */
>  #ifndef __ASM_MIPS_WBFLUSH_H
>  #define __ASM_MIPS_WBFLUSH_H
>
>  #include <linux/config.h>
>
> -#if defined(CONFIG_CPU_HAS_WB)
> -/*
> - * R2000 or R3000
> - */
> -extern void (*__wbflush) (void);
> +#ifdef CONFIG_CPU_HAS_WB
>
> -#define wbflush() __wbflush()
> +extern void (*__wbflush)(void);
> +extern void wbflush_setup(void);
>
> -#else
> -/*
> - * we don't need no stinkin' wbflush
> - */
> +#define wbflush()			\
> +	do {				\
> +		__sync();		\
> +		__wbflush();		\
> +	} while (0)
>
> -#define wbflush()  do { } while(0)
> +#else /* !CONFIG_CPU_HAS_WB */
>
> -#endif
> +#define wbflush_setup() do { } while (0)
>
> -extern void wbflush_setup(void);
> +#define wbflush() fast_iob()
> +
> +#endif /* !CONFIG_CPU_HAS_WB */
>
>  #endif /* __ASM_MIPS_WBFLUSH_H */
> diff -up --recursive --new-file
> linux-mips-2.4.17-20020129.macro/include/asm-mips64/system.h
>  linux-mips-2.4.17-20020129/include/asm-mips64/system.h
> ---
> linux-mips-2.4.17-20020129.macro/include/asm-mips64/system.
> h	Sun Jan 27 05:27:59 2002
> +++ linux-mips-2.4.17-20020129/include/asm-mips64/system.h
> Mon Feb  4 02:12:27 2002
> @@ -11,12 +11,13 @@
>  #define _ASM_SYSTEM_H
>
>  #include <linux/config.h>
> -
>  #include <asm/sgidefs.h>
> -#include <asm/ptrace.h>
>
>  #include <linux/kernel.h>
>
> +#include <asm/addrspace.h>
> +#include <asm/ptrace.h>
> +
>  __asm__ (
>  	".macro\t__sti\n\t"
>  	".set\tpush\n\t"
> @@ -163,20 +164,32 @@ extern void __global_restore_flags(unsig
>  #define local_irq_disable()	__cli();
>  #define local_irq_enable()	__sti();
>
> -/*
> - * These are probably defined overly paranoid ...
> - */
> -#define mb()						\
> -__asm__ __volatile__(					\
> -	"# prevent instructions being moved around\n\t"	\
> -	".set\tnoreorder\n\t"				\
> -	"sync\n\t"					\
> -	".set\treorder"					\
> -	: /* no output */				\
> -	: /* no input */				\
> -	: "memory")
> -#define rmb() mb()
> -#define wmb() mb()
> +#define __sync()				\
> +	__asm__ __volatile__(			\
> +		".set	push\n\t"		\
> +		".set	noreorder\n\t"		\
> +		"sync\n\t"			\
> +		".set	pop"			\
> +		: /* no output */		\
> +		: /* no input */		\
> +		: "memory")
> +
> +#define wmb()		__sync()
> +#define rmb()		__sync()
> +#define mb()		__sync()
> +#define iob()					\
> +	do {					\
> +		__sync();			\
> +		__asm__ __volatile__(		\
> +			".set	push\n\t"	\
> +			".set	noreorder\n\t"	\
> +			"lw	$0,%0\n\t"	\
> +			"nop\n\t"		\
> +			".set	pop"		\
> +			: /* no output */	\
> +			: "m" (*(int *)KSEG1)	\
> +			: "memory");		\
> +	} while (0)
>
>  #ifdef CONFIG_SMP
>  #define smp_mb()	mb()
>


[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux