diff options
Diffstat (limited to 'kernel/sched/sched.h')
-rw-r--r-- | kernel/sched/sched.h | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index b3cb895d14a2..0db2c1b3361e 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h | |||
@@ -911,6 +911,10 @@ struct rq { | |||
911 | 911 | ||
912 | atomic_t nr_iowait; | 912 | atomic_t nr_iowait; |
913 | 913 | ||
914 | #ifdef CONFIG_MEMBARRIER | ||
915 | int membarrier_state; | ||
916 | #endif | ||
917 | |||
914 | #ifdef CONFIG_SMP | 918 | #ifdef CONFIG_SMP |
915 | struct root_domain *rd; | 919 | struct root_domain *rd; |
916 | struct sched_domain __rcu *sd; | 920 | struct sched_domain __rcu *sd; |
@@ -2438,3 +2442,33 @@ static inline bool sched_energy_enabled(void) | |||
2438 | static inline bool sched_energy_enabled(void) { return false; } | 2442 | static inline bool sched_energy_enabled(void) { return false; } |
2439 | 2443 | ||
2440 | #endif /* CONFIG_ENERGY_MODEL && CONFIG_CPU_FREQ_GOV_SCHEDUTIL */ | 2444 | #endif /* CONFIG_ENERGY_MODEL && CONFIG_CPU_FREQ_GOV_SCHEDUTIL */ |
2445 | |||
2446 | #ifdef CONFIG_MEMBARRIER | ||
2447 | /* | ||
2448 | * The scheduler provides memory barriers required by membarrier between: | ||
2449 | * - prior user-space memory accesses and store to rq->membarrier_state, | ||
2450 | * - store to rq->membarrier_state and following user-space memory accesses. | ||
2451 | * In the same way it provides those guarantees around store to rq->curr. | ||
2452 | */ | ||
2453 | static inline void membarrier_switch_mm(struct rq *rq, | ||
2454 | struct mm_struct *prev_mm, | ||
2455 | struct mm_struct *next_mm) | ||
2456 | { | ||
2457 | int membarrier_state; | ||
2458 | |||
2459 | if (prev_mm == next_mm) | ||
2460 | return; | ||
2461 | |||
2462 | membarrier_state = atomic_read(&next_mm->membarrier_state); | ||
2463 | if (READ_ONCE(rq->membarrier_state) == membarrier_state) | ||
2464 | return; | ||
2465 | |||
2466 | WRITE_ONCE(rq->membarrier_state, membarrier_state); | ||
2467 | } | ||
2468 | #else | ||
2469 | static inline void membarrier_switch_mm(struct rq *rq, | ||
2470 | struct mm_struct *prev_mm, | ||
2471 | struct mm_struct *next_mm) | ||
2472 | { | ||
2473 | } | ||
2474 | #endif | ||