XenevaOS
Loading...
Searching...
No Matches
Macros | Functions
preempt.h File Reference
#include <linux/linkage.h>
#include <linux/cleanup.h>
#include <linux/types.h>
#include <asm/preempt.h>
Include dependency graph for preempt.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define PREEMPT_BITS   8
 
#define SOFTIRQ_BITS   8
 
#define HARDIRQ_BITS   4
 
#define NMI_BITS   4
 
#define PREEMPT_SHIFT   0
 
#define SOFTIRQ_SHIFT   (PREEMPT_SHIFT + PREEMPT_BITS)
 
#define HARDIRQ_SHIFT   (SOFTIRQ_SHIFT + SOFTIRQ_BITS)
 
#define NMI_SHIFT   (HARDIRQ_SHIFT + HARDIRQ_BITS)
 
#define __IRQ_MASK(x)   ((1UL << (x))-1)
 
#define PREEMPT_MASK   (__IRQ_MASK(PREEMPT_BITS) << PREEMPT_SHIFT)
 
#define SOFTIRQ_MASK   (__IRQ_MASK(SOFTIRQ_BITS) << SOFTIRQ_SHIFT)
 
#define HARDIRQ_MASK   (__IRQ_MASK(HARDIRQ_BITS) << HARDIRQ_SHIFT)
 
#define NMI_MASK   (__IRQ_MASK(NMI_BITS) << NMI_SHIFT)
 
#define PREEMPT_OFFSET   (1UL << PREEMPT_SHIFT)
 
#define SOFTIRQ_OFFSET   (1UL << SOFTIRQ_SHIFT)
 
#define HARDIRQ_OFFSET   (1UL << HARDIRQ_SHIFT)
 
#define NMI_OFFSET   (1UL << NMI_SHIFT)
 
#define SOFTIRQ_DISABLE_OFFSET   (2 * SOFTIRQ_OFFSET)
 
#define PREEMPT_DISABLED   (PREEMPT_DISABLE_OFFSET + PREEMPT_ENABLED)
 
#define INIT_PREEMPT_COUNT   PREEMPT_OFFSET
 
#define FORK_PREEMPT_COUNT   (2*PREEMPT_DISABLE_OFFSET + PREEMPT_ENABLED)
 
#define nmi_count()   (preempt_count() & NMI_MASK)
 
#define hardirq_count()   (preempt_count() & HARDIRQ_MASK)
 
#define softirq_count()   (preempt_count() & SOFTIRQ_MASK)
 
#define irq_count()   (preempt_count() & (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_MASK))
 
#define in_nmi()   (nmi_count())
 
#define in_hardirq()   (hardirq_count())
 
#define in_serving_softirq()   (softirq_count() & SOFTIRQ_OFFSET)
 
#define in_task()   (!(preempt_count() & (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET)))
 
#define in_softirq()   (softirq_count())
 
#define in_interrupt()   (irq_count())
 
#define PREEMPT_DISABLE_OFFSET   0
 
#define PREEMPT_LOCK_OFFSET   PREEMPT_DISABLE_OFFSET
 
#define SOFTIRQ_LOCK_OFFSET   (SOFTIRQ_DISABLE_OFFSET + PREEMPT_LOCK_OFFSET)
 
#define in_atomic()   (preempt_count() != 0)
 
#define in_atomic_preempt_off()   (preempt_count() != PREEMPT_DISABLE_OFFSET)
 
#define preempt_count_add(val)   __preempt_count_add(val)
 
#define preempt_count_sub(val)   __preempt_count_sub(val)
 
#define preempt_count_dec_and_test()   __preempt_count_dec_and_test()
 
#define __preempt_count_inc()   __preempt_count_add(1)
 
#define __preempt_count_dec()   __preempt_count_sub(1)
 
#define preempt_count_inc()   preempt_count_add(1)
 
#define preempt_count_dec()   preempt_count_sub(1)
 
#define preempt_disable()   barrier()
 
#define sched_preempt_enable_no_resched()   barrier()
 
#define preempt_enable_no_resched()   barrier()
 
#define preempt_enable()   barrier()
 
