scheduler changes for v4.10
Linus,
Please pull the latest sched-core-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched-core-for-linus
# HEAD: 6b94780e45c17b83e3e75f8aaca5a328db583c74 sched/core: Use load_avg for selecting idlest group
The main scheduler changes in this cycle were:
- Support Intel Turbo Boost Max Technology 3.0 (TBM3) by introducig a notion of 'better cores', which the scheduler will prefer to schedule single threaded workloads on. (Tim Chen, Srinivas Pandruvada)
- Enhance the handling of asymmetric capacity CPUs further (Morten Rasmussen)
- Improve/fix load handling when moving tasks between task groups (Vincent Guittot)
- Simplify and clean up the cputime code (Stanislaw Gruszka)
- Improve mass fork()ed task spread a.k.a. hackbench speedup (Vincent Guittot)
- Make struct kthread kmalloc()ed and related fixes (Oleg Nesterov)
- Add uaccess atomicity debugging (when using access_ok() in the wrong context), under CONFIG_DEBUG_ATOMIC_SLEEP=y (Peter Zijlstra)
- Implement various fixes, cleanups and other enhancements (Daniel Bristot de Oliveira, Martin Schwidefsky, Rafael J. Wysocki)
Ingo
------------------>
Daniel Bristot de Oliveira (1):
sched/deadline: Fix typo in a comment
Ingo Molnar (3):
sched/fair: Clean up the tunable parameter definitions x86/sched: Use #include <linux/mutex.h> instead of #include <asm/mutex.h> sched/x86: Make CONFIG_SCHED_MC_PRIO=y easier to enable
Martin Schwidefsky (2):
sched/cpuacct: Avoid %lld seq_printf warning
sched/x86: Do not clear PREEMPT_NEED_RESCHED on preempt count reset
Matt Fleming (1):
sched/fair: Kill the unused 'sched_shares_window_ns' tunable
Morten Rasmussen (5):
sched/fair: Compute task/cpu utilization at wake-up correctly sched/fair: Consider spare capacity in find_idlest_group() sched/fair: Add per-CPU min capacity to sched_group_capacity sched/fair: Avoid pulling tasks from non-overloaded higher capacity groups sched/fair: Fix incorrect comment for capacity_margin
Oleg Nesterov (5):
kthread: Make struct kthread kmalloc'ed
Revert "kthread: Pin the stack via try_get_task_stack()/put_task_stack() in to_live_kthread() function"
kthread: Don't use to_live_kthread() in kthread_stop()
kthread: Don't use to_live_kthread() in kthread_[un]park()
kthread: Don't abuse kthread_create_on_cpu() in __kthread_create_worker()
Peter Zijlstra (2):
sched/core: Explain sleep/wakeup in a better way x86/uaccess, sched/preempt: Verify access_ok() context
Rafael J. Wysocki (1):
cpufreq/intel_pstate: Use CPPC to get max performance
Srinivas Pandruvada (2):
acpi/bus: Enable HWP CPPC objects
acpi/bus: Set _OSC for diverse core support
Stanislaw Gruszka (4):
sched/cputime, powerpc: Remove cputime_last_delta global variable sched/cputime, powerpc: Remove cputime_to_scaled() sched/cputime, powerpc, s390: Make scaled cputime arch specific sched/cputime: Simplify task_cputime()
T.Zhou (1):
sched/dl: Fix comment in pick_next_task_dl()
Tim Chen (6):
sched: Extend scheduler's asym packing x86/topology: Define x86's arch_update_cpu_topology
x86: Enable Intel Turbo Boost Max Technology 3.0 x86/sysctl: Add sysctl for ITMT scheduling feature x86/sched: Add SD_ASYM_PACKING flags to x86 ITMT CPU sched/x86: Change CONFIG_SCHED_ITMT to CONFIG_SCHED_MC_PRIO
Vincent Guittot (8):
sched/fair: Factorize attach/detach entity sched/fair: Fix hierarchical order in rq->leaf_cfs_rq_list sched/fair: Factorize PELT update
sched/fair: Propagate load during synchronous attach/detach sched/fair: Propagate asynchrous detach sched/fair: Fix task group initialization sched/core: Fix find_idlest_group() for fork sched/core: Use load_avg for selecting idlest group
arch/Kconfig | 3 + arch/ia64/kernel/time.c | 4 +- arch/powerpc/Kconfig | 1 + arch/powerpc/include/asm/cputime.h | 14 - arch/powerpc/kernel/time.c | 8 +- arch/s390/Kconfig | 1 + arch/s390/kernel/vtime.c | 9 +- arch/x86/Kconfig | 21 ++ arch/x86/include/asm/preempt.h | 8 +- arch/x86/include/asm/topology.h | 32 ++ arch/x86/include/asm/uaccess.h | 13 +- arch/x86/kernel/Makefile | 1 + arch/x86/kernel/apm_32.c | 4 +- arch/x86/kernel/itmt.c | 215 +++++++++++ arch/x86/kernel/smpboot.c | 39 +- drivers/acpi/bus.c | 10 + drivers/cpufreq/Kconfig.x86 | 1 + drivers/cpufreq/intel_pstate.c | 56 ++- include/asm-generic/cputime_jiffies.h | 1 - include/asm-generic/cputime_nsecs.h | 1 - include/linux/acpi.h | 1 + include/linux/kernel_stat.h | 4 +- include/linux/kthread.h | 1 + include/linux/preempt.h | 21 +- include/linux/sched.h | 89 +++-- include/linux/sched/sysctl.h | 1 - kernel/fork.c | 4 + kernel/kthread.c | 144 ++++---- kernel/sched/core.c | 34 +- kernel/sched/cpuacct.c | 2 +- kernel/sched/cputime.c | 124 ++----- kernel/sched/deadline.c | 4 +- kernel/sched/fair.c | 665 ++++++++++++++++++++++++++-------- kernel/sched/sched.h | 11 +- kernel/sysctl.c | 7 - kernel/time/posix-cpu-timers.c | 4 +- 36 files changed, 1152 insertions(+), 406 deletions(-) create mode 100644 arch/x86/kernel/itmt.c
arch/Kconfig +3 -0
@@ -512,6 +512,9 @@ config HAVE_CONTEXT_TRACKING config HAVE_VIRT_CPU_ACCOUNTING bool +config ARCH_HAS_SCALED_CPUTIME + bool + config HAVE_VIRT_CPU_ACCOUNTING_GEN bool default y if 64BIT
arch/ia64/kernel/time.c +2 -2
@@ -68,7 +68,7 @@ void vtime_account_user(struct task_struct *tsk)if (ti->ac_utime) { delta_utime =cycle_to_cputime (ti->ac_utime); -account_user_time (tsk, delta_utime, delta_utime); +account_user_time (tsk, delta_utime); ti->ac_utime =0 ; } }
@@ -112,7 +112,7 @@ void vtime_account_system(struct task_struct *tsk) {cputime_t delta =vtime_delta (tsk); -account_system_time (tsk,0 , delta, delta); +account_system_time (tsk,0 , delta); }EXPORT_SYMBOL_GPL (vtime_account_system);
arch/powerpc/Kconfig +1 -0
@@ -160,6 +160,7 @@ config PPC select HAVE_LIVEPATCH if HAVE_DYNAMIC_FTRACE_WITH_REGS select GENERIC_CPU_AUTOPROBE select HAVE_VIRT_CPU_ACCOUNTING + select ARCH_HAS_SCALED_CPUTIME if VIRT_CPU_ACCOUNTING_NATIVE select HAVE_ARCH_HARDENED_USERCOPY select HAVE_KERNEL_GZIP
arch/powerpc/include/asm/cputime.h +0 -14
@@ -46,26 +46,12 @@ extern cputime_t cputime_one_jiffy;* Convert cputime <-> jiffies */ extern u64 __cputime_jiffies_factor; -DECLARE_PER_CPU(unsigned long, cputime_last_delta); -DECLARE_PER_CPU(unsigned long, cputime_scaled_last_delta);static inline unsigned long cputime_to_jiffies (const cputime_t ct) {return mulhdu ((__force u64 ) ct, __cputime_jiffies_factor); } -/* Estimate the scaled cputime by scaling the real cputime based on -* the last scaled to real ratio */ -static inline cputime_t cputime_to_scaled (const cputime_t ct) -{ -if (cpu_has_feature (CPU_FTR_SPURR ) && -__this_cpu_read (cputime_last_delta)) -return (__force u64 ) ct * -__this_cpu_read (cputime_scaled_last_delta) / -__this_cpu_read (cputime_last_delta); -return ct; -} -static inline cputime_t jiffies_to_cputime (const unsigned long jif) {u64 ct;
arch/powerpc/kernel/time.c +4 -4
@@ -164,8 +164,6 @@ u64 __cputime_sec_factor;EXPORT_SYMBOL (__cputime_sec_factor);u64 __cputime_clockt_factor;EXPORT_SYMBOL (__cputime_clockt_factor); -DEFINE_PER_CPU(unsigned long, cputime_last_delta); -DEFINE_PER_CPU(unsigned long, cputime_scaled_last_delta);cputime_t cputime_one_jiffy;
@@ -360,7 +358,8 @@ void vtime_account_system(struct task_struct *tsk)unsigned long delta, sys_scaled, stolen; delta =vtime_delta (tsk, &sys_scaled, &stolen); -account_system_time (tsk,0 , delta, sys_scaled); +account_system_time (tsk,0 , delta); + tsk->stimescaled += sys_scaled;if (stolen)account_steal_time (stolen); }
@@ -393,7 +392,8 @@ void vtime_account_user(struct task_struct *tsk) acct->user_time =0 ; acct->user_time_scaled =0 ; acct->utime_sspurr =0 ; -account_user_time (tsk, utime, utimescaled); +account_user_time (tsk, utime); + tsk->utimescaled += utimescaled; }#ifdef CONFIG_PPC32
arch/s390/Kconfig +1 -0
@@ -171,6 +171,7 @@ config S390 select SYSCTL_EXCEPTION_TRACE select TTY select VIRT_CPU_ACCOUNTING + select ARCH_HAS_SCALED_CPUTIME select VIRT_TO_BUS select HAVE_NMI
arch/s390/kernel/vtime.c +6 -3
@@ -137,8 +137,10 @@ static int do_account_vtime(struct task_struct *tsk, int hardirq_offset) user_scaled = (user_scaled * mult) / div; system_scaled = (system_scaled * mult) / div; } -account_user_time (tsk, user, user_scaled); -account_system_time (tsk, hardirq_offset, system, system_scaled); +account_user_time (tsk, user); + tsk->utimescaled += user_scaled; +account_system_time (tsk, hardirq_offset, system); + tsk->stimescaled += system_scaled; steal = S390_lowcore.steal_timer;if ((s64 ) steal >0 ) {
@@ -202,7 +204,8 @@ void vtime_account_irq_enter(struct task_struct *tsk) system_scaled = (system_scaled * mult) / div; } -account_system_time (tsk,0 , system, system_scaled); +account_system_time (tsk,0 , system); + tsk->stimescaled += system_scaled;virt_timer_forward (system); }
arch/x86/Kconfig +21 -0
@@ -939,6 +939,27 @@ config SCHED_MC making when dealing with multi-core CPU chips at a cost of slightly increased overhead in some places. If unsure say N here. +config SCHED_MC_PRIO + bool "CPU core priorities scheduler support" + depends on SCHED_MC && CPU_SUP_INTEL + select X86_INTEL_PSTATE + select CPU_FREQ + default y + ---help--- + Intel Turbo Boost Max Technology 3.0 enabled CPUs have a + core ordering determined at manufacturing time, which allows + certain cores to reach higher turbo frequencies (when running + single threaded workloads) than others. + + Enabling this kernel feature teaches the scheduler about + the TBM3 (aka ITMT) priority order of the CPU cores and adjusts the + scheduler's CPU selection logic accordingly, so that higher + overall system performance can be achieved. + + This feature will have no effect on CPUs without this feature. + + If unsure say Y here. + source "kernel/Kconfig.preempt" config UP_LATE_INIT
arch/x86/include/asm/preempt.h +7 -1
@@ -24,7 +24,13 @@ static __always_inline int preempt_count(void) static __always_inline void preempt_count_set(int pc) { -raw_cpu_write_4 (__preempt_count, pc); +int old, new; + +do { + old =raw_cpu_read_4 (__preempt_count); + new = (old &PREEMPT_NEED_RESCHED ) | + (pc & ~PREEMPT_NEED_RESCHED ); + }while (raw_cpu_cmpxchg_4 (__preempt_count, old, new) != old); }/*
arch/x86/include/asm/topology.h +32 -0
@@ -146,4 +146,36 @@ struct pci_bus;int x86_pci_root_bus_node (int bus);void x86_pci_root_bus_resources (int bus,struct list_head *resources); +extern bool x86_topology_update; + +#ifdef CONFIG_SCHED_MC_PRIO +#include <asm/percpu.h> + +DECLARE_PER_CPU_READ_MOSTLY (int, sched_core_priority); +extern unsigned int __read_mostly sysctl_sched_itmt_enabled; + +/* Interface to set priority of a cpu */ +void sched_set_itmt_core_prio (int prio,int core_cpu); + +/* Interface to notify scheduler that system supports ITMT */ +int sched_set_itmt_support (void ); + +/* Interface to notify scheduler that system revokes ITMT support */ +void sched_clear_itmt_support (void ); + +#else /* CONFIG_SCHED_MC_PRIO */ + +#define sysctl_sched_itmt_enabled 0 +static inline void sched_set_itmt_core_prio (int prio,int core_cpu) +{ +} +static inline int sched_set_itmt_support (void ) +{ +return 0 ; +} +static inline void sched_clear_itmt_support (void ) +{ +} +#endif /* CONFIG_SCHED_MC_PRIO */ +#endif /* _ASM_X86_TOPOLOGY_H */
arch/x86/include/asm/uaccess.h +11 -2
@@ -68,6 +68,12 @@ static inline bool __chk_range_not_ok(unsigned long addr, unsigned long size, un__chk_range_not_ok ((unsigned long __force )(addr), size, limit); \ }) +#ifdef CONFIG_DEBUG_ATOMIC_SLEEP +# define WARN_ON_IN_IRQ () WARN_ON_ONCE(!in_task()) +#else +# define WARN_ON_IN_IRQ () +#endif +/** * access_ok: - Checks if a user space pointer is valid * @type: Type of access: %VERIFY_READ or %VERIFY_WRITE. Note that
@@ -88,8 +94,11 @@ static inline bool __chk_range_not_ok(unsigned long addr, unsigned long size, un* checks that the pointer is in the user space range - after calling * this function, memory access functions may still return -EFAULT. */ -#define access_ok (type, addr, size) \ - likely(!__range_not_ok(addr, size, user_addr_max())) +#define access_ok (type, addr, size) \ +({ \ + WARN_ON_IN_IRQ(); \ + likely(!__range_not_ok(addr, size, user_addr_max())); \ +})/* * These are the main single-value transfer routines. They automatically
arch/x86/kernel/Makefile +1 -0
@@ -123,6 +123,7 @@ obj-$(CONFIG_EFI) += sysfb_efi.o obj-$(CONFIG_PERF_EVENTS) += perf_regs.o obj-$(CONFIG_TRACING) += tracepoint.o +obj-$(CONFIG_SCHED_MC_PRIO) += itmt.o ifdef CONFIG_FRAME_POINTER obj-y += unwind_frame.o
arch/x86/kernel/apm_32.c +2 -2
@@ -906,14 +906,14 @@ static int apm_cpu_idle(struct cpuidle_device *dev,static int use_apm_idle;/* = 0 */ static unsigned int last_jiffies;/* = 0 */ static unsigned int last_stime;/* = 0 */ -cputime_t stime; +cputime_t stime, utime;int apm_idle_done =0 ;unsigned int jiffies_since_last_check = jiffies - last_jiffies;unsigned int bucket; recalc: -task_cputime (current,NULL , &stime); +task_cputime (current, &utime, &stime);if (jiffies_since_last_check >IDLE_CALC_LIMIT ) { use_apm_idle =0 ; }else if (jiffies_since_last_check > idle_period) {
arch/x86/kernel/itmt.c new file +215 -0
215 lines not on this page · raw message
arch/x86/kernel/smpboot.c +35 -4
@@ -109,6 +109,17 @@ static bool logical_packages_frozen __read_mostly;/* Maximum number of SMT threads on any online core */ int __max_smt_threads__read_mostly ; +/* Flag to indicate if a complete sched domain rebuild is required */ +bool x86_topology_update; + +int arch_update_cpu_topology (void ) +{ +int retval = x86_topology_update; + + x86_topology_update = false; +return retval; +} +static inline void smpboot_setup_warm_reset_vector (unsigned long start_eip) {unsigned long flags;
@@ -471,22 +482,42 @@ static bool match_die(struct cpuinfo_x86 *c, struct cpuinfo_x86 *o)return false; } +#if defined(CONFIG_SCHED_SMT ) || defined(CONFIG_SCHED_MC ) +static inline int x86_sched_itmt_flags (void ) +{ +return sysctl_sched_itmt_enabled ?SD_ASYM_PACKING :0 ; +} + +#ifdef CONFIG_SCHED_MC +static int x86_core_flags (void ) +{ +return cpu_core_flags () |x86_sched_itmt_flags (); +} +#endif +#ifdef CONFIG_SCHED_SMT +static int x86_smt_flags (void ) +{ +return cpu_smt_flags () |x86_sched_itmt_flags (); +} +#endif +#endif +static struct sched_domain_topology_level x86_numa_in_package_topology[] = { #ifdef CONFIG_SCHED_SMT - { cpu_smt_mask, cpu_smt_flags,SD_INIT_NAME (SMT ) }, + { cpu_smt_mask, x86_smt_flags,SD_INIT_NAME (SMT ) }, #endif #ifdef CONFIG_SCHED_MC - { cpu_coregroup_mask, cpu_core_flags,SD_INIT_NAME (MC ) }, + { cpu_coregroup_mask, x86_core_flags,SD_INIT_NAME (MC ) }, #endif {NULL , }, };static struct sched_domain_topology_level x86_topology[] = { #ifdef CONFIG_SCHED_SMT - { cpu_smt_mask, cpu_smt_flags,SD_INIT_NAME (SMT ) }, + { cpu_smt_mask, x86_smt_flags,SD_INIT_NAME (SMT ) }, #endif #ifdef CONFIG_SCHED_MC - { cpu_coregroup_mask, cpu_core_flags,SD_INIT_NAME (MC ) }, + { cpu_coregroup_mask, x86_core_flags,SD_INIT_NAME (MC ) }, #endif { cpu_cpu_mask,SD_INIT_NAME (DIE ) }, {NULL , },
drivers/acpi/bus.c +10 -0
@@ -331,6 +331,16 @@ static void acpi_bus_osc_support(void) capbuf[OSC_SUPPORT_DWORD ] |=OSC_SB_HOTPLUG_OST_SUPPORT ; capbuf[OSC_SUPPORT_DWORD ] |=OSC_SB_PCLPI_SUPPORT ; +#ifdef CONFIG_X86 +if (boot_cpu_has (X86_FEATURE_HWP )) { + capbuf[OSC_SUPPORT_DWORD ] |=OSC_SB_CPC_SUPPORT ; + capbuf[OSC_SUPPORT_DWORD ] |=OSC_SB_CPCV2_SUPPORT ; + } +#endif + +if (IS_ENABLED (CONFIG_SCHED_MC_PRIO )) + capbuf[OSC_SUPPORT_DWORD ] |=OSC_SB_CPC_DIVERSE_HIGH_SUPPORT ; +if (!ghes_disable) capbuf[OSC_SUPPORT_DWORD ] |=OSC_SB_APEI_SUPPORT ;if (ACPI_FAILURE (acpi_get_handle (NULL ,"\\_SB" , &handle)))
drivers/cpufreq/Kconfig.x86 +1 -0
@@ -6,6 +6,7 @@ config X86_INTEL_PSTATE bool "Intel P state control" depends on X86 select ACPI_PROCESSOR if ACPI + select ACPI_CPPC_LIB if X86_64 && ACPI && SCHED_MC_PRIO help This driver provides a P state for Intel core processors. The driver implements an internal governor and will become
drivers/cpufreq/intel_pstate.c +55 -1
75 lines not on this page · raw message
include/asm-generic/cputime_jiffies.h +0 -1
@@ -7,7 +7,6 @@ typedef unsigned long __nocast cputime_t;#define cputime_one_jiffy jiffies_to_cputime(1)#define cputime_to_jiffies (__ct) (__force unsigned long)(__ct) -#define cputime_to_scaled (__ct) (__ct)#define jiffies_to_cputime (__hz) (__force cputime_t)(__hz)typedef u64 __nocast cputime64_t ;
include/asm-generic/cputime_nsecs.h +0 -1
@@ -34,7 +34,6 @@ typedef u64 __nocast cputime64_t;*/ #define cputime_to_jiffies (__ct) \ cputime_div(__ct, NSEC_PER_SEC / HZ) -#define cputime_to_scaled (__ct) (__ct)#define jiffies_to_cputime (__jif) \ (__force cputime_t)((__jif) * (NSEC_PER_SEC / HZ))#define cputime64_to_jiffies64 (__ct) \
include/linux/acpi.h +1 -0
@@ -469,6 +469,7 @@ acpi_status acpi_run_osc(acpi_handle handle, struct acpi_osc_context *context);#define OSC_SB_CPCV2_SUPPORT 0x00000040#define OSC_SB_PCLPI_SUPPORT 0x00000080#define OSC_SB_OSLPI_SUPPORT 0x00000100 +#define OSC_SB_CPC_DIVERSE_HIGH_SUPPORT 0x00001000extern bool osc_sb_apei_support_acked;extern bool osc_pc_lpi_support_confirmed;
include/linux/kernel_stat.h +2 -2
@@ -78,8 +78,8 @@ static inline unsigned int kstat_cpu_irqs_sum(unsigned int cpu)return kstat_cpu (cpu).irqs_sum; } -extern void account_user_time (struct task_struct *,cputime_t ,cputime_t ); -extern void account_system_time (struct task_struct *,int ,cputime_t ,cputime_t ); +extern void account_user_time (struct task_struct *,cputime_t ); +extern void account_system_time (struct task_struct *,int ,cputime_t );extern void account_steal_time (cputime_t );extern void account_idle_time (cputime_t );
include/linux/kthread.h +1 -0
@@ -48,6 +48,7 @@ struct task_struct *kthread_create_on_cpu(int (*threadfn)(void *data), __k; \ }) +void free_kthread_struct (struct task_struct *k);void kthread_bind (struct task_struct *k,unsigned int cpu);void kthread_bind_mask (struct task_struct *k,const struct cpumask *mask);int kthread_stop (struct task_struct *k);
include/linux/preempt.h +13 -8
@@ -65,19 +65,24 @@/* * Are we doing bottom half or hardware interrupt processing? -* Are we in a softirq context? Interrupt context? -* in_softirq - Are we currently processing softirq or have bh disabled? -* in_serving_softirq - Are we currently processing softirq? +* +* in_irq() - We're in (hard) IRQ context +* in_softirq() - We have BH disabled, or are processing softirqs +* in_interrupt() - We're in NMI,IRQ,SoftIRQ context or have BH disabled +* in_serving_softirq() - We're in softirq context +* in_nmi() - We're in NMI context +* in_task() - We're in task context +* +* Note: due to the BH disabled confusion: in_softirq(),in_interrupt() really +* should not be used in new code. */ #define in_irq () (hardirq_count())#define in_softirq () (softirq_count())#define in_interrupt () (irq_count())#define in_serving_softirq () (softirq_count() & SOFTIRQ_OFFSET) - -/* -* Are we in NMI context? -*/ -#define in_nmi () (preempt_count() & NMI_MASK) +#define in_nmi () (preempt_count() & NMI_MASK) +#define in_task () (!(preempt_count() & \ + (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET)))/* * The preempt_count offset after preempt_disable();
include/linux/sched.h +59 -30
148 lines not on this page · raw message
include/linux/sched/sysctl.h +0 -1
@@ -36,7 +36,6 @@ extern unsigned int sysctl_numa_balancing_scan_size;extern unsigned int sysctl_sched_migration_cost;extern unsigned int sysctl_sched_nr_migrate;extern unsigned int sysctl_sched_time_avg; -extern unsigned int sysctl_sched_shares_window; int sched_proc_update_handler(struct ctl_table *table, int write, void __user *buffer, size_t *length,
kernel/fork.c +4 -0
@@ -354,6 +354,8 @@ void free_task(struct task_struct *tsk)ftrace_graph_exit_task (tsk);put_seccomp_filter (tsk);arch_release_task_struct (tsk); +if (tsk->flags &PF_KTHREAD ) +free_kthread_struct (tsk);free_task_struct (tsk); }EXPORT_SYMBOL (free_task);
@@ -1551,7 +1553,9 @@ static __latent_entropy struct task_struct *copy_process(init_sigpending (&p->pending); p->utime = p->stime = p->gtime =0 ; +#ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME p->utimescaled = p->stimescaled =0 ; +#endif prev_cputime_init (&p->prev_cputime);#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
kernel/kthread.c +71 -73
221 lines not on this page · raw message
kernel/sched/core.c +26 -8
@@ -1995,14 +1995,15 @@ static void ttwu_queue(struct task_struct *p, int cpu, int wake_flags)* @state: the mask of task states that can be woken * @wake_flags: wake modifier flags (WF_*) * -* Put it on the run-queue if it's not already there. The "current" -* thread is always on the run-queue (except when the actual -* re-schedule is in progress), and as such you're allowed to do -* the simpler "current->state = TASK_RUNNING" to mark yourself -* runnable without the overhead of this. +* If (@state & @p->state) @p->state = TASK_RUNNING. * -* Return: %true if @p was woken up, %false if it was already running. -* or @state didn't match @p's state. +* If the task was not queued/runnable, also place it back on a runqueue. +* +* Atomic against schedule() which would dequeue a task, also see +* set_current_state(). +* +* Return: %true if @p->state changes (an actual wakeup was done), +* %false otherwise. */ static int try_to_wake_up (struct task_struct *p,unsigned int state,int wake_flags)
@@ -5707,7 +5708,7 @@ static int sched_domain_debug_one(struct sched_domain *sd, int cpu, int level,printk (KERN_CONT " %*pbl" ,cpumask_pr_args (sched_group_cpus (group)));if (group->sgc->capacity !=SCHED_CAPACITY_SCALE ) { -printk (KERN_CONT " (cpu_capacity = %d)" , +printk (KERN_CONT " (cpu_capacity = %lu)" , group->sgc->capacity); }
@@ -6184,6 +6185,7 @@ build_overlap_sched_groups(struct sched_domain *sd, int cpu)* die on a /0 trap. */ sg->sgc->capacity =SCHED_CAPACITY_SCALE *cpumask_weight (sg_span); + sg->sgc->min_capacity =SCHED_CAPACITY_SCALE ;/* * Make sure the first group of this domain contains the
@@ -6301,7 +6303,22 @@ static void init_sched_groups_capacity(int cpu, struct sched_domain *sd)WARN_ON (!sg);do { +int cpu, max_cpu =-1 ; + sg->group_weight =cpumask_weight (sched_group_cpus (sg)); + +if (!(sd->flags &SD_ASYM_PACKING )) + goto next; + +for_each_cpu (cpu,sched_group_cpus (sg)) { +if (max_cpu <0 ) + max_cpu = cpu; +else if (sched_asym_prefer (cpu, max_cpu)) + max_cpu = cpu; + } + sg->asym_prefer_cpu = max_cpu; + +next: sg = sg->next; }while (sg != sd->groups);
@@ -7602,6 +7619,7 @@ void __init sched_init(void)#ifdef CONFIG_FAIR_GROUP_SCHED root_task_group.shares =ROOT_TASK_GROUP_LOAD ;INIT_LIST_HEAD (&rq->leaf_cfs_rq_list); + rq->tmp_alone_branch = &rq->leaf_cfs_rq_list;/* * How much cpu bandwidth does root_task_group get? *
kernel/sched/cpuacct.c +1 -1
@@ -297,7 +297,7 @@ static int cpuacct_stats_show(struct seq_file *sf, void *v)for (stat =0 ; stat <CPUACCT_STAT_NSTATS ; stat++) {seq_printf (sf,"%s %lld\n" , cpuacct_stat_desc[stat], -cputime64_to_clock_t (val[stat])); + (long long )cputime64_to_clock_t (val[stat])); }return 0 ;
kernel/sched/cputime.c +32 -92
247 lines not on this page · raw message
kernel/sched/deadline.c +2 -2
@@ -586,7 +586,7 @@ static enum hrtimer_restart dl_task_timer(struct hrtimer *timer)/* * The task might have changed its scheduling policy to something -* different than SCHED_DEADLINE (through switched_fromd_dl()). +* different than SCHED_DEADLINE (through switched_from_dl()). */ if (!dl_task (p)) {__dl_clear_params (p);
@@ -1137,7 +1137,7 @@ pick_next_task_dl(struct rq *rq, struct task_struct *prev, struct pin_cookie coopull_dl_task (rq);lockdep_repin_lock (&rq->lock, cookie);/* -* pull_rt_task() can drop (and re-acquire) rq->lock; this +* pull_dl_task() can drop (and re-acquire) rq->lock; this * means a stop task can slip in, in which case we need to * re-start task selection. */
kernel/sched/fair.c +521 -144
1,083 lines not on this page · raw message
kernel/sched/sched.h +10 -1
@@ -404,6 +404,7 @@ struct cfs_rq {unsigned long runnable_load_avg;#ifdef CONFIG_FAIR_GROUP_SCHED unsigned long tg_load_avg_contrib; +unsigned long propagate_avg;#endif atomic_long_t removed_load_avg, removed_util_avg;#ifndef CONFIG_64BIT
@@ -539,6 +540,11 @@ struct dl_rq {#ifdef CONFIG_SMP +static inline bool sched_asym_prefer (int a,int b) +{ +return arch_asym_cpu_priority (a) >arch_asym_cpu_priority (b); +} +/* * We add the notion of a root-domain which will be used to define per-domain * variables. Each exclusive cpuset essentially defines an island domain by
@@ -623,6 +629,7 @@ struct rq {#ifdef CONFIG_FAIR_GROUP_SCHED /* list of leaf cfs_rq on this cpu: */ struct list_head leaf_cfs_rq_list; +struct list_head *tmp_alone_branch;#endif /* CONFIG_FAIR_GROUP_SCHED */ /*
@@ -892,7 +899,8 @@ struct sched_group_capacity {* CPU capacity of this group, SCHED_CAPACITY_SCALE being max capacity * for a single CPU. */ -unsigned int capacity; +unsigned long capacity; +unsigned long min_capacity;/* Min per-CPU capacity in group */ unsigned long next_update;int imbalance;/* XXX unrelated to capacity but shared group state */
@@ -905,6 +913,7 @@ struct sched_group {unsigned int group_weight;struct sched_group_capacity *sgc; +int asym_prefer_cpu;/* cpu of highest priority in group */ /* * The CPUs this group covers.
kernel/sysctl.c +0 -7
@@ -347,13 +347,6 @@ static struct ctl_table kern_table[] = { .mode = 0644, .proc_handler = proc_dointvec, }, - { - .procname = "sched_shares_window_ns", - .data = &sysctl_sched_shares_window, - .maxlen = sizeof(unsigned int), - .mode = 0644, - .proc_handler = proc_dointvec, - },#ifdef CONFIG_SCHEDSTATS { .procname = "sched_schedstats",
kernel/time/posix-cpu-timers.c +2 -2
@@ -133,9 +133,9 @@ static inline unsigned long long prof_ticks(struct task_struct *p) }static inline unsigned long long virt_ticks (struct task_struct *p) { -cputime_t utime; +cputime_t utime, stime; -task_cputime (p, &utime,NULL ); +task_cputime (p, &utime, &stime);return cputime_to_expires (utime); }