Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 318810
b: refs/heads/master
c: 20ff51a
h: refs/heads/master
v: v3
  • Loading branch information
Colin Cross authored and Len Brown committed Jun 2, 2012
1 parent 831b1f5 commit 1264150
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 4126c0197bc8c58a0bb7fcda07b01b596b6fb4c5
refs/heads/master: 20ff51a36b2cd25ee7eb3216b6d02b68935435ba
37 changes: 37 additions & 0 deletions trunk/drivers/cpuidle/coupled.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,43 @@ static DEFINE_PER_CPU(struct call_single_data, cpuidle_coupled_poke_cb);
*/
static cpumask_t cpuidle_coupled_poked_mask;

/**
* cpuidle_coupled_parallel_barrier - synchronize all online coupled cpus
* @dev: cpuidle_device of the calling cpu
* @a: atomic variable to hold the barrier
*
* No caller to this function will return from this function until all online
* cpus in the same coupled group have called this function. Once any caller
* has returned from this function, the barrier is immediately available for
* reuse.
*
* The atomic variable a must be initialized to 0 before any cpu calls
* this function, will be reset to 0 before any cpu returns from this function.
*
* Must only be called from within a coupled idle state handler
* (state.enter when state.flags has CPUIDLE_FLAG_COUPLED set).
*
* Provides full smp barrier semantics before and after calling.
*/
void cpuidle_coupled_parallel_barrier(struct cpuidle_device *dev, atomic_t *a)
{
int n = dev->coupled->online_count;

smp_mb__before_atomic_inc();
atomic_inc(a);

while (atomic_read(a) < n)
cpu_relax();

if (atomic_inc_return(a) == n * 2) {
atomic_set(a, 0);
return;
}

while (atomic_read(a) > n)
cpu_relax();
}

/**
* cpuidle_state_is_coupled - check if a state is part of a coupled set
* @dev: struct cpuidle_device for the current cpu
Expand Down
4 changes: 4 additions & 0 deletions trunk/include/linux/cpuidle.h
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,10 @@ static inline int cpuidle_play_dead(void) {return -ENODEV; }

#endif

#ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED
void cpuidle_coupled_parallel_barrier(struct cpuidle_device *dev, atomic_t *a);
#endif

/******************************
* CPUIDLE GOVERNOR INTERFACE *
******************************/
Expand Down

0 comments on commit 1264150

Please sign in to comment.