mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 10:49:33 +00:00
![Juri Lelli](/assets/img/avatar_default.png)
Data from tests confirmed that the original active load balancing logic didn't scale neither in the number of CPU nor in the number of tasks (as sched_rt does). Here we provide a global data structure to keep track of deadlines of the running tasks in the system. The structure is composed by a bitmask showing the free CPUs and a max-heap, needed when the system is heavily loaded. The implementation and concurrent access scheme are kept simple by design. However, our measurements show that we can compete with sched_rt on large multi-CPUs machines [1]. Only the push path is addressed, the extension to use this structure also for pull decisions is straightforward. However, we are currently evaluating different (in order to decrease/avoid contention) data structures to solve possibly both problems. We are also going to re-run tests considering recent changes inside cpupri [2]. [1] http://retis.sssup.it/~jlelli/papers/Ospert11Lelli.pdf [2] http://www.spinics.net/lists/linux-rt-users/msg06778.html Signed-off-by: Juri Lelli <juri.lelli@gmail.com> Signed-off-by: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1383831828-15501-14-git-send-email-juri.lelli@gmail.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
33 lines
680 B
C
33 lines
680 B
C
#ifndef _LINUX_CPUDL_H
|
|
#define _LINUX_CPUDL_H
|
|
|
|
#include <linux/sched.h>
|
|
|
|
#define IDX_INVALID -1
|
|
|
|
struct array_item {
|
|
u64 dl;
|
|
int cpu;
|
|
};
|
|
|
|
struct cpudl {
|
|
raw_spinlock_t lock;
|
|
int size;
|
|
int cpu_to_idx[NR_CPUS];
|
|
struct array_item elements[NR_CPUS];
|
|
cpumask_var_t free_cpus;
|
|
};
|
|
|
|
|
|
#ifdef CONFIG_SMP
|
|
int cpudl_find(struct cpudl *cp, struct task_struct *p,
|
|
struct cpumask *later_mask);
|
|
void cpudl_set(struct cpudl *cp, int cpu, u64 dl, int is_valid);
|
|
int cpudl_init(struct cpudl *cp);
|
|
void cpudl_cleanup(struct cpudl *cp);
|
|
#else
|
|
#define cpudl_set(cp, cpu, dl) do { } while (0)
|
|
#define cpudl_init() do { } while (0)
|
|
#endif /* CONFIG_SMP */
|
|
|
|
#endif /* _LINUX_CPUDL_H */
|