#define preempt_check_resched()   do { } while (0)
 
#define preempt_disable_notrace()   barrier()
 
#define preempt_enable_no_resched_notrace()   barrier()
 
#define preempt_enable_notrace()   barrier()
 
#define preemptible()   0
 
#define preempt_set_need_resched()
 
#define preempt_fold_need_resched()
 
#define preempt_disable_nested()
 

Functions

 DEFINE_LOCK_GUARD_0 (preempt, preempt_disable(), preempt_enable()) DEFINE_LOCK_GUARD_0(preempt_notrace
 
const char * preempt_model_str (void)
 

Macro Definition Documentation

◆ __IRQ_MASK

#define __IRQ_MASK (   x)    ((1UL << (x))-1)

◆ __preempt_count_dec

#define __preempt_count_dec ( )    __preempt_count_sub(1)

◆ __preempt_count_inc

#define __preempt_count_inc ( )    __preempt_count_add(1)

◆ FORK_PREEMPT_COUNT

#define FORK_PREEMPT_COUNT   (2*PREEMPT_DISABLE_OFFSET + PREEMPT_ENABLED)

◆ HARDIRQ_BITS

#define HARDIRQ_BITS   4

◆ hardirq_count

#define hardirq_count ( )    (preempt_count() & HARDIRQ_MASK)

◆ HARDIRQ_MASK

#define HARDIRQ_MASK   (__IRQ_MASK(HARDIRQ_BITS) << HARDIRQ_SHIFT)

◆ HARDIRQ_OFFSET

#define HARDIRQ_OFFSET   (1UL << HARDIRQ_SHIFT)

◆ HARDIRQ_SHIFT

#define HARDIRQ_SHIFT   (SOFTIRQ_SHIFT + SOFTIRQ_BITS)

◆ in_atomic

#define in_atomic ( )    (preempt_count() != 0)

◆ in_atomic_preempt_off

#define in_atomic_preempt_off ( )    (preempt_count() != PREEMPT_DISABLE_OFFSET)

◆ in_hardirq

#define in_hardirq ( )    (hardirq_count())

◆ in_interrupt

#define in_interrupt ( )    (irq_count())

◆ in_nmi

#define in_nmi ( )    (nmi_count())

◆ in_serving_softirq

#define in_serving_softirq ( )    (softirq_count() & SOFTIRQ_OFFSET)

◆ in_softirq

#define in_softirq ( )    (softirq_count())

◆ in_task

#define in_task ( )    (!(preempt_count() & (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET)))

◆ INIT_PREEMPT_COUNT

#define INIT_PREEMPT_COUNT   PREEMPT_OFFSET

◆ irq_count

#define irq_count ( )    (preempt_count() & (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_MASK))

◆ NMI_BITS

#define NMI_BITS   4

◆ nmi_count

#define nmi_count ( )    (preempt_count() & NMI_MASK)

◆ NMI_MASK

#define NMI_MASK   (__IRQ_MASK(NMI_BITS) << NMI_SHIFT)

◆ NMI_OFFSET

#define NMI_OFFSET   (1UL << NMI_SHIFT)

◆ NMI_SHIFT

#define NMI_SHIFT   (HARDIRQ_SHIFT + HARDIRQ_BITS)

◆ PREEMPT_BITS

#define PREEMPT_BITS   8

◆ preempt_check_resched

#define preempt_check_resched ( )    do { } while (0)

◆ preempt_count_add

#define preempt_count_add (   val)    __preempt_count_add(val)

◆ preempt_count_dec

#define preempt_count_dec ( )    preempt_count_sub(1)

◆ preempt_count_dec_and_test

#define preempt_count_dec_and_test ( )    __preempt_count_dec_and_test()

◆ preempt_count_inc

#define preempt_count_inc ( )    preempt_count_add(1)

◆ preempt_count_sub

#define preempt_count_sub (   val)    __preempt_count_sub(val)

◆ preempt_disable

#define preempt_disable ( )    barrier()

◆ preempt_disable_nested

#define preempt_disable_nested ( )
Value:
do { \
if (IS_ENABLED(CONFIG_PREEMPT_RT)) \
preempt_disable(); \
else \
lockdep_assert_preemption_disabled(); \
} while (0)
#define IS_ENABLED(option)
Definition kconfig.h:80

preempt_disable_nested - Disable preemption inside a normally preempt disabled section

Use for code which requires preemption protection inside a critical section which has preemption disabled implicitly on non-PREEMPT_RT enabled kernels, by e.g.:

  • holding a spinlock/rwlock
  • soft interrupt context
  • regular interrupt handlers

On PREEMPT_RT enabled kernels spinlock/rwlock held sections, soft interrupt context and regular interrupt handlers are preemptible and only prevent migration. preempt_disable_nested() ensures that preemption is disabled for cases which require CPU local serialization even on PREEMPT_RT. For non-PREEMPT_RT kernels this is a NOP.

The use cases are code sequences which are not serialized by a particular lock instance, e.g.:

  • seqcount write side critical sections where the seqcount is not associated to a particular lock and therefore the automatic protection mechanism does not work. This prevents a live lock against a preempting high priority reader.
  • RMW per CPU variable updates like vmstat.

◆ preempt_disable_notrace

preempt_disable_notrace ( )    barrier()

◆ PREEMPT_DISABLE_OFFSET

#define PREEMPT_DISABLE_OFFSET   0

◆ PREEMPT_DISABLED

#define PREEMPT_DISABLED   (PREEMPT_DISABLE_OFFSET + PREEMPT_ENABLED)

◆ preempt_enable

#define preempt_enable ( )    barrier()

◆ preempt_enable_no_resched

#define preempt_enable_no_resched ( )    barrier()

◆ preempt_enable_no_resched_notrace

#define preempt_enable_no_resched_notrace ( )    barrier()

◆ preempt_enable_notrace

preempt_enable_notrace ( )    barrier()

◆ preempt_fold_need_resched

#define preempt_fold_need_resched ( )
Value:
do { \
if (tif_need_resched()) \
set_preempt_need_resched(); \
} while (0)

◆ PREEMPT_LOCK_OFFSET

#define PREEMPT_LOCK_OFFSET   PREEMPT_DISABLE_OFFSET

◆ PREEMPT_MASK

#define PREEMPT_MASK   (__IRQ_MASK(PREEMPT_BITS) << PREEMPT_SHIFT)

◆ PREEMPT_OFFSET

#define PREEMPT_OFFSET   (1UL << PREEMPT_SHIFT)

◆ preempt_set_need_resched

#define preempt_set_need_resched ( )
Value:
do { \
set_preempt_need_resched(); \
} while (0)

◆ PREEMPT_SHIFT

#define PREEMPT_SHIFT   0

◆ preemptible

#define preemptible ( )    0

◆ sched_preempt_enable_no_resched

#define sched_preempt_enable_no_resched ( )    barrier()

◆ SOFTIRQ_BITS

#define SOFTIRQ_BITS   8

◆ softirq_count

#define softirq_count ( )    (preempt_count() & SOFTIRQ_MASK)

◆ SOFTIRQ_DISABLE_OFFSET

#define SOFTIRQ_DISABLE_OFFSET   (2 * SOFTIRQ_OFFSET)

◆ SOFTIRQ_LOCK_OFFSET

#define SOFTIRQ_LOCK_OFFSET   (SOFTIRQ_DISABLE_OFFSET + PREEMPT_LOCK_OFFSET)

◆ SOFTIRQ_MASK

#define SOFTIRQ_MASK   (__IRQ_MASK(SOFTIRQ_BITS) << SOFTIRQ_SHIFT)

◆ SOFTIRQ_OFFSET

#define SOFTIRQ_OFFSET   (1UL << SOFTIRQ_SHIFT)

◆ SOFTIRQ_SHIFT

#define SOFTIRQ_SHIFT   (PREEMPT_SHIFT + PREEMPT_BITS)

Function Documentation

◆ DEFINE_LOCK_GUARD_0()

DEFINE_LOCK_GUARD_0 ( preempt  ,
preempt_disable()  ,
preempt_enable()   
)

◆ preempt_model_str()

const char * preempt_model_str ( void  )
extern