···11+/* Generic barrier definitions, based on MN10300 definitions.22+ *33+ * It should be possible to use these on really simple architectures,44+ * but it serves more as a starting point for new ports.55+ *66+ * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.77+ * Written by David Howells (dhowells@redhat.com)88+ *99+ * This program is free software; you can redistribute it and/or1010+ * modify it under the terms of the GNU General Public Licence1111+ * as published by the Free Software Foundation; either version1212+ * 2 of the Licence, or (at your option) any later version.1313+ */1414+#ifndef __ASM_GENERIC_BARRIER_H1515+#define __ASM_GENERIC_BARRIER_H1616+1717+#ifndef __ASSEMBLY__1818+1919+#define nop() asm volatile ("nop")2020+2121+/*2222+ * Force strict CPU ordering.2323+ * And yes, this is required on UP too when we're talking2424+ * to devices.2525+ *2626+ * This implementation only contains a compiler barrier.2727+ */2828+2929+#define mb() asm volatile ("": : :"memory")3030+#define rmb() mb()3131+#define wmb() asm volatile ("": : :"memory")3232+3333+#ifdef CONFIG_SMP3434+#define smp_mb() mb()3535+#define smp_rmb() rmb()3636+#define smp_wmb() wmb()3737+#else3838+#define smp_mb() barrier()3939+#define smp_rmb() barrier()4040+#define smp_wmb() barrier()4141+#endif4242+4343+#define set_mb(var, value) do { var = value; mb(); } while (0)4444+#define set_wmb(var, value) do { var = value; wmb(); } while (0)4545+4646+#define read_barrier_depends() do {} while (0)4747+#define smp_read_barrier_depends() do {} while (0)4848+4949+#endif /* !__ASSEMBLY__ */5050+#endif /* __ASM_GENERIC_BARRIER_H */
+1-33
include/asm-generic/system.h
···1919#include <linux/types.h>2020#include <linux/irqflags.h>21212222+#include <asm/barrier.h>2223#include <asm/cmpxchg.h>23242425struct task_struct;···34333534#define arch_align_stack(x) (x)36353737-#define nop() asm volatile ("nop")3838-3939-#endif /* !__ASSEMBLY__ */4040-4141-/*4242- * Force strict CPU ordering.4343- * And yes, this is required on UP too when we're talking4444- * to devices.4545- *4646- * This implementation only contains a compiler barrier.4747- */4848-4949-#define mb() asm volatile ("": : :"memory")5050-#define rmb() mb()5151-#define wmb() asm volatile ("": : :"memory")5252-5353-#ifdef CONFIG_SMP5454-#define smp_mb() mb()5555-#define smp_rmb() rmb()5656-#define smp_wmb() wmb()5757-#else5858-#define smp_mb() barrier()5959-#define smp_rmb() barrier()6060-#define smp_wmb() barrier()6161-#endif6262-6363-#define set_mb(var, value) do { var = value; mb(); } while (0)6464-#define set_wmb(var, value) do { var = value; wmb(); } while (0)6565-6666-#define read_barrier_depends() do {} while (0)6767-#define smp_read_barrier_depends() do {} while (0)6868-6936/*7037 * we make sure local_irq_enable() doesn't cause priority inversion7138 */7272-#ifndef __ASSEMBLY__73397440/* This function doesn't exist, so you'll get a linker error7541 * if something tries to do an invalid xchg(). */