lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20090214003210.GB22590@x200.localdomain>
Date:	Sat, 14 Feb 2009 03:32:10 +0300
From:	Alexey Dobriyan <adobriyan@...il.com>
To:	torvalds@...ux-foundation.org
Cc:	akpm@...ux-foundation.org, mingo@...e.hu,
	linux-kernel@...r.kernel.org, linux-arch@...r.kernel.org,
	srostedt@...hat.com
Subject: Re: irqflags.h changes

On Sat, Feb 14, 2009 at 03:23:24AM +0300, Alexey Dobriyan wrote:
> Currently, linux/irqflags.h defines local_irq_enable() and friends
> through raw_* counterparts.
> 
> Sometimes it defines raw_* counterparts through local_irq_enable() and
> friends.
> 
> I'm going to end this subtle joke and make on all archs:
> 
> 	local_irq_enable()	via	raw_local_irq_enable()
> 	local_irq_disable()	via	raw_local_irq_disable()
> 	local_irq_save()	via	raw_local_irq_save()
> 	local_irq_restore()	via	raw_local_irq_restore() + stuff
> 	local_save_flags()	via	raw_local_save_flags()
> 	irqs_disabled()		via	raw_irqs_disabled_flags() + stuff
> 
> linux/irqflags.h will include asm/irqflags.h unconditionally.
> Arches that don't have asm/irqflags.h will get it through extraction
> from asm/system.h or whatever.
> 
> Users will just include <linux/irqflags.h>
> 
> Irq tracing will remain the same (it's nop depending on config option,
> after all).
> 
> Typechecking will be preserved.
> 
> Compilation will be fixed.
> 
> And possibly changing some defines into static inlines.
> 
> OK?
> 
> 
> All of this is orthogonal to irq_flags_t stuff, but I'd like to do this
> first.
> 
> Below is patch for alpha and fallout:

New patch with asm/irqflags.h actually included:

 arch/alpha/include/asm/io.h       |    1 
 arch/alpha/include/asm/irqflags.h |   14 ++++++
 arch/alpha/include/asm/system.h   |    8 ---
 drivers/base/devres.c             |    1 
 drivers/input/joystick/gamecon.c  |    1 
 include/linux/irqflags.h          |   81 +++++++++++++++-----------------------
 include/linux/kfifo.h             |    1 
 include/linux/proportions.h       |    1 
 include/linux/spinlock_api_up.h   |    2 
 include/linux/spinlock_up.h       |    2 
 kernel/notifier.c                 |    1 
 kernel/params.c                   |    1 
 kernel/smp.c                      |    1 
 lib/idr.c                         |    1 
 lib/ratelimit.c                   |    1 
 mm/internal.h                     |    1 
 mm/page_isolation.c               |    2 
 17 files changed, 63 insertions(+), 57 deletions(-)

diff --git a/arch/alpha/include/asm/io.h b/arch/alpha/include/asm/io.h
index eda9b90..b435d35 100644
--- a/arch/alpha/include/asm/io.h
+++ b/arch/alpha/include/asm/io.h
@@ -3,6 +3,7 @@
 
 #ifdef __KERNEL__
 
+#include <linux/irqflags.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
 #include <asm/compiler.h>
diff --git a/arch/alpha/include/asm/irqflags.h b/arch/alpha/include/asm/irqflags.h
new file mode 100644
index 0000000..dd3946c
--- /dev/null
+++ b/arch/alpha/include/asm/irqflags.h
@@ -0,0 +1,14 @@
+#ifndef __ALPHA_IRQFLAGS_H
+#define __ALPHA_IRQFLAGS_H
+#include <asm/system.h>
+
+#define raw_local_irq_disable()		do { setipl(IPL_MAX); barrier(); } while(0)
+#define raw_local_irq_enable()		do { barrier(); setipl(IPL_MIN); } while(0)
+#define raw_local_save_flags(flags)	((flags) = rdps())
+#define raw_local_irq_save(flags)	do { (flags) = swpipl(IPL_MAX); barrier(); } while(0)
+#define raw_local_irq_restore(flags)	do { barrier(); setipl(flags); barrier(); } while(0)
+
+#define raw_irqs_disabled()		(getipl() == IPL_MAX)
+#define raw_irqs_disabled_flags(flags)	((flags) == IPL_MAX)
+
+#endif
diff --git a/arch/alpha/include/asm/system.h b/arch/alpha/include/asm/system.h
index afe20fa..6384be8 100644
--- a/arch/alpha/include/asm/system.h
+++ b/arch/alpha/include/asm/system.h
@@ -279,14 +279,6 @@ extern int __min_ipl;
 #define getipl()		(rdps() & 7)
 #define setipl(ipl)		((void) swpipl(ipl))
 
