profiling: remove profile=sleep support

The kernel sleep profile is no longer working due to a recursive locking
bug introduced by commit 42a20f86dc19 ("sched: Add wrapper for get_wchan()
to keep task blocked")

Booting with the 'profile=sleep' kernel command line option added or
executing

# echo -n sleep > /sys/kernel/profiling

after boot causes the system to lock up.

Lockdep reports

kthreadd/3 is trying to acquire lock:
ffff93ac82e08d58 (&p->pi_lock){....}-{2:2}, at: get_wchan+0x32/0x70

but task is already holding lock:
ffff93ac82e08d58 (&p->pi_lock){....}-{2:2}, at: try_to_wake_up+0x53/0x370

with the call trace being

lock_acquire+0xc8/0x2f0
get_wchan+0x32/0x70
__update_stats_enqueue_sleeper+0x151/0x430
enqueue_entity+0x4b0/0x520
enqueue_task_fair+0x92/0x6b0
ttwu_do_activate+0x73/0x140
try_to_wake_up+0x213/0x370
swake_up_locked+0x20/0x50
complete+0x2f/0x40
kthread+0xfb/0x180

However, since nobody noticed this regression for more than two years,
let's remove 'profile=sleep' support based on the assumption that nobody
needs this functionality.

Fixes: 42a20f86dc19 ("sched: Add wrapper for get_wchan() to keep task blocked")
Cc: stable@vger.kernel.org # v5.16+
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by Tetsuo Handa and committed by Linus Torvalds b88f5538 a5dbd76a

Changed files
+2 -24
Documentation
admin-guide
include
linux
kernel
+1 -3
Documentation/admin-guide/kernel-parameters.txt
··· 4798 4798 4799 4799 profile= [KNL] Enable kernel profiling via /proc/profile 4800 4800 Format: [<profiletype>,]<number> 4801 - Param: <profiletype>: "schedule", "sleep", or "kvm" 4801 + Param: <profiletype>: "schedule" or "kvm" 4802 4802 [defaults to kernel profiling] 4803 4803 Param: "schedule" - profile schedule points. 4804 - Param: "sleep" - profile D-state sleeping (millisecs). 4805 - Requires CONFIG_SCHEDSTATS 4806 4804 Param: "kvm" - profile VM exits. 4807 4805 Param: <number> - step/bucket size as a power of 2 for 4808 4806 statistical time based profiling.
-1
include/linux/profile.h
··· 10 10 11 11 #define CPU_PROFILING 1 12 12 #define SCHED_PROFILING 2 13 - #define SLEEP_PROFILING 3 14 13 #define KVM_PROFILING 4 15 14 16 15 struct proc_dir_entry;
+1 -10
kernel/profile.c
··· 50 50 int profile_setup(char *str) 51 51 { 52 52 static const char schedstr[] = "schedule"; 53 - static const char sleepstr[] = "sleep"; 54 53 static const char kvmstr[] = "kvm"; 55 54 const char *select = NULL; 56 55 int par; 57 56 58 - if (!strncmp(str, sleepstr, strlen(sleepstr))) { 59 - #ifdef CONFIG_SCHEDSTATS 60 - force_schedstat_enabled(); 61 - prof_on = SLEEP_PROFILING; 62 - select = sleepstr; 63 - #else 64 - pr_warn("kernel sleep profiling requires CONFIG_SCHEDSTATS\n"); 65 - #endif /* CONFIG_SCHEDSTATS */ 66 - } else if (!strncmp(str, schedstr, strlen(schedstr))) { 57 + if (!strncmp(str, schedstr, strlen(schedstr))) { 67 58 prof_on = SCHED_PROFILING; 68 59 select = schedstr; 69 60 } else if (!strncmp(str, kvmstr, strlen(kvmstr))) {
-10
kernel/sched/stats.c
··· 92 92 93 93 trace_sched_stat_blocked(p, delta); 94 94 95 - /* 96 - * Blocking time is in units of nanosecs, so shift by 97 - * 20 to get a milliseconds-range estimation of the 98 - * amount of time that the task spent sleeping: 99 - */ 100 - if (unlikely(prof_on == SLEEP_PROFILING)) { 101 - profile_hits(SLEEP_PROFILING, 102 - (void *)get_wchan(p), 103 - delta >> 20); 104 - } 105 95 account_scheduler_latency(p, delta >> 10, 0); 106 96 } 107 97 }