scheduler fixes
Subsystems (7)
Greg,
Please pull the latest sched-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched-urgent-for-linus
# HEAD: 37355bdc5a129899f6b245900a8eb944a092f7fd sched/numa: Migrate pages to local nodes quicker early in the lifetime of a task
These fixes address a rather involved performance regression between v4.17->v4.19 in the sched/numa auto-balancing code. Since distros really need this fix we accelerated it to sched/urgent for a faster upstream merge.
NUMA scheduling and balancing performance is now largely back to v4.17 levels, without reintroducing the NUMA placement bugs that v4.18 and v4.19 fixed.
Many thanks to Srikar Dronamraju, Mel Gorman and Jirka Hladky, for reporting, testing, re-testing and solving this rather complex set of bugs.
Thanks,
Ingo
------------------>
Mel Gorman (3):
sched/numa: Limit the conditions where scan period is reset
mm, sched/numa: Remove rate-limiting of automatic NUMA balancing migration sched/numa: Migrate pages to local nodes quicker early in the lifetime of a task
Srikar Dronamraju (5):
sched/numa: Stop multiple tasks from moving to the CPU at the same time sched/numa: Pass destination CPU as a parameter to migrate_task_rq sched/numa: Reset scan rate whenever task moves across nodes mm/migrate: Use spin_trylock() while resetting rate limit sched/numa: Avoid task migration for small NUMA improvement
include/linux/mmzone.h | 6 --- include/trace/events/migrate.h | 27 ----------- kernel/sched/core.c | 2 +- kernel/sched/deadline.c | 2 +- kernel/sched/fair.c | 104 +++++++++++++++++++++++++++++++++++------ kernel/sched/sched.h | 3 +- mm/migrate.c | 57 ---------------------- mm/page_alloc.c | 2 - 8 files changed, 95 insertions(+), 108 deletions(-)
include/linux/mmzone.h +0 -6
@@ -671,12 +671,6 @@ typedef struct pglist_data {#ifdef CONFIG_NUMA_BALANCING /* Lock serializing the migrate rate limiting window */ spinlock_t numabalancing_migrate_lock; - -/* Rate limiting time interval */ -unsigned long numabalancing_migrate_next_window; - -/* Number of pages migrated during the rate limiting time interval */ -unsigned long numabalancing_migrate_nr_pages;#endif /* * This is a per-node reserve of pages that are not available
include/trace/events/migrate.h +0 -27
@@ -70,33 +70,6 @@ TRACE_EVENT(mm_migrate_pages,__print_symbolic (__entry->mode,MIGRATE_MODE ), __print_symbolic(__entry->reason, MIGRATE_REASON)) ); - -TRACE_EVENT (mm_numa_migrate_ratelimit, - - TP_PROTO(struct task_struct *p, int dst_nid, unsigned long nr_pages), - -TP_ARGS (p, dst_nid, nr_pages), - -TP_STRUCT__entry ( - __array( char, comm, TASK_COMM_LEN) - __field( pid_t, pid) - __field( int, dst_nid) - __field( unsigned long, nr_pages) - ), - -TP_fast_assign ( - memcpy(__entry->comm, p->comm, TASK_COMM_LEN); - __entry->pid = p->pid; - __entry->dst_nid = dst_nid; - __entry->nr_pages = nr_pages; - ), - -TP_printk ("comm=%s pid=%d dst_nid=%d nr_pages=%lu" , - __entry->comm, - __entry->pid, - __entry->dst_nid, - __entry->nr_pages) -);#endif /* _TRACE_MIGRATE_H */ /* This part must be outside protection */
kernel/sched/core.c +1 -1
@@ -1167,7 +1167,7 @@ void set_task_cpu(struct task_struct *p, unsigned int new_cpu)if (task_cpu (p) != new_cpu) {if (p->sched_class->migrate_task_rq) - p->sched_class->migrate_task_rq (p); + p->sched_class->migrate_task_rq (p, new_cpu); p->se.nr_migrations++;rseq_migrate (p);perf_event_task_migrate (p);
kernel/sched/deadline.c +1 -1
@@ -1607,7 +1607,7 @@ select_task_rq_dl(struct task_struct *p, int cpu, int sd_flag, int flags)return cpu; } -static void migrate_task_rq_dl (struct task_struct *p) +static void migrate_task_rq_dl (struct task_struct *p,int new_cpu__maybe_unused ) {struct rq *rq;
kernel/sched/fair.c +91 -13
195 lines not on this page · raw message
kernel/sched/sched.h +2 -1
@@ -783,6 +783,7 @@ struct rq {#ifdef CONFIG_NUMA_BALANCING unsigned int nr_numa_running;unsigned int nr_preferred_running; +unsigned int numa_migrate_on;#endif #define CPU_LOAD_IDX_MAX 5unsigned long cpu_load[CPU_LOAD_IDX_MAX ];
@@ -1523,7 +1524,7 @@ struct sched_class {#ifdef CONFIG_SMP int (*select_task_rq)(struct task_struct *p,int task_cpu,int sd_flag,int flags); -void (*migrate_task_rq)(struct task_struct *p); +void (*migrate_task_rq)(struct task_struct *p,int new_cpu);void (*task_woken)(struct rq *this_rq,struct task_struct *task);
mm/migrate.c +0 -57
81 lines not on this page · raw message
mm/page_alloc.c +0 -2
@@ -6197,8 +6197,6 @@ static unsigned long __init calc_memmap_size(unsigned long spanned_pages,static void pgdat_init_numabalancing (struct pglist_data *pgdat) {spin_lock_init (&pgdat->numabalancing_migrate_lock); - pgdat->numabalancing_migrate_nr_pages =0 ; - pgdat->numabalancing_migrate_next_window = jiffies; }#else static void pgdat_init_numabalancing (struct pglist_data *pgdat) {}
Quoted 5 lines · Ingo Molnar
Greg,
Please pull the latest sched-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.gitsched-urgent-for-linus
Now merged, thanks.
greg k-h