-#define local_irq_disable()			do { setipl(IPL_MAX); barrier(); } while(0)
-#define local_irq_enable()			do { barrier(); setipl(IPL_MIN); } while(0)
-#define local_save_flags(flags)	((flags) = rdps())
-#define local_irq_save(flags)	do { (flags) = swpipl(IPL_MAX); barrier(); } while(0)
-#define local_irq_restore(flags)	do { barrier(); setipl(flags); barrier(); } while(0)
-
-#define irqs_disabled()	(getipl() == IPL_MAX)
-
 /*
  * TB routines..
  */
diff --git a/drivers/base/devres.c b/drivers/base/devres.c
index e8beb8e..a145055 100644
--- a/drivers/base/devres.c
+++ b/drivers/base/devres.c
@@ -8,6 +8,7 @@
  */
 
 #include <linux/device.h>
+#include <linux/irqflags.h>
 #include <linux/module.h>
 
 #include "base.h"
diff --git a/drivers/input/joystick/gamecon.c b/drivers/input/joystick/gamecon.c
index 07a32af..3a97bd5 100644
--- a/drivers/input/joystick/gamecon.c
+++ b/drivers/input/joystick/gamecon.c
@@ -34,6 +34,7 @@
 #include <linux/delay.h>
 #include <linux/module.h>
 #include <linux/init.h>
+#include <linux/irqflags.h>
 #include <linux/parport.h>
 #include <linux/input.h>
 #include <linux/mutex.h>
diff --git a/include/linux/irqflags.h b/include/linux/irqflags.h
index 74bde13..820642c 100644
--- a/include/linux/irqflags.h
+++ b/include/linux/irqflags.h
@@ -52,14 +52,20 @@
 # define start_critical_timings() do { } while (0)
 #endif
 
-#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
-
 #include <asm/irqflags.h>
 
-#define local_irq_enable() \
-	do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0)
-#define local_irq_disable() \
-	do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0)
+static inline void local_irq_enable(void)
+{
+	trace_hardirqs_on();
+	raw_local_irq_enable();
+}
+
+static inline void local_irq_disable(void)
+{
+	raw_local_irq_disable();
+	trace_hardirqs_off();
+}
+
 #define local_irq_save(flags)				\
 	do {						\
 		typecheck(unsigned long, flags);	\
@@ -68,35 +74,16 @@
 	} while (0)
 
 
-#define local_irq_restore(flags)			\
-	do {						\
-		typecheck(unsigned long, flags);	\
-		if (raw_irqs_disabled_flags(flags)) {	\
-			raw_local_irq_restore(flags);	\
-			trace_hardirqs_off();		\
-		} else {				\
-			trace_hardirqs_on();		\
-			raw_local_irq_restore(flags);	\
-		}					\
-	} while (0)
-#else /* !CONFIG_TRACE_IRQFLAGS_SUPPORT */
-/*
- * The local_irq_*() APIs are equal to the raw_local_irq*()
- * if !TRACE_IRQFLAGS.
- */
-# define raw_local_irq_disable()	local_irq_disable()
-# define raw_local_irq_enable()		local_irq_enable()
-# define raw_local_irq_save(flags)			\
-	do {						\
-		typecheck(unsigned long, flags);	\
-		local_irq_save(flags);			\
-	} while (0)
-# define raw_local_irq_restore(flags)			\
-	do {						\
-		typecheck(unsigned long, flags);	\
-		local_irq_restore(flags);		\
-	} while (0)
-#endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */
+static inline void local_irq_restore(unsigned long flags)
+{
+	if (raw_irqs_disabled_flags(flags)) {
+		raw_local_irq_restore(flags);
+		trace_hardirqs_off();
+	} else {
+		trace_hardirqs_on();
+		raw_local_irq_restore(flags);
+	}
+}
 
 #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
 #define safe_halt()						\
@@ -104,6 +91,7 @@
 		trace_hardirqs_on();				\
 		raw_safe_halt();				\
 	} while (0)
+#endif
 
 #define local_save_flags(flags)				\
 	do {						\
@@ -111,19 +99,16 @@
 		raw_local_save_flags(flags);		\
 	} while (0)
 
-#define irqs_disabled()						\
-({								\
-	unsigned long _flags;					\
-								\
-	raw_local_save_flags(_flags);				\
-	raw_irqs_disabled_flags(_flags);			\
-})
+static inline int irqs_disabled(void)
+{
+	unsigned long flags;
 
-#define irqs_disabled_flags(flags)		\
-({						\
-	typecheck(unsigned long, flags);	\
-	raw_irqs_disabled_flags(flags);		\
-})
-#endif		/* CONFIG_X86 */
+	raw_local_save_flags(flags);
+	return raw_irqs_disabled_flags(flags);
+}
 
