diff --git a/include/linux/sched_hook_defs.h b/include/linux/sched_hook_defs.h index 0a871f728c856ea88c5dabf9c3742d6db947e93e..de6451930d8a10574853309393341637d8dc41b4 100644 --- a/include/linux/sched_hook_defs.h +++ b/include/linux/sched_hook_defs.h @@ -14,3 +14,4 @@ BPF_SCHED_HOOK(int, -1, cfs_can_migrate_task, struct task_struct *p, struct sched_migrate_node *migrate_node) BPF_SCHED_HOOK(void, (void) 0, cfs_change_preferred_node, struct sched_preferred_node_ctx *ctx) +BPF_SCHED_HOOK(int, -1, cfs_preferred_nid_init, struct task_struct *tsk) diff --git a/kernel/fork.c b/kernel/fork.c index 12db99751381f2a155e4902bfede63231b182c41..dcf1f9c655d84a4b0944146438468db17d87ef44 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -97,6 +97,7 @@ #include #include #include +#include #ifdef CONFIG_QOS_SCHED_SMART_GRID #include #endif @@ -2320,6 +2321,20 @@ static __latent_entropy struct task_struct *copy_process( p->tgid = p->pid; } +#if defined (CONFIG_SCHED_TASK_RELATIONSHIP) && defined(CONFIG_BPF_SCHED) + if (bpf_sched_enabled() && task_relationship_supported(p)) { + retval = bpf_sched_cfs_preferred_nid_init(p); + if (clone_flags & CLONE_THREAD) { + if (retval > 0) + p->numa_preferred_nid = + p->group_leader->numa_preferred_nid; + } else { + if (retval > 0 && retval <= nr_node_ids) + p->numa_preferred_nid = retval - 1; + } + } +#endif + p->nr_dirtied = 0; p->nr_dirtied_pause = 128 >> (PAGE_SHIFT - 10); p->dirty_paused_when = 0;