Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1446324 > unrolled thread
| Started by | Tommaso Cucinotta <tommaso.cucinotta@sssup.it> |
|---|---|
| First post | 2016-07-19 12:50 +0200 |
| Last post | 2016-07-19 12:50 +0200 |
| Articles | 2 — 1 participant |
Back to article view | Back to linux.kernel
SCHED_DEADLINE cpudeadline.{h,c} fixup Tommaso Cucinotta <tommaso.cucinotta@sssup.it> - 2016-07-19 12:50 +0200
[RFC PATCH 2/4] SCHED_DEADLINE cpu heap code clarification/refactory. Tommaso Cucinotta <tommaso.cucinotta@sssup.it> - 2016-07-19 12:50 +0200
| From | Tommaso Cucinotta <tommaso.cucinotta@sssup.it> |
|---|---|
| Date | 2016-07-19 12:50 +0200 |
| Subject | SCHED_DEADLINE cpudeadline.{h,c} fixup |
| Message-ID | <rWAL7-2W9-7@gated-at.bofh.it> |
Hi,
this is a rework of the cpudeadline bugfix and speed-up patch-set, that
integrates all comments received so far from Luca and Juri.
The first patch is a minimally invasive (1-line) fix for the deadline
wrap-around bug. This leaves some weirdness in how cpudl_change_key() is
called. Therefore, the second patch does a minimum of refactory to make
things more explicit and clear.
The 3rd patch contains now the actual performance enhancement (avoiding
unneeded swaps during heapify operations), which has been measured to
achieve up to 10% , of speed-up for cpudl_set() calls.
This has been measured with a andomly generated workload of 1K,10K,100K
random heap insertions and deletions (75% cpudl_set() calls with is_valid=1
and 25% with is_valid=0), and randomly generated cpu IDs, with up to 256
CPUs.
Benchmarking code is available at:
https://github.com/tomcucinotta/cpudl-bench
Obtained speed-up plot:
https://github.com/tomcucinotta/cpudl-bench/blob/master/cpudl.pdf
Finally, the 4th patch is another clear-up patch touching cpudeadline.{h,c}
and deadline.c. Now you call cpudl_clear(cp, cpu) and cpudl_set(cp, cpu, dl)
instead of cpudl_set(cp, cpu, 0 /* dl */, 0 /* is_valid */) and
cpudl_set(cp, cpu, dl, 1 /* is_valid */).
Please, share your comments, thanks!
Tommaso
[toc] | [next] | [standalone]
| From | Tommaso Cucinotta <tommaso.cucinotta@sssup.it> |
|---|---|
| Date | 2016-07-19 12:50 +0200 |
| Subject | [RFC PATCH 2/4] SCHED_DEADLINE cpu heap code clarification/refactory. |
| Message-ID | <rWAL8-2W9-29@gated-at.bofh.it> |
| In reply to | #1446324 |
1. heapify up factored out in new dedicated function heapify_up()
(avoids repeatition of same code)
2. call to cpudl_change_key() replaced with heapify_up() when
cpudl_set actually inserts a new node in the heap
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Juri Lelli <juri.lelli@arm.com>
Cc: Luca Abeni <luca.abeni@unitn.it>
Reviewed-by: Luca Abeni <luca.abeni@unitn.it>
Signed-off-by: Tommaso Cucinotta <tommaso.cucinotta@sssup.it>
---
kernel/sched/cpudeadline.c | 38 +++++++++++++++++++-------------------
1 file changed, 19 insertions(+), 19 deletions(-)
diff --git a/kernel/sched/cpudeadline.c b/kernel/sched/cpudeadline.c
index d418449..3c42702 100644
--- a/kernel/sched/cpudeadline.c
+++ b/kernel/sched/cpudeadline.c
@@ -41,7 +41,7 @@ static void cpudl_exchange(struct cpudl *cp, int a, int b)
swap(cp->elements[cpu_a].idx, cp->elements[cpu_b].idx);
}
-static void cpudl_heapify(struct cpudl *cp, int idx)
+static void cpudl_heapify_down(struct cpudl *cp, int idx)
{
int l, r, largest;
@@ -66,20 +66,25 @@ static void cpudl_heapify(struct cpudl *cp, int idx)
}
}
+static void cpudl_heapify_up(struct cpudl *cp, int idx)
+{
+ while (idx > 0 && dl_time_before(cp->elements[parent(idx)].dl,
+ cp->elements[idx].dl)) {
+ cpudl_exchange(cp, idx, parent(idx));
+ idx = parent(idx);
+ }
+}
+
static void cpudl_change_key(struct cpudl *cp, int idx, u64 new_dl)
{
WARN_ON(idx == IDX_INVALID || !cpu_present(idx));
if (dl_time_before(new_dl, cp->elements[idx].dl)) {
cp->elements[idx].dl = new_dl;
- cpudl_heapify(cp, idx);
+ cpudl_heapify_down(cp, idx);
} else {
cp->elements[idx].dl = new_dl;
- while (idx > 0 && dl_time_before(cp->elements[parent(idx)].dl,
- cp->elements[idx].dl)) {
- cpudl_exchange(cp, idx, parent(idx));
- idx = parent(idx);
- }
+ cpudl_heapify_up(cp, idx);
}
}
@@ -154,24 +159,19 @@ void cpudl_set(struct cpudl *cp, int cpu, u64 dl, int is_valid)
cp->size--;
cp->elements[new_cpu].idx = old_idx;
cp->elements[cpu].idx = IDX_INVALID;
- while (old_idx > 0 && dl_time_before(
- cp->elements[parent(old_idx)].dl,
- cp->elements[old_idx].dl)) {
- cpudl_exchange(cp, old_idx, parent(old_idx));
- old_idx = parent(old_idx);
- }
+ cpudl_heapify_up(cp, old_idx);
cpumask_set_cpu(cpu, cp->free_cpus);
- cpudl_heapify(cp, old_idx);
+ cpudl_heapify_down(cp, old_idx);
goto out;
}
if (old_idx == IDX_INVALID) {
- cp->size++;
- cp->elements[cp->size - 1].dl = dl;
- cp->elements[cp->size - 1].cpu = cpu;
- cp->elements[cpu].idx = cp->size - 1;
- cpudl_change_key(cp, cp->size - 1, dl);
+ int size1 = cp->size++;
+ cp->elements[size1].dl = dl;
+ cp->elements[size1].cpu = cpu;
+ cp->elements[cpu].idx = size1;
+ cpudl_heapify_up(cp, size1);
cpumask_clear_cpu(cpu, cp->free_cpus);
} else {
cpudl_change_key(cp, old_idx, dl);
--
2.7.4
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web