core.c (b3bbcc5d1da1b654091dad15980b3d58fdae0fc6) core.c (bd74fdaea146029e4fa12c6de89adbe0779348a9)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * kernel/sched/core.c
4 *
5 * Core kernel scheduler code and related syscalls
6 *
7 * Copyright (C) 1991-2002 Linus Torvalds
8 */

--- 4382 unchanged lines hidden (view full) ---

4391 if (enabled)
4392 sysctl_numa_balancing_mode = NUMA_BALANCING_NORMAL;
4393 else
4394 sysctl_numa_balancing_mode = NUMA_BALANCING_DISABLED;
4395 __set_numabalancing_state(enabled);
4396}
4397
4398#ifdef CONFIG_PROC_SYSCTL
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * kernel/sched/core.c
4 *
5 * Core kernel scheduler code and related syscalls
6 *
7 * Copyright (C) 1991-2002 Linus Torvalds
8 */

--- 4382 unchanged lines hidden (view full) ---

4391 if (enabled)
4392 sysctl_numa_balancing_mode = NUMA_BALANCING_NORMAL;
4393 else
4394 sysctl_numa_balancing_mode = NUMA_BALANCING_DISABLED;
4395 __set_numabalancing_state(enabled);
4396}
4397
4398#ifdef CONFIG_PROC_SYSCTL
4399static void reset_memory_tiering(void)
4400{
4401 struct pglist_data *pgdat;
4402
4403 for_each_online_pgdat(pgdat) {
4404 pgdat->nbp_threshold = 0;
4405 pgdat->nbp_th_nr_cand = node_page_state(pgdat, PGPROMOTE_CANDIDATE);
4406 pgdat->nbp_th_start = jiffies_to_msecs(jiffies);
4407 }
4408}
4409
4399int sysctl_numa_balancing(struct ctl_table *table, int write,
4400 void *buffer, size_t *lenp, loff_t *ppos)
4401{
4402 struct ctl_table t;
4403 int err;
4404 int state = sysctl_numa_balancing_mode;
4405
4406 if (write && !capable(CAP_SYS_ADMIN))
4407 return -EPERM;
4408
4409 t = *table;
4410 t.data = &state;
4411 err = proc_dointvec_minmax(&t, write, buffer, lenp, ppos);
4412 if (err < 0)
4413 return err;
4414 if (write) {
4410int sysctl_numa_balancing(struct ctl_table *table, int write,
4411 void *buffer, size_t *lenp, loff_t *ppos)
4412{
4413 struct ctl_table t;
4414 int err;
4415 int state = sysctl_numa_balancing_mode;
4416
4417 if (write && !capable(CAP_SYS_ADMIN))
4418 return -EPERM;
4419
4420 t = *table;
4421 t.data = &state;
4422 err = proc_dointvec_minmax(&t, write, buffer, lenp, ppos);
4423 if (err < 0)
4424 return err;
4425 if (write) {
4426 if (!(sysctl_numa_balancing_mode & NUMA_BALANCING_MEMORY_TIERING) &&
4427 (state & NUMA_BALANCING_MEMORY_TIERING))
4428 reset_memory_tiering();
4415 sysctl_numa_balancing_mode = state;
4416 __set_numabalancing_state(state);
4417 }
4418 return err;
4419}
4420#endif
4421#endif
4422

--- 738 unchanged lines hidden (view full) ---

5161 * sys_membarrier() requires an smp_mb() between setting
5162 * rq->curr / membarrier_switch_mm() and returning to userspace.
5163 *
5164 * The below provides this either through switch_mm(), or in
5165 * case 'prev->active_mm == next->mm' through
5166 * finish_task_switch()'s mmdrop().
5167 */
5168 switch_mm_irqs_off(prev->active_mm, next->mm, next);
4429 sysctl_numa_balancing_mode = state;
4430 __set_numabalancing_state(state);
4431 }
4432 return err;
4433}
4434#endif
4435#endif
4436

--- 738 unchanged lines hidden (view full) ---

5175 * sys_membarrier() requires an smp_mb() between setting
5176 * rq->curr / membarrier_switch_mm() and returning to userspace.
5177 *
5178 * The below provides this either through switch_mm(), or in
5179 * case 'prev->active_mm == next->mm' through
5180 * finish_task_switch()'s mmdrop().
5181 */
5182 switch_mm_irqs_off(prev->active_mm, next->mm, next);
5183 lru_gen_use_mm(next->mm);
5169
5170 if (!prev->mm) { // from kernel
5171 /* will mmdrop() in finish_task_switch(). */
5172 rq->prev_mm = prev->active_mm;
5173 prev->active_mm = NULL;
5174 }
5175 }
5176

--- 6058 unchanged lines hidden ---
5184
5185 if (!prev->mm) { // from kernel
5186 /* will mmdrop() in finish_task_switch(). */
5187 rq->prev_mm = prev->active_mm;
5188 prev->active_mm = NULL;
5189 }
5190 }
5191

--- 6058 unchanged lines hidden ---