hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/kernel/sched/debug.c
....@@ -1,13 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * kernel/sched/debug.c
34 *
45 * Print the CFS rbtree and other debugging details
56 *
67 * Copyright(C) 2007, Red Hat, Inc., Ingo Molnar
7
- *
8
- * This program is free software; you can redistribute it and/or modify
9
- * it under the terms of the GNU General Public License version 2 as
10
- * published by the Free Software Foundation.
118 */
129 #include "sched.h"
1310
....@@ -51,10 +48,11 @@
5148 #define SCHED_FEAT(name, enabled) \
5249 #name ,
5350
54
-static const char * const sched_feat_names[] = {
51
+const char * const sched_feat_names[] = {
5552 #include "features.h"
5653 };
5754
55
+EXPORT_SYMBOL_GPL(sched_feat_names);
5856 #undef SCHED_FEAT
5957
6058 static int sched_feat_show(struct seq_file *m, void *v)
....@@ -82,6 +80,7 @@
8280 struct static_key sched_feat_keys[__SCHED_FEAT_NR] = {
8381 #include "features.h"
8482 };
83
+EXPORT_SYMBOL_GPL(sched_feat_keys);
8584
8685 #undef SCHED_FEAT
8786
....@@ -234,49 +233,89 @@
234233 *tablep = NULL;
235234 }
236235
237
-static int min_load_idx = 0;
238
-static int max_load_idx = CPU_LOAD_IDX_MAX-1;
239
-
240236 static void
241237 set_table_entry(struct ctl_table *entry,
242238 const char *procname, void *data, int maxlen,
243
- umode_t mode, proc_handler *proc_handler,
244
- bool load_idx)
239
+ umode_t mode, proc_handler *proc_handler)
245240 {
246241 entry->procname = procname;
247242 entry->data = data;
248243 entry->maxlen = maxlen;
249244 entry->mode = mode;
250245 entry->proc_handler = proc_handler;
246
+}
251247
252
- if (load_idx) {
253
- entry->extra1 = &min_load_idx;
254
- entry->extra2 = &max_load_idx;
248
+static int sd_ctl_doflags(struct ctl_table *table, int write,
249
+ void *buffer, size_t *lenp, loff_t *ppos)
250
+{
251
+ unsigned long flags = *(unsigned long *)table->data;
252
+ size_t data_size = 0;
253
+ size_t len = 0;
254
+ char *tmp, *buf;
255
+ int idx;
256
+
257
+ if (write)
258
+ return 0;
259
+
260
+ for_each_set_bit(idx, &flags, __SD_FLAG_CNT) {
261
+ char *name = sd_flag_debug[idx].name;
262
+
263
+ /* Name plus whitespace */
264
+ data_size += strlen(name) + 1;
255265 }
266
+
267
+ if (*ppos > data_size) {
268
+ *lenp = 0;
269
+ return 0;
270
+ }
271
+
272
+ buf = kcalloc(data_size + 1, sizeof(*buf), GFP_KERNEL);
273
+ if (!buf)
274
+ return -ENOMEM;
275
+
276
+ for_each_set_bit(idx, &flags, __SD_FLAG_CNT) {
277
+ char *name = sd_flag_debug[idx].name;
278
+
279
+ len += snprintf(buf + len, strlen(name) + 2, "%s ", name);
280
+ }
281
+
282
+ tmp = buf + *ppos;
283
+ len -= *ppos;
284
+
285
+ if (len > *lenp)
286
+ len = *lenp;
287
+ if (len)
288
+ memcpy(buffer, tmp, len);
289
+ if (len < *lenp) {
290
+ ((char *)buffer)[len] = '\n';
291
+ len++;
292
+ }
293
+
294
+ *lenp = len;
295
+ *ppos += len;
296
+
297
+ kfree(buf);
298
+
299
+ return 0;
256300 }
257301
258302 static struct ctl_table *
259303 sd_alloc_ctl_domain_table(struct sched_domain *sd)
260304 {
261
- struct ctl_table *table = sd_alloc_ctl_entry(14);
305
+ struct ctl_table *table = sd_alloc_ctl_entry(9);
262306
263307 if (table == NULL)
264308 return NULL;
265309
266
- set_table_entry(&table[0] , "min_interval", &sd->min_interval, sizeof(long), 0644, proc_doulongvec_minmax, false);
267
- set_table_entry(&table[1] , "max_interval", &sd->max_interval, sizeof(long), 0644, proc_doulongvec_minmax, false);
268
- set_table_entry(&table[2] , "busy_idx", &sd->busy_idx, sizeof(int) , 0644, proc_dointvec_minmax, true );
269
- set_table_entry(&table[3] , "idle_idx", &sd->idle_idx, sizeof(int) , 0644, proc_dointvec_minmax, true );
270
- set_table_entry(&table[4] , "newidle_idx", &sd->newidle_idx, sizeof(int) , 0644, proc_dointvec_minmax, true );
271
- set_table_entry(&table[5] , "wake_idx", &sd->wake_idx, sizeof(int) , 0644, proc_dointvec_minmax, true );
272
- set_table_entry(&table[6] , "forkexec_idx", &sd->forkexec_idx, sizeof(int) , 0644, proc_dointvec_minmax, true );
273
- set_table_entry(&table[7] , "busy_factor", &sd->busy_factor, sizeof(int) , 0644, proc_dointvec_minmax, false);
274
- set_table_entry(&table[8] , "imbalance_pct", &sd->imbalance_pct, sizeof(int) , 0644, proc_dointvec_minmax, false);
275
- set_table_entry(&table[9] , "cache_nice_tries", &sd->cache_nice_tries, sizeof(int) , 0644, proc_dointvec_minmax, false);
276
- set_table_entry(&table[10], "flags", &sd->flags, sizeof(int) , 0644, proc_dointvec_minmax, false);
277
- set_table_entry(&table[11], "max_newidle_lb_cost", &sd->max_newidle_lb_cost, sizeof(long), 0644, proc_doulongvec_minmax, false);
278
- set_table_entry(&table[12], "name", sd->name, CORENAME_MAX_SIZE, 0444, proc_dostring, false);
279
- /* &table[13] is terminator */
310
+ set_table_entry(&table[0], "min_interval", &sd->min_interval, sizeof(long), 0644, proc_doulongvec_minmax);
311
+ set_table_entry(&table[1], "max_interval", &sd->max_interval, sizeof(long), 0644, proc_doulongvec_minmax);
312
+ set_table_entry(&table[2], "busy_factor", &sd->busy_factor, sizeof(int), 0644, proc_dointvec_minmax);
313
+ set_table_entry(&table[3], "imbalance_pct", &sd->imbalance_pct, sizeof(int), 0644, proc_dointvec_minmax);
314
+ set_table_entry(&table[4], "cache_nice_tries", &sd->cache_nice_tries, sizeof(int), 0644, proc_dointvec_minmax);
315
+ set_table_entry(&table[5], "flags", &sd->flags, sizeof(int), 0444, sd_ctl_doflags);
316
+ set_table_entry(&table[6], "max_newidle_lb_cost", &sd->max_newidle_lb_cost, sizeof(long), 0644, proc_doulongvec_minmax);
317
+ set_table_entry(&table[7], "name", sd->name, CORENAME_MAX_SIZE, 0444, proc_dostring);
318
+ /* &table[8] is terminator */
280319
281320 return table;
282321 }
....@@ -417,11 +456,10 @@
417456 }
418457
419458 P(se->load.weight);
420
- P(se->runnable_weight);
421459 #ifdef CONFIG_SMP
422460 P(se->avg.load_avg);
423461 P(se->avg.util_avg);
424
- P(se->avg.runnable_load_avg);
462
+ P(se->avg.runnable_avg);
425463 #endif
426464
427465 #undef PN_SCHEDSTAT
....@@ -474,7 +512,7 @@
474512 else
475513 SEQ_printf(m, " %c", task_state_to_char(p));
476514
477
- SEQ_printf(m, "%15s %5d %9Ld.%06ld %9Ld %5d ",
515
+ SEQ_printf(m, " %15s %5d %9Ld.%06ld %9Ld %5d ",
478516 p->comm, task_pid_nr(p),
479517 SPLIT_NS(p->se.vruntime),
480518 (long long)(p->nvcsw + p->nivcsw),
....@@ -501,10 +539,10 @@
501539
502540 SEQ_printf(m, "\n");
503541 SEQ_printf(m, "runnable tasks:\n");
504
- SEQ_printf(m, " S task PID tree-key switches prio"
542
+ SEQ_printf(m, " S task PID tree-key switches prio"
505543 " wait-time sum-exec sum-sleep\n");
506544 SEQ_printf(m, "-------------------------------------------------------"
507
- "----------------------------------------------------\n");
545
+ "------------------------------------------------------\n");
508546
509547 rcu_read_lock();
510548 for_each_process_thread(g, p) {
....@@ -560,11 +598,10 @@
560598 SEQ_printf(m, " .%-30s: %d\n", "nr_running", cfs_rq->nr_running);
561599 SEQ_printf(m, " .%-30s: %ld\n", "load", cfs_rq->load.weight);
562600 #ifdef CONFIG_SMP
563
- SEQ_printf(m, " .%-30s: %ld\n", "runnable_weight", cfs_rq->runnable_weight);
564601 SEQ_printf(m, " .%-30s: %lu\n", "load_avg",
565602 cfs_rq->avg.load_avg);
566
- SEQ_printf(m, " .%-30s: %lu\n", "runnable_load_avg",
567
- cfs_rq->avg.runnable_load_avg);
603
+ SEQ_printf(m, " .%-30s: %lu\n", "runnable_avg",
604
+ cfs_rq->avg.runnable_avg);
568605 SEQ_printf(m, " .%-30s: %lu\n", "util_avg",
569606 cfs_rq->avg.util_avg);
570607 SEQ_printf(m, " .%-30s: %u\n", "util_est_enqueued",
....@@ -573,8 +610,8 @@
573610 cfs_rq->removed.load_avg);
574611 SEQ_printf(m, " .%-30s: %ld\n", "removed.util_avg",
575612 cfs_rq->removed.util_avg);
576
- SEQ_printf(m, " .%-30s: %ld\n", "removed.runnable_sum",
577
- cfs_rq->removed.runnable_sum);
613
+ SEQ_printf(m, " .%-30s: %ld\n", "removed.runnable_avg",
614
+ cfs_rq->removed.runnable_avg);
578615 #ifdef CONFIG_FAIR_GROUP_SCHED
579616 SEQ_printf(m, " .%-30s: %lu\n", "tg_load_avg_contrib",
580617 cfs_rq->tg_load_avg_contrib);
....@@ -674,20 +711,12 @@
674711 SEQ_printf(m, " .%-30s: %Ld.%06ld\n", #x, SPLIT_NS(rq->x))
675712
676713 P(nr_running);
677
- SEQ_printf(m, " .%-30s: %lu\n", "load",
678
- rq->load.weight);
679714 P(nr_switches);
680
- P(nr_load_updates);
681715 P(nr_uninterruptible);
682716 PN(next_balance);
683717 SEQ_printf(m, " .%-30s: %ld\n", "curr->pid", (long)(task_pid_nr(rq->curr)));
684718 PN(clock);
685719 PN(clock_task);
686
- P(cpu_load[0]);
687
- P(cpu_load[1]);
688
- P(cpu_load[2]);
689
- P(cpu_load[3]);
690
- P(cpu_load[4]);
691720 #undef P
692721 #undef PN
693722
....@@ -718,7 +747,7 @@
718747
719748 static const char *sched_tunable_scaling_names[] = {
720749 "none",
721
- "logaritmic",
750
+ "logarithmic",
722751 "linear"
723752 };
724753
....@@ -791,9 +820,16 @@
791820 int cpu;
792821
793822 sched_debug_header(NULL);
794
- for_each_online_cpu(cpu)
823
+ for_each_online_cpu(cpu) {
824
+ /*
825
+ * Need to reset softlockup watchdogs on all CPUs, because
826
+ * another CPU might be blocked waiting for us to process
827
+ * an IPI or stop_machine.
828
+ */
829
+ touch_nmi_watchdog();
830
+ touch_all_softlockup_watchdogs();
795831 print_cpu(NULL, cpu);
796
-
832
+ }
797833 }
798834
799835 /*
....@@ -851,10 +887,13 @@
851887
852888 __initcall(init_sched_debug_procfs);
853889
854
-#define __P(F) SEQ_printf(m, "%-45s:%21Ld\n", #F, (long long)F)
855
-#define P(F) SEQ_printf(m, "%-45s:%21Ld\n", #F, (long long)p->F)
856
-#define __PN(F) SEQ_printf(m, "%-45s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)F))
857
-#define PN(F) SEQ_printf(m, "%-45s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)p->F))
890
+#define __PS(S, F) SEQ_printf(m, "%-45s:%21Ld\n", S, (long long)(F))
891
+#define __P(F) __PS(#F, F)
892
+#define P(F) __PS(#F, p->F)
893
+#define PM(F, M) __PS(#F, p->F & (M))
894
+#define __PSN(S, F) SEQ_printf(m, "%-45s:%14Ld.%06ld\n", S, SPLIT_NS((long long)(F)))
895
+#define __PN(F) __PSN(#F, F)
896
+#define PN(F) __PSN(#F, p->F)
858897
859898
860899 #ifdef CONFIG_NUMA_BALANCING
....@@ -871,17 +910,8 @@
871910 static void sched_show_numa(struct task_struct *p, struct seq_file *m)
872911 {
873912 #ifdef CONFIG_NUMA_BALANCING
874
- struct mempolicy *pol;
875
-
876913 if (p->mm)
877914 P(mm->numa_scan_seq);
878
-
879
- task_lock(p);
880
- pol = p->mempolicy;
881
- if (pol && !(pol->flags & MPOL_F_MORON))
882
- pol = NULL;
883
- mpol_get(pol);
884
- task_unlock(p);
885915
886916 P(numa_pages_migrated);
887917 P(numa_preferred_nid);
....@@ -889,7 +919,6 @@
889919 SEQ_printf(m, "current_node=%d, numa_group_id=%d\n",
890920 task_node(p), task_numa_group_id(p));
891921 show_numa_stats(p, m);
892
- mpol_put(pol);
893922 #endif
894923 }
895924
....@@ -903,18 +932,9 @@
903932 SEQ_printf(m,
904933 "---------------------------------------------------------"
905934 "----------\n");
906
-#define __P(F) \
907
- SEQ_printf(m, "%-45s:%21Ld\n", #F, (long long)F)
908
-#define P(F) \
909
- SEQ_printf(m, "%-45s:%21Ld\n", #F, (long long)p->F)
910
-#define P_SCHEDSTAT(F) \
911
- SEQ_printf(m, "%-45s:%21Ld\n", #F, (long long)schedstat_val(p->F))
912
-#define __PN(F) \
913
- SEQ_printf(m, "%-45s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)F))
914
-#define PN(F) \
915
- SEQ_printf(m, "%-45s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)p->F))
916
-#define PN_SCHEDSTAT(F) \
917
- SEQ_printf(m, "%-45s:%14Ld.%06ld\n", #F, SPLIT_NS((long long)schedstat_val(p->F)))
935
+
936
+#define P_SCHEDSTAT(F) __PS(#F, schedstat_val(p->F))
937
+#define PN_SCHEDSTAT(F) __PSN(#F, schedstat_val(p->F))
918938
919939 PN(se.exec_start);
920940 PN(se.vruntime);
....@@ -974,40 +994,35 @@
974994 }
975995
976996 __P(nr_switches);
977
- SEQ_printf(m, "%-45s:%21Ld\n",
978
- "nr_voluntary_switches", (long long)p->nvcsw);
979
- SEQ_printf(m, "%-45s:%21Ld\n",
980
- "nr_involuntary_switches", (long long)p->nivcsw);
997
+ __PS("nr_voluntary_switches", p->nvcsw);
998
+ __PS("nr_involuntary_switches", p->nivcsw);
981999
9821000 P(se.load.weight);
983
- P(se.runnable_weight);
9841001 #ifdef CONFIG_SMP
9851002 P(se.avg.load_sum);
986
- P(se.avg.runnable_load_sum);
1003
+ P(se.avg.runnable_sum);
9871004 P(se.avg.util_sum);
9881005 P(se.avg.load_avg);
989
- P(se.avg.runnable_load_avg);
1006
+ P(se.avg.runnable_avg);
9901007 P(se.avg.util_avg);
9911008 P(se.avg.last_update_time);
9921009 P(se.avg.util_est.ewma);
993
- P(se.avg.util_est.enqueued);
1010
+ PM(se.avg.util_est.enqueued, ~UTIL_AVG_UNCHANGED);
1011
+#endif
1012
+#ifdef CONFIG_UCLAMP_TASK
1013
+ __PS("uclamp.min", p->uclamp_req[UCLAMP_MIN].value);
1014
+ __PS("uclamp.max", p->uclamp_req[UCLAMP_MAX].value);
1015
+ __PS("effective uclamp.min", uclamp_eff_value(p, UCLAMP_MIN));
1016
+ __PS("effective uclamp.max", uclamp_eff_value(p, UCLAMP_MAX));
9941017 #endif
9951018 P(policy);
9961019 P(prio);
997
- if (p->policy == SCHED_DEADLINE) {
1020
+ if (task_has_dl_policy(p)) {
9981021 P(dl.runtime);
9991022 P(dl.deadline);
10001023 }
1001
-#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE)
1002
- P(migrate_disable);
1003
-#endif
1004
- P(nr_cpus_allowed);
10051024 #undef PN_SCHEDSTAT
1006
-#undef PN
1007
-#undef __PN
10081025 #undef P_SCHEDSTAT
1009
-#undef P
1010
-#undef __P
10111026
10121027 {
10131028 unsigned int this_cpu = raw_smp_processor_id();
....@@ -1015,8 +1030,7 @@
10151030
10161031 t0 = cpu_clock(this_cpu);
10171032 t1 = cpu_clock(this_cpu);
1018
- SEQ_printf(m, "%-45s:%21Ld\n",
1019
- "clock-delta", (long long)(t1-t0));
1033
+ __PS("clock-delta", t1-t0);
10201034 }
10211035
10221036 sched_show_numa(p, m);