mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-24 04:07:47 +07:00
Merge branch 'x86-cache-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 resource control updates from Ingo Molnar: "The main change in this tree is the extension of the resctrl procfs ABI with a new file that helps tooling to navigate from tasks back to resctrl groups: /proc/{pid}/cpu_resctrl_groups. Also fix static key usage for certain feature combinations and simplify the task exit resctrl case" * 'x86-cache-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/resctrl: Add task resctrl information display x86/resctrl: Check monitoring static key in the MBM overflow handler x86/resctrl: Do not reconfigure exiting tasks
This commit is contained in:
commit
4244057c3d
@ -457,6 +457,7 @@ config X86_CPU_RESCTRL
|
|||||||
bool "x86 CPU resource control support"
|
bool "x86 CPU resource control support"
|
||||||
depends on X86 && (CPU_SUP_INTEL || CPU_SUP_AMD)
|
depends on X86 && (CPU_SUP_INTEL || CPU_SUP_AMD)
|
||||||
select KERNFS
|
select KERNFS
|
||||||
|
select PROC_CPU_RESCTRL if PROC_FS
|
||||||
help
|
help
|
||||||
Enable x86 CPU resource control support.
|
Enable x86 CPU resource control support.
|
||||||
|
|
||||||
|
@ -57,6 +57,7 @@ static inline struct rdt_fs_context *rdt_fc2context(struct fs_context *fc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
DECLARE_STATIC_KEY_FALSE(rdt_enable_key);
|
DECLARE_STATIC_KEY_FALSE(rdt_enable_key);
|
||||||
|
DECLARE_STATIC_KEY_FALSE(rdt_mon_enable_key);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct mon_evt - Entry in the event list of a resource
|
* struct mon_evt - Entry in the event list of a resource
|
||||||
|
@ -514,7 +514,7 @@ void mbm_handle_overflow(struct work_struct *work)
|
|||||||
|
|
||||||
mutex_lock(&rdtgroup_mutex);
|
mutex_lock(&rdtgroup_mutex);
|
||||||
|
|
||||||
if (!static_branch_likely(&rdt_enable_key))
|
if (!static_branch_likely(&rdt_mon_enable_key))
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
d = get_domain_from_cpu(cpu, &rdt_resources_all[RDT_RESOURCE_L3]);
|
d = get_domain_from_cpu(cpu, &rdt_resources_all[RDT_RESOURCE_L3]);
|
||||||
@ -543,7 +543,7 @@ void mbm_setup_overflow_handler(struct rdt_domain *dom, unsigned long delay_ms)
|
|||||||
unsigned long delay = msecs_to_jiffies(delay_ms);
|
unsigned long delay = msecs_to_jiffies(delay_ms);
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
if (!static_branch_likely(&rdt_enable_key))
|
if (!static_branch_likely(&rdt_mon_enable_key))
|
||||||
return;
|
return;
|
||||||
cpu = cpumask_any(&dom->cpu_mask);
|
cpu = cpumask_any(&dom->cpu_mask);
|
||||||
dom->mbm_work_cpu = cpu;
|
dom->mbm_work_cpu = cpu;
|
||||||
|
@ -532,11 +532,15 @@ static void move_myself(struct callback_head *head)
|
|||||||
kfree(rdtgrp);
|
kfree(rdtgrp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (unlikely(current->flags & PF_EXITING))
|
||||||
|
goto out;
|
||||||
|
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
/* update PQR_ASSOC MSR to make resource group go into effect */
|
/* update PQR_ASSOC MSR to make resource group go into effect */
|
||||||
resctrl_sched_in();
|
resctrl_sched_in();
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
|
|
||||||
|
out:
|
||||||
kfree(callback);
|
kfree(callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -725,6 +729,92 @@ static int rdtgroup_tasks_show(struct kernfs_open_file *of,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PROC_CPU_RESCTRL
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A task can only be part of one resctrl control group and of one monitor
|
||||||
|
* group which is associated to that control group.
|
||||||
|
*
|
||||||
|
* 1) res:
|
||||||
|
* mon:
|
||||||
|
*
|
||||||
|
* resctrl is not available.
|
||||||
|
*
|
||||||
|
* 2) res:/
|
||||||
|
* mon:
|
||||||
|
*
|
||||||
|
* Task is part of the root resctrl control group, and it is not associated
|
||||||
|
* to any monitor group.
|
||||||
|
*
|
||||||
|
* 3) res:/
|
||||||
|
* mon:mon0
|
||||||
|
*
|
||||||
|
* Task is part of the root resctrl control group and monitor group mon0.
|
||||||
|
*
|
||||||
|
* 4) res:group0
|
||||||
|
* mon:
|
||||||
|
*
|
||||||
|
* Task is part of resctrl control group group0, and it is not associated
|
||||||
|
* to any monitor group.
|
||||||
|
*
|
||||||
|
* 5) res:group0
|
||||||
|
* mon:mon1
|
||||||
|
*
|
||||||
|
* Task is part of resctrl control group group0 and monitor group mon1.
|
||||||
|
*/
|
||||||
|
int proc_resctrl_show(struct seq_file *s, struct pid_namespace *ns,
|
||||||
|
struct pid *pid, struct task_struct *tsk)
|
||||||
|
{
|
||||||
|
struct rdtgroup *rdtg;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
mutex_lock(&rdtgroup_mutex);
|
||||||
|
|
||||||
|
/* Return empty if resctrl has not been mounted. */
|
||||||
|
if (!static_branch_unlikely(&rdt_enable_key)) {
|
||||||
|
seq_puts(s, "res:\nmon:\n");
|
||||||
|
goto unlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
list_for_each_entry(rdtg, &rdt_all_groups, rdtgroup_list) {
|
||||||
|
struct rdtgroup *crg;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Task information is only relevant for shareable
|
||||||
|
* and exclusive groups.
|
||||||
|
*/
|
||||||
|
if (rdtg->mode != RDT_MODE_SHAREABLE &&
|
||||||
|
rdtg->mode != RDT_MODE_EXCLUSIVE)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (rdtg->closid != tsk->closid)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
seq_printf(s, "res:%s%s\n", (rdtg == &rdtgroup_default) ? "/" : "",
|
||||||
|
rdtg->kn->name);
|
||||||
|
seq_puts(s, "mon:");
|
||||||
|
list_for_each_entry(crg, &rdtg->mon.crdtgrp_list,
|
||||||
|
mon.crdtgrp_list) {
|
||||||
|
if (tsk->rmid != crg->mon.rmid)
|
||||||
|
continue;
|
||||||
|
seq_printf(s, "%s", crg->kn->name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
seq_putc(s, '\n');
|
||||||
|
goto unlock;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* The above search should succeed. Otherwise return
|
||||||
|
* with an error.
|
||||||
|
*/
|
||||||
|
ret = -ENOENT;
|
||||||
|
unlock:
|
||||||
|
mutex_unlock(&rdtgroup_mutex);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int rdt_last_cmd_status_show(struct kernfs_open_file *of,
|
static int rdt_last_cmd_status_show(struct kernfs_open_file *of,
|
||||||
struct seq_file *seq, void *v)
|
struct seq_file *seq, void *v)
|
||||||
{
|
{
|
||||||
|
@ -103,3 +103,7 @@ config PROC_CHILDREN
|
|||||||
config PROC_PID_ARCH_STATUS
|
config PROC_PID_ARCH_STATUS
|
||||||
def_bool n
|
def_bool n
|
||||||
depends on PROC_FS
|
depends on PROC_FS
|
||||||
|
|
||||||
|
config PROC_CPU_RESCTRL
|
||||||
|
def_bool n
|
||||||
|
depends on PROC_FS
|
||||||
|
@ -95,6 +95,7 @@
|
|||||||
#include <linux/sched/stat.h>
|
#include <linux/sched/stat.h>
|
||||||
#include <linux/posix-timers.h>
|
#include <linux/posix-timers.h>
|
||||||
#include <linux/time_namespace.h>
|
#include <linux/time_namespace.h>
|
||||||
|
#include <linux/resctrl.h>
|
||||||
#include <trace/events/oom.h>
|
#include <trace/events/oom.h>
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "fd.h"
|
#include "fd.h"
|
||||||
@ -3154,6 +3155,9 @@ static const struct pid_entry tgid_base_stuff[] = {
|
|||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_CGROUPS
|
#ifdef CONFIG_CGROUPS
|
||||||
ONE("cgroup", S_IRUGO, proc_cgroup_show),
|
ONE("cgroup", S_IRUGO, proc_cgroup_show),
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_PROC_CPU_RESCTRL
|
||||||
|
ONE("cpu_resctrl_groups", S_IRUGO, proc_resctrl_show),
|
||||||
#endif
|
#endif
|
||||||
ONE("oom_score", S_IRUGO, proc_oom_score),
|
ONE("oom_score", S_IRUGO, proc_oom_score),
|
||||||
REG("oom_adj", S_IRUGO|S_IWUSR, proc_oom_adj_operations),
|
REG("oom_adj", S_IRUGO|S_IWUSR, proc_oom_adj_operations),
|
||||||
@ -3554,6 +3558,9 @@ static const struct pid_entry tid_base_stuff[] = {
|
|||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_CGROUPS
|
#ifdef CONFIG_CGROUPS
|
||||||
ONE("cgroup", S_IRUGO, proc_cgroup_show),
|
ONE("cgroup", S_IRUGO, proc_cgroup_show),
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_PROC_CPU_RESCTRL
|
||||||
|
ONE("cpu_resctrl_groups", S_IRUGO, proc_resctrl_show),
|
||||||
#endif
|
#endif
|
||||||
ONE("oom_score", S_IRUGO, proc_oom_score),
|
ONE("oom_score", S_IRUGO, proc_oom_score),
|
||||||
REG("oom_adj", S_IRUGO|S_IWUSR, proc_oom_adj_operations),
|
REG("oom_adj", S_IRUGO|S_IWUSR, proc_oom_adj_operations),
|
||||||
|
14
include/linux/resctrl.h
Normal file
14
include/linux/resctrl.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
#ifndef _RESCTRL_H
|
||||||
|
#define _RESCTRL_H
|
||||||
|
|
||||||
|
#ifdef CONFIG_PROC_CPU_RESCTRL
|
||||||
|
|
||||||
|
int proc_resctrl_show(struct seq_file *m,
|
||||||
|
struct pid_namespace *ns,
|
||||||
|
struct pid *pid,
|
||||||
|
struct task_struct *tsk);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _RESCTRL_H */
|
Loading…
Reference in New Issue
Block a user