|
@@ -136,8 +136,18 @@
|
|
|
|
|
|
static int psi_bug __read_mostly;
|
|
|
|
|
|
-bool psi_disabled __read_mostly;
|
|
|
-core_param(psi_disabled, psi_disabled, bool, 0644);
|
|
|
+DEFINE_STATIC_KEY_FALSE(psi_disabled);
|
|
|
+
|
|
|
+#ifdef CONFIG_PSI_DEFAULT_DISABLED
|
|
|
+bool psi_enable;
|
|
|
+#else
|
|
|
+bool psi_enable = true;
|
|
|
+#endif
|
|
|
+static int __init setup_psi(char *str)
|
|
|
+{
|
|
|
+ return kstrtobool(str, &psi_enable) == 0;
|
|
|
+}
|
|
|
+__setup("psi=", setup_psi);
|
|
|
|
|
|
/* Running averages - we need to be higher-res than loadavg */
|
|
|
#define PSI_FREQ (2*HZ+1) /* 2 sec intervals */
|
|
@@ -169,8 +179,10 @@ static void group_init(struct psi_group *group)
|
|
|
|
|
|
void __init psi_init(void)
|
|
|
{
|
|
|
- if (psi_disabled)
|
|
|
+ if (!psi_enable) {
|
|
|
+ static_branch_enable(&psi_disabled);
|
|
|
return;
|
|
|
+ }
|
|
|
|
|
|
psi_period = jiffies_to_nsecs(PSI_FREQ);
|
|
|
group_init(&psi_system);
|
|
@@ -549,7 +561,7 @@ void psi_memstall_enter(unsigned long *flags)
|
|
|
struct rq_flags rf;
|
|
|
struct rq *rq;
|
|
|
|
|
|
- if (psi_disabled)
|
|
|
+ if (static_branch_likely(&psi_disabled))
|
|
|
return;
|
|
|
|
|
|
*flags = current->flags & PF_MEMSTALL;
|
|
@@ -579,7 +591,7 @@ void psi_memstall_leave(unsigned long *flags)
|
|
|
struct rq_flags rf;
|
|
|
struct rq *rq;
|
|
|
|
|
|
- if (psi_disabled)
|
|
|
+ if (static_branch_likely(&psi_disabled))
|
|
|
return;
|
|
|
|
|
|
if (*flags)
|
|
@@ -600,7 +612,7 @@ void psi_memstall_leave(unsigned long *flags)
|
|
|
#ifdef CONFIG_CGROUPS
|
|
|
int psi_cgroup_alloc(struct cgroup *cgroup)
|
|
|
{
|
|
|
- if (psi_disabled)
|
|
|
+ if (static_branch_likely(&psi_disabled))
|
|
|
return 0;
|
|
|
|
|
|
cgroup->psi.pcpu = alloc_percpu(struct psi_group_cpu);
|
|
@@ -612,7 +624,7 @@ int psi_cgroup_alloc(struct cgroup *cgroup)
|
|
|
|
|
|
void psi_cgroup_free(struct cgroup *cgroup)
|
|
|
{
|
|
|
- if (psi_disabled)
|
|
|
+ if (static_branch_likely(&psi_disabled))
|
|
|
return;
|
|
|
|
|
|
cancel_delayed_work_sync(&cgroup->psi.clock_work);
|
|
@@ -637,7 +649,7 @@ void cgroup_move_task(struct task_struct *task, struct css_set *to)
|
|
|
struct rq_flags rf;
|
|
|
struct rq *rq;
|
|
|
|
|
|
- if (psi_disabled) {
|
|
|
+ if (static_branch_likely(&psi_disabled)) {
|
|
|
/*
|
|
|
* Lame to do this here, but the scheduler cannot be locked
|
|
|
* from the outside, so we move cgroups from inside sched/.
|
|
@@ -673,7 +685,7 @@ int psi_show(struct seq_file *m, struct psi_group *group, enum psi_res res)
|
|
|
{
|
|
|
int full;
|
|
|
|
|
|
- if (psi_disabled)
|
|
|
+ if (static_branch_likely(&psi_disabled))
|
|
|
return -EOPNOTSUPP;
|
|
|
|
|
|
update_stats(group);
|