aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/sched.c41
1 files changed, 15 insertions, 26 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index a4c156d9a4a5..93bfb086e60f 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -1453,27 +1453,13 @@ static void
1453update_group_shares_cpu(struct task_group *tg, int cpu, 1453update_group_shares_cpu(struct task_group *tg, int cpu,
1454 unsigned long sd_shares, unsigned long sd_rq_weight) 1454 unsigned long sd_shares, unsigned long sd_rq_weight)
1455{ 1455{
1456 int boost = 0;
1457 unsigned long shares; 1456 unsigned long shares;
1458 unsigned long rq_weight; 1457 unsigned long rq_weight;
1459 1458
1460 if (!tg->se[cpu]) 1459 if (!tg->se[cpu])
1461 return; 1460 return;
1462 1461
1463 rq_weight = tg->cfs_rq[cpu]->load.weight; 1462 rq_weight = tg->cfs_rq[cpu]->rq_weight;
1464
1465 /*
1466 * If there are currently no tasks on the cpu pretend there is one of
1467 * average load so that when a new task gets to run here it will not
1468 * get delayed by group starvation.
1469 */
1470 if (!rq_weight) {
1471 boost = 1;
1472 rq_weight = NICE_0_LOAD;
1473 }
1474
1475 if (unlikely(rq_weight > sd_rq_weight))
1476 rq_weight = sd_rq_weight;
1477 1463
1478 /* 1464 /*
1479 * \Sum shares * rq_weight 1465 * \Sum shares * rq_weight
@@ -1481,7 +1467,7 @@ update_group_shares_cpu(struct task_group *tg, int cpu,
1481 * \Sum rq_weight 1467 * \Sum rq_weight
1482 * 1468 *
1483 */ 1469 */
1484 shares = (sd_shares * rq_weight) / (sd_rq_weight + 1); 1470 shares = (sd_shares * rq_weight) / sd_rq_weight;
1485 shares = clamp_t(unsigned long, shares, MIN_SHARES, MAX_SHARES); 1471 shares = clamp_t(unsigned long, shares, MIN_SHARES, MAX_SHARES);
1486 1472
1487 if (abs(shares - tg->se[cpu]->load.weight) > 1473 if (abs(shares - tg->se[cpu]->load.weight) >
@@ -1490,11 +1476,7 @@ update_group_shares_cpu(struct task_group *tg, int cpu,
1490 unsigned long flags; 1476 unsigned long flags;
1491 1477
1492 spin_lock_irqsave(&rq->lock, flags); 1478 spin_lock_irqsave(&rq->lock, flags);
1493 /* 1479 tg->cfs_rq[cpu]->shares = shares;
1494 * record the actual number of shares, not the boosted amount.
1495 */
1496 tg->cfs_rq[cpu]->shares = boost ? 0 : shares;
1497 tg->cfs_rq[cpu]->rq_weight = rq_weight;
1498 1480
1499 __set_se_shares(tg->se[cpu], shares); 1481 __set_se_shares(tg->se[cpu], shares);
1500 spin_unlock_irqrestore(&rq->lock, flags); 1482 spin_unlock_irqrestore(&rq->lock, flags);
@@ -1508,13 +1490,23 @@ update_group_shares_cpu(struct task_group *tg, int cpu,
1508 */ 1490 */
1509static int tg_shares_up(struct task_group *tg, void *data) 1491static int tg_shares_up(struct task_group *tg, void *data)
1510{ 1492{
1511 unsigned long rq_weight = 0; 1493 unsigned long weight, rq_weight = 0;
1512 unsigned long shares = 0; 1494 unsigned long shares = 0;
1513 struct sched_domain *sd = data; 1495 struct sched_domain *sd = data;
1514 int i; 1496 int i;
1515 1497
1516 for_each_cpu_mask(i, sd->span) { 1498 for_each_cpu_mask(i, sd->span) {
1517 rq_weight += tg->cfs_rq[i]->load.weight; 1499 /*
1500 * If there are currently no tasks on the cpu pretend there
1501 * is one of average load so that when a new task gets to
1502 * run here it will not get delayed by group starvation.
1503 */
1504 weight = tg->cfs_rq[i]->load.weight;
1505 if (!weight)
1506 weight = NICE_0_LOAD;
1507
1508 tg->cfs_rq[i]->rq_weight = weight;
1509 rq_weight += weight;
1518 shares += tg->cfs_rq[i]->shares; 1510 shares += tg->cfs_rq[i]->shares;
1519 } 1511 }
1520 1512
@@ -1524,9 +1516,6 @@ static int tg_shares_up(struct task_group *tg, void *data)
1524 if (!sd->parent || !(sd->parent->flags & SD_LOAD_BALANCE)) 1516 if (!sd->parent || !(sd->parent->flags & SD_LOAD_BALANCE))
1525 shares = tg->shares; 1517 shares = tg->shares;
1526 1518
1527 if (!rq_weight)
1528 rq_weight = cpus_weight(sd->span) * NICE_0_LOAD;
1529
1530 for_each_cpu_mask(i, sd->span) 1519 for_each_cpu_mask(i, sd->span)
1531 update_group_shares_cpu(tg, i, shares, rq_weight); 1520 update_group_shares_cpu(tg, i, shares, rq_weight);
1532 1521