sched: convert nohz struct to cpumask_var_t.

Impact: (future) size reduction for large NR_CPUS.

Dynamically allocating cpumasks (when CONFIG_CPUMASK_OFFSTACK) saves
space for small nr_cpu_ids but big CONFIG_NR_CPUS.  cpumask_var_t
is just a struct cpumask for !CONFIG_CPUMASK_OFFSTACK.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Rusty Russell 2008-11-25 02:35:09 +10:30 committed by Ingo Molnar
parent c6c4927b22
commit 7d1e6a9b95

View File

@ -3758,10 +3758,9 @@ static void active_load_balance(struct rq *busiest_rq, int busiest_cpu)
#ifdef CONFIG_NO_HZ #ifdef CONFIG_NO_HZ
static struct { static struct {
atomic_t load_balancer; atomic_t load_balancer;
cpumask_t cpu_mask; cpumask_var_t cpu_mask;
} nohz ____cacheline_aligned = { } nohz ____cacheline_aligned = {
.load_balancer = ATOMIC_INIT(-1), .load_balancer = ATOMIC_INIT(-1),
.cpu_mask = CPU_MASK_NONE,
}; };
/* /*
@ -3789,7 +3788,7 @@ int select_nohz_load_balancer(int stop_tick)
int cpu = smp_processor_id(); int cpu = smp_processor_id();
if (stop_tick) { if (stop_tick) {
cpu_set(cpu, nohz.cpu_mask); cpumask_set_cpu(cpu, nohz.cpu_mask);
cpu_rq(cpu)->in_nohz_recently = 1; cpu_rq(cpu)->in_nohz_recently = 1;
/* /*
@ -3803,7 +3802,7 @@ int select_nohz_load_balancer(int stop_tick)
} }
/* time for ilb owner also to sleep */ /* time for ilb owner also to sleep */
if (cpus_weight(nohz.cpu_mask) == num_online_cpus()) { if (cpumask_weight(nohz.cpu_mask) == num_online_cpus()) {
if (atomic_read(&nohz.load_balancer) == cpu) if (atomic_read(&nohz.load_balancer) == cpu)
atomic_set(&nohz.load_balancer, -1); atomic_set(&nohz.load_balancer, -1);
return 0; return 0;
@ -3816,10 +3815,10 @@ int select_nohz_load_balancer(int stop_tick)
} else if (atomic_read(&nohz.load_balancer) == cpu) } else if (atomic_read(&nohz.load_balancer) == cpu)
return 1; return 1;
} else { } else {
if (!cpu_isset(cpu, nohz.cpu_mask)) if (!cpumask_test_cpu(cpu, nohz.cpu_mask))
return 0; return 0;
cpu_clear(cpu, nohz.cpu_mask); cpumask_clear_cpu(cpu, nohz.cpu_mask);
if (atomic_read(&nohz.load_balancer) == cpu) if (atomic_read(&nohz.load_balancer) == cpu)
if (atomic_cmpxchg(&nohz.load_balancer, cpu, -1) != cpu) if (atomic_cmpxchg(&nohz.load_balancer, cpu, -1) != cpu)
@ -3930,12 +3929,13 @@ static void run_rebalance_domains(struct softirq_action *h)
*/ */
if (this_rq->idle_at_tick && if (this_rq->idle_at_tick &&
atomic_read(&nohz.load_balancer) == this_cpu) { atomic_read(&nohz.load_balancer) == this_cpu) {
cpumask_t cpus = nohz.cpu_mask;
struct rq *rq; struct rq *rq;
int balance_cpu; int balance_cpu;
cpu_clear(this_cpu, cpus); for_each_cpu(balance_cpu, nohz.cpu_mask) {
for_each_cpu(balance_cpu, &cpus) { if (balance_cpu == this_cpu)
continue;
/* /*
* If this cpu gets work to do, stop the load balancing * If this cpu gets work to do, stop the load balancing
* work being done for other cpus. Next load * work being done for other cpus. Next load
@ -3973,7 +3973,7 @@ static inline void trigger_load_balance(struct rq *rq, int cpu)
rq->in_nohz_recently = 0; rq->in_nohz_recently = 0;
if (atomic_read(&nohz.load_balancer) == cpu) { if (atomic_read(&nohz.load_balancer) == cpu) {
cpu_clear(cpu, nohz.cpu_mask); cpumask_clear_cpu(cpu, nohz.cpu_mask);
atomic_set(&nohz.load_balancer, -1); atomic_set(&nohz.load_balancer, -1);
} }
@ -3986,7 +3986,7 @@ static inline void trigger_load_balance(struct rq *rq, int cpu)
* TBD: Traverse the sched domains and nominate * TBD: Traverse the sched domains and nominate
* the nearest cpu in the nohz.cpu_mask. * the nearest cpu in the nohz.cpu_mask.
*/ */
int ilb = first_cpu(nohz.cpu_mask); int ilb = cpumask_first(nohz.cpu_mask);
if (ilb < nr_cpu_ids) if (ilb < nr_cpu_ids)
resched_cpu(ilb); resched_cpu(ilb);
@ -3998,7 +3998,7 @@ static inline void trigger_load_balance(struct rq *rq, int cpu)
* cpus with ticks stopped, is it time for that to stop? * cpus with ticks stopped, is it time for that to stop?
*/ */
if (rq->idle_at_tick && atomic_read(&nohz.load_balancer) == cpu && if (rq->idle_at_tick && atomic_read(&nohz.load_balancer) == cpu &&
cpus_weight(nohz.cpu_mask) == num_online_cpus()) { cpumask_weight(nohz.cpu_mask) == num_online_cpus()) {
resched_cpu(cpu); resched_cpu(cpu);
return; return;
} }
@ -4008,7 +4008,7 @@ static inline void trigger_load_balance(struct rq *rq, int cpu)
* someone else, then no need raise the SCHED_SOFTIRQ * someone else, then no need raise the SCHED_SOFTIRQ
*/ */
if (rq->idle_at_tick && atomic_read(&nohz.load_balancer) != cpu && if (rq->idle_at_tick && atomic_read(&nohz.load_balancer) != cpu &&
cpu_isset(cpu, nohz.cpu_mask)) cpumask_test_cpu(cpu, nohz.cpu_mask))
return; return;
#endif #endif
if (time_after_eq(jiffies, rq->next_balance)) if (time_after_eq(jiffies, rq->next_balance))
@ -8309,6 +8309,9 @@ void __init sched_init(void)
/* Allocate the nohz_cpu_mask if CONFIG_CPUMASK_OFFSTACK */ /* Allocate the nohz_cpu_mask if CONFIG_CPUMASK_OFFSTACK */
alloc_bootmem_cpumask_var(&nohz_cpu_mask); alloc_bootmem_cpumask_var(&nohz_cpu_mask);
#ifdef CONFIG_NO_HZ
alloc_bootmem_cpumask_var(&nohz.cpu_mask);
#endif
scheduler_running = 1; scheduler_running = 1;
} }