+static inline int irqs_disabled_flags(unsigned long flags)
+{
+	return raw_irqs_disabled_flags(flags);
+}
 #endif
diff --git a/include/linux/kfifo.h b/include/linux/kfifo.h
index 29f62e1..e0953cc 100644
--- a/include/linux/kfifo.h
+++ b/include/linux/kfifo.h
@@ -22,6 +22,7 @@
 #define _LINUX_KFIFO_H
 
 #include <linux/kernel.h>
+#include <linux/irqflags.h>
 #include <linux/spinlock.h>
 
 struct kfifo {
diff --git a/include/linux/proportions.h b/include/linux/proportions.h
index cf793bb..3eaf516 100644
--- a/include/linux/proportions.h
+++ b/include/linux/proportions.h
@@ -9,6 +9,7 @@
 #ifndef _LINUX_PROPORTIONS_H
 #define _LINUX_PROPORTIONS_H
 
+#include <linux/irqflags.h>
 #include <linux/percpu_counter.h>
 #include <linux/spinlock.h>
 #include <linux/mutex.h>
diff --git a/include/linux/spinlock_api_up.h b/include/linux/spinlock_api_up.h
index 04e1d31..4f8fbde 100644
--- a/include/linux/spinlock_api_up.h
+++ b/include/linux/spinlock_api_up.h
@@ -5,6 +5,8 @@
 # error "please don't include this file directly"
 #endif
 
+#include <linux/irqflags.h>
+
 /*
  * include/linux/spinlock_api_up.h
  *
diff --git a/include/linux/spinlock_up.h b/include/linux/spinlock_up.h
index 938234c..d162b4a 100644
--- a/include/linux/spinlock_up.h
+++ b/include/linux/spinlock_up.h
@@ -18,6 +18,8 @@
  */
 
 #ifdef CONFIG_DEBUG_SPINLOCK
+#include <linux/irqflags.h>
+
 #define __raw_spin_is_locked(x)		((x)->slock == 0)
 
 static inline void __raw_spin_lock(raw_spinlock_t *lock)
diff --git a/kernel/notifier.c b/kernel/notifier.c
index 61d5aa5..a22ea41 100644
--- a/kernel/notifier.c
+++ b/kernel/notifier.c
@@ -1,3 +1,4 @@
+#include <linux/irqflags.h>
 #include <linux/kdebug.h>
 #include <linux/kprobes.h>
 #include <linux/module.h>
diff --git a/kernel/params.c b/kernel/params.c
index a1e3025..5eaf15b 100644
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -19,6 +19,7 @@
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/errno.h>
+#include <linux/irqflags.h>
 #include <linux/module.h>
 #include <linux/device.h>
 #include <linux/err.h>
diff --git a/kernel/smp.c b/kernel/smp.c
index bbedbb7..d9b5e1c 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -5,6 +5,7 @@
  *
  */
 #include <linux/init.h>
+#include <linux/irqflags.h>
 #include <linux/module.h>
 #include <linux/percpu.h>
 #include <linux/rcupdate.h>
diff --git a/lib/idr.c b/lib/idr.c
index c11c576..b3fe4e6 100644
--- a/lib/idr.c
+++ b/lib/idr.c
@@ -29,6 +29,7 @@
 #ifndef TEST                        // to test in user space...
 #include <linux/slab.h>
 #include <linux/init.h>
+#include <linux/irqflags.h>
 #include <linux/module.h>
 #endif
 #include <linux/err.h>
diff --git a/lib/ratelimit.c b/lib/ratelimit.c
index 26187ed..eb528f0 100644
--- a/lib/ratelimit.c
+++ b/lib/ratelimit.c
@@ -11,6 +11,7 @@
  */
 
 #include <linux/kernel.h>
+#include <linux/irqflags.h>
 #include <linux/jiffies.h>
 #include <linux/module.h>
 
diff --git a/mm/internal.h b/mm/internal.h
index 478223b..163419b 100644
--- a/mm/internal.h
+++ b/mm/internal.h
@@ -11,6 +11,7 @@
 #ifndef __MM_INTERNAL_H
 #define __MM_INTERNAL_H
 
+#include <linux/irqflags.h>
 #include <linux/mm.h>
 
 void free_pgtables(struct mmu_gather *tlb, struct vm_area_struct *start_vma,
diff --git a/mm/page_isolation.c b/mm/page_isolation.c
index 5e0ffd9..2f4b396 100644
--- a/mm/page_isolation.c
+++ b/mm/page_isolation.c
@@ -1,7 +1,7 @@
 /*
  * linux/mm/page_isolation.c
  */
-
+#include <linux/irqflags.h>
 #include <linux/mm.h>
 #include <linux/page-isolation.h>
 #include <linux/pageblock-flags.h>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