X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=include%2Flinux%2Fhardirq.h;h=2961ec788046627c823feb291d7d522f15982fbf;hb=0ba6c33bcddc64a54b5f1c25a696c4767dc76292;hp=612472aaa79c1607159794a2257356bde263e9a0;hpb=13bbd8d90647132fc295d73b122567eb8987d298;p=linux-2.6 diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h index 612472aaa7..2961ec7880 100644 --- a/include/linux/hardirq.h +++ b/include/linux/hardirq.h @@ -72,12 +72,21 @@ #define in_softirq() (softirq_count()) #define in_interrupt() (irq_count()) -#if defined(CONFIG_PREEMPT) && !defined(CONFIG_PREEMPT_BKL) -# define in_atomic() ((preempt_count() & ~PREEMPT_ACTIVE) != kernel_locked()) +#define in_atomic() ((preempt_count() & ~PREEMPT_ACTIVE) != 0) + +#ifdef CONFIG_PREEMPT +# define PREEMPT_CHECK_OFFSET 1 #else -# define in_atomic() ((preempt_count() & ~PREEMPT_ACTIVE) != 0) +# define PREEMPT_CHECK_OFFSET 0 #endif +/* + * Check whether we were atomic before we did preempt_disable(): + * (used by the scheduler) + */ +#define in_atomic_preempt_off() \ + ((preempt_count() & ~PREEMPT_ACTIVE) != PREEMPT_CHECK_OFFSET) + #ifdef CONFIG_PREEMPT # define preemptible() (preempt_count() == 0 && !irqs_disabled()) # define IRQ_EXIT_OFFSET (HARDIRQ_OFFSET-1) @@ -106,13 +115,18 @@ static inline void account_system_vtime(struct task_struct *tsk) * always balanced, so the interrupted value of ->hardirq_context * will always be restored. */ -#define irq_enter() \ +#define __irq_enter() \ do { \ account_system_vtime(current); \ add_preempt_count(HARDIRQ_OFFSET); \ trace_hardirq_enter(); \ } while (0) +/* + * Enter irq context (on NO_HZ, update jiffies): + */ +extern void irq_enter(void); + /* * Exit irq context without processing softirqs: */ @@ -128,7 +142,7 @@ static inline void account_system_vtime(struct task_struct *tsk) */ extern void irq_exit(void); -#define nmi_enter() do { lockdep_off(); irq_enter(); } while (0) +#define nmi_enter() do { lockdep_off(); __irq_enter(); } while (0) #define nmi_exit() do { __irq_exit(); lockdep_on(); } while (0) #endif /* LINUX_HARDIRQ_H */