kernel: Refactor task_struct to use numa_faults instead of numa_* pointers
PATCH v2 1/1 kernel: Refactor task_struct to use numa_faults instead of numa_* pointers
This patch simplifies task_struct by removing the four numa_* pointers in the same array and replacing them with the array pointer. By doing this, on x86_64, the size of task_struct is reduced by 3 ulong pointers (24 bytes on x86_64).
A new parameter is added to the task_faults_idx function so that it can return an index to the correct offset, corresponding with the old precalculated pointers.
All of the code in sched/ that depended on task_faults_idx and numa_* was changed in order to match the new logic.
---
Changes since v1:
- improve style
- move the enum from linux/sched.h to sched/sched.h
- factor expression
include/linux/sched.h | 31 ++++++-------- kernel/sched/core.c | 3 +- kernel/sched/debug.c | 4 +- kernel/sched/fair.c | 110 +++++++++++++++++++++++++------------------------ kernel/sched/sched.h | 7 ++++ 5 files changed, 80 insertions(+), 75 deletions(-)
include/linux/sched.h +13 -18
@@ -1558,28 +1558,23 @@ struct task_struct {struct numa_group *numa_group;/* -* Exponential decaying average of faults on a per-node basis. -* Scheduling placement decisions are made based on the these counts. -* The values remain static for the duration of a PTE scan +* numa_faults is an array split into four regions: +* faults_memory, faults_cpu, faults_memory_buffer, faults_cpu_buffer +* in this precise order. +* +* faults_memory: Exponential decaying average of faults on a per-node +* basis. Scheduling placement decisions are made based on these +* counts. The values remain static for the duration of a PTE scan. +* faults_cpu: Track the nodes the process was running on when a NUMA +* hinting fault was incurred. +* faults_memory_buffer and faults_cpu_buffer: Record faults per node +* during the current scan window. When the scan completes, the counts +* in faults_memory and faults_cpu decay and these values are copied. */ -unsigned long *numa_faults_memory; +unsigned long *numa_faults;unsigned long total_numa_faults;/* -* numa_faults_buffer records faults per node during the current -* scan window. When the scan completes, the counts in -* numa_faults_memory decay and these values are copied. -*/ -unsigned long *numa_faults_buffer_memory; - -/* -* Track the nodes the process was running on when a NUMA hinting -* fault was incurred. -*/ -unsigned long *numa_faults_cpu; -unsigned long *numa_faults_buffer_cpu; - -/* * numa_faults_locality tracks if faults recorded during the last * scan window were remote/local. The task scan period is adapted * based on the locality of the faults with different weights
kernel/sched/core.c +1 -2
@@ -1853,8 +1853,7 @@ static void __sched_fork(unsigned long clone_flags, struct task_struct *p) p->numa_scan_seq = p->mm ? p->mm->numa_scan_seq :0 ; p->numa_scan_period = sysctl_numa_balancing_scan_delay; p->numa_work.next = &p->numa_work; - p->numa_faults_memory =NULL ; - p->numa_faults_buffer_memory =NULL ; + p->numa_faults =NULL ; p->last_task_numa_placement =0 ; p->last_sum_exec_runtime =0 ;
kernel/sched/debug.c +2 -2
@@ -528,8 +528,8 @@ static void sched_show_numa(struct task_struct *p, struct seq_file *m)unsigned long nr_faults =-1 ;int cpu_current, home_node; -if (p->numa_faults_memory) - nr_faults = p->numa_faults_memory[2 *node + i]; +if (p->numa_faults) + nr_faults = p->numa_faults[2 *node + i]; cpu_current = !i ? (task_node (p) == node) : (pol &&node_isset (node, pol->v.nodes));
kernel/sched/fair.c +57 -53
227 lines not on this page · raw message
kernel/sched/sched.h +7 -0
@@ -679,6 +679,13 @@ static inline u64 rq_clock_task(struct rq *rq) }#ifdef CONFIG_NUMA_BALANCING +/* The regions in numa_faults array from task_struct */ +enum numa_faults_stats { +NUMA_MEM =0 , +NUMA_CPU , +NUMA_MEMBUF , +NUMA_CPUBUF +};extern void sched_setnuma (struct task_struct *p,int node);extern int migrate_task_to (struct task_struct *p,int cpu);extern int migrate_swap (struct task_struct *,struct task_struct *);
Signature · 1 line
1.7.10.4
tip-bot for Iulia Manda
merge bot[tip:sched/core] sched: Refactor task_struct to use numa_faults instead of numa_* pointers
sched: Refactor task_struct to use numa_faults instead of numa_* pointers
Commit-ID: 44dba3d5d6a10685fb15bd1954e62016334825e0 Gitweb: http://git.kernel.org/tip/44dba3d5d6a10685fb15bd1954e62016334825e0 Author: Iulia Manda <[email protected]> AuthorDate: Fri, 31 Oct 2014 02:13:31 +0200 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 4 Nov 2014 07:17:57 +0100
sched: Refactor task_struct to use numa_faults instead of numa_* pointers
This patch simplifies task_struct by removing the four numa_* pointers in the same array and replacing them with the array pointer. By doing this, on x86_64, the size of task_struct is reduced by 3 ulong pointers (24 bytes on x86_64).
A new parameter is added to the task_faults_idx function so that it can return an index to the correct offset, corresponding with the old precalculated pointers.
All of the code in sched/ that depended on task_faults_idx and numa_* was changed in order to match the new logic.
--- include/linux/sched.h | 31 ++++++-------- kernel/sched/core.c | 3 +- kernel/sched/debug.c | 4 +- kernel/sched/fair.c | 110 ++++++++++++++++++++++++++------------------------ kernel/sched/sched.h | 7 ++++ 5 files changed, 80 insertions(+), 75 deletions(-)
include/linux/sched.h +13 -18
@@ -1597,28 +1597,23 @@ struct task_struct {struct numa_group *numa_group;/* -* Exponential decaying average of faults on a per-node basis. -* Scheduling placement decisions are made based on the these counts. -* The values remain static for the duration of a PTE scan +* numa_faults is an array split into four regions: +* faults_memory, faults_cpu, faults_memory_buffer, faults_cpu_buffer +* in this precise order. +* +* faults_memory: Exponential decaying average of faults on a per-node +* basis. Scheduling placement decisions are made based on these +* counts. The values remain static for the duration of a PTE scan. +* faults_cpu: Track the nodes the process was running on when a NUMA +* hinting fault was incurred. +* faults_memory_buffer and faults_cpu_buffer: Record faults per node +* during the current scan window. When the scan completes, the counts +* in faults_memory and faults_cpu decay and these values are copied. */ -unsigned long *numa_faults_memory; +unsigned long *numa_faults;unsigned long total_numa_faults;/* -* numa_faults_buffer records faults per node during the current -* scan window. When the scan completes, the counts in -* numa_faults_memory decay and these values are copied. -*/ -unsigned long *numa_faults_buffer_memory; - -/* -* Track the nodes the process was running on when a NUMA hinting -* fault was incurred. -*/ -unsigned long *numa_faults_cpu; -unsigned long *numa_faults_buffer_cpu; - -/* * numa_faults_locality tracks if faults recorded during the last * scan window were remote/local. The task scan period is adapted * based on the locality of the faults with different weights
kernel/sched/core.c +1 -2
@@ -1857,8 +1857,7 @@ static void __sched_fork(unsigned long clone_flags, struct task_struct *p) p->numa_scan_seq = p->mm ? p->mm->numa_scan_seq :0 ; p->numa_scan_period = sysctl_numa_balancing_scan_delay; p->numa_work.next = &p->numa_work; - p->numa_faults_memory =NULL ; - p->numa_faults_buffer_memory =NULL ; + p->numa_faults =NULL ; p->last_task_numa_placement =0 ; p->last_sum_exec_runtime =0 ;
kernel/sched/debug.c +2 -2
@@ -535,8 +535,8 @@ static void sched_show_numa(struct task_struct *p, struct seq_file *m)unsigned long nr_faults =-1 ;int cpu_current, home_node; -if (p->numa_faults_memory) - nr_faults = p->numa_faults_memory[2 *node + i]; +if (p->numa_faults) + nr_faults = p->numa_faults[2 *node + i]; cpu_current = !i ? (task_node (p) == node) : (pol &&node_isset (node, pol->v.nodes));
kernel/sched/fair.c +57 -53
227 lines not on this page · raw message
kernel/sched/sched.h +7 -0
@@ -709,6 +709,13 @@ extern bool find_numa_distance(int distance);#endif #ifdef CONFIG_NUMA_BALANCING +/* The regions in numa_faults array from task_struct */ +enum numa_faults_stats { +NUMA_MEM =0 , +NUMA_CPU , +NUMA_MEMBUF , +NUMA_CPUBUF +};extern void sched_setnuma (struct task_struct *p,int node);extern int migrate_task_to (struct task_struct *p,int cpu);extern int migrate_swap (struct task_struct *,struct task_struct *);