|
@@ -2253,9 +2253,11 @@ int sysctl_numa_balancing(struct ctl_table *table, int write,
|
|
#endif
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+#ifdef CONFIG_SCHEDSTATS
|
|
|
|
+
|
|
DEFINE_STATIC_KEY_FALSE(sched_schedstats);
|
|
DEFINE_STATIC_KEY_FALSE(sched_schedstats);
|
|
|
|
+static bool __initdata __sched_schedstats = false;
|
|
|
|
|
|
-#ifdef CONFIG_SCHEDSTATS
|
|
|
|
static void set_schedstats(bool enabled)
|
|
static void set_schedstats(bool enabled)
|
|
{
|
|
{
|
|
if (enabled)
|
|
if (enabled)
|
|
@@ -2278,11 +2280,16 @@ static int __init setup_schedstats(char *str)
|
|
if (!str)
|
|
if (!str)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * This code is called before jump labels have been set up, so we can't
|
|
|
|
+ * change the static branch directly just yet. Instead set a temporary
|
|
|
|
+ * variable so init_schedstats() can do it later.
|
|
|
|
+ */
|
|
if (!strcmp(str, "enable")) {
|
|
if (!strcmp(str, "enable")) {
|
|
- set_schedstats(true);
|
|
|
|
|
|
+ __sched_schedstats = true;
|
|
ret = 1;
|
|
ret = 1;
|
|
} else if (!strcmp(str, "disable")) {
|
|
} else if (!strcmp(str, "disable")) {
|
|
- set_schedstats(false);
|
|
|
|
|
|
+ __sched_schedstats = false;
|
|
ret = 1;
|
|
ret = 1;
|
|
}
|
|
}
|
|
out:
|
|
out:
|
|
@@ -2293,6 +2300,11 @@ out:
|
|
}
|
|
}
|
|
__setup("schedstats=", setup_schedstats);
|
|
__setup("schedstats=", setup_schedstats);
|
|
|
|
|
|
|
|
+static void __init init_schedstats(void)
|
|
|
|
+{
|
|
|
|
+ set_schedstats(__sched_schedstats);
|
|
|
|
+}
|
|
|
|
+
|
|
#ifdef CONFIG_PROC_SYSCTL
|
|
#ifdef CONFIG_PROC_SYSCTL
|
|
int sysctl_schedstats(struct ctl_table *table, int write,
|
|
int sysctl_schedstats(struct ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
@@ -2313,8 +2325,10 @@ int sysctl_schedstats(struct ctl_table *table, int write,
|
|
set_schedstats(state);
|
|
set_schedstats(state);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
-#endif
|
|
|
|
-#endif
|
|
|
|
|
|
+#endif /* CONFIG_PROC_SYSCTL */
|
|
|
|
+#else /* !CONFIG_SCHEDSTATS */
|
|
|
|
+static inline void init_schedstats(void) {}
|
|
|
|
+#endif /* CONFIG_SCHEDSTATS */
|
|
|
|
|
|
/*
|
|
/*
|
|
* fork()/clone()-time setup:
|
|
* fork()/clone()-time setup:
|
|
@@ -7487,6 +7501,8 @@ void __init sched_init(void)
|
|
#endif
|
|
#endif
|
|
init_sched_fair_class();
|
|
init_sched_fair_class();
|
|
|
|
|
|
|
|
+ init_schedstats();
|
|
|
|
+
|
|
scheduler_running = 1;
|
|
scheduler_running = 1;
|
|
}
|
|
}
|
|
|
|
|