Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 43985
b: refs/heads/master
c: c9819f4
h: refs/heads/master
i:
  43983: af0ae3d
v: v3
  • Loading branch information
Christoph Lameter authored and Linus Torvalds committed Dec 10, 2006
1 parent 9f17782 commit e01c215
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e418e1c2bf1a253916b569370653414eb28597b6
refs/heads/master: c9819f4593e8d052b41a89f47140f5c5e7e30582
3 changes: 2 additions & 1 deletion trunk/include/linux/interrupt.h
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,8 @@ enum
NET_TX_SOFTIRQ,
NET_RX_SOFTIRQ,
BLOCK_SOFTIRQ,
TASKLET_SOFTIRQ
TASKLET_SOFTIRQ,
SCHED_SOFTIRQ,
};

/* softirq mask and active fields moved to irq_cpustat_t in
Expand Down
22 changes: 17 additions & 5 deletions trunk/kernel/sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ struct rq {
unsigned long expired_timestamp;
unsigned long long timestamp_last_tick;
struct task_struct *curr, *idle;
unsigned long next_balance;
struct mm_struct *prev_mm;
struct prio_array *active, *expired, arrays[2];
int best_expired_prio;
Expand Down Expand Up @@ -2858,17 +2859,18 @@ static void update_load(struct rq *this_rq)
}

/*
* rebalance_tick will get called every timer tick, on every CPU.
* run_rebalance_domains is triggered when needed from the scheduler tick.
*
* It checks each scheduling domain to see if it is due to be balanced,
* and initiates a balancing operation if so.
*
* Balancing parameters are set up in arch_init_sched_domains.
*/

static void
rebalance_tick(int this_cpu, struct rq *this_rq)
static void run_rebalance_domains(struct softirq_action *h)
{
int this_cpu = smp_processor_id();
struct rq *this_rq = cpu_rq(this_cpu);
unsigned long interval;
struct sched_domain *sd;
/*
Expand All @@ -2877,6 +2879,8 @@ rebalance_tick(int this_cpu, struct rq *this_rq)
*/
enum idle_type idle = !this_rq->nr_running ?
SCHED_IDLE : NOT_IDLE;
/* Earliest time when we have to call run_rebalance_domains again */
unsigned long next_balance = jiffies + 60*HZ;

for_each_domain(this_cpu, sd) {
if (!(sd->flags & SD_LOAD_BALANCE))
Expand All @@ -2891,7 +2895,7 @@ rebalance_tick(int this_cpu, struct rq *this_rq)
if (unlikely(!interval))
interval = 1;

if (jiffies - sd->last_balance >= interval) {
if (time_after_eq(jiffies, sd->last_balance + interval)) {
if (load_balance(this_cpu, this_rq, sd, idle)) {
/*
* We've pulled tasks over so either we're no
Expand All @@ -2902,7 +2906,10 @@ rebalance_tick(int this_cpu, struct rq *this_rq)
}
sd->last_balance += interval;
}
if (time_after(next_balance, sd->last_balance + interval))
next_balance = sd->last_balance + interval;
}
this_rq->next_balance = next_balance;
}
#else
/*
Expand Down Expand Up @@ -3155,7 +3162,8 @@ void scheduler_tick(void)
task_running_tick(rq, p);
#ifdef CONFIG_SMP
update_load(rq);
rebalance_tick(cpu, rq);
if (time_after_eq(jiffies, rq->next_balance))
raise_softirq(SCHED_SOFTIRQ);
#endif
}

Expand Down Expand Up @@ -6859,6 +6867,10 @@ void __init sched_init(void)

set_load_weight(&init_task);

#ifdef CONFIG_SMP
open_softirq(SCHED_SOFTIRQ, run_rebalance_domains, NULL);
#endif

#ifdef CONFIG_RT_MUTEXES
plist_head_init(&init_task.pi_waiters, &init_task.pi_lock);
#endif
Expand Down

0 comments on commit e01c215

Please sign in to comment.