bcc/tools: Fix renaming of the state field of task_struct
Kernel commit 2f064a59a1 ("sched: Change task_struct::state") changes
the name of task_struct::state to task_struct::__state, which breaks
several bcc tools. Fix this issue by checking field existence in vmlinux
BTF. Since this change was intruduce in kernel v5.14, we should have
BTF support. Closes #3658 .
Signed-off-by: Hengqi Chen <chenhengqi@outlook.com>
diff --git a/tools/offcputime.py b/tools/offcputime.py
index 128c649..c9b1e6e 100755
--- a/tools/offcputime.py
+++ b/tools/offcputime.py
@@ -116,8 +116,8 @@
#define MAXBLOCK_US MAXBLOCK_US_VALUEULL
struct key_t {
- u32 pid;
- u32 tgid;
+ u64 pid;
+ u64 tgid;
int user_stack_id;
int kernel_stack_id;
char name[TASK_COMM_LEN];
@@ -205,14 +205,18 @@
thread_context = "all threads"
thread_filter = '1'
if args.state == 0:
- state_filter = 'prev->state == 0'
+ state_filter = 'prev->STATE_FIELD == 0'
elif args.state:
# these states are sometimes bitmask checked
- state_filter = 'prev->state & %d' % args.state
+ state_filter = 'prev->STATE_FIELD & %d' % args.state
else:
state_filter = '1'
bpf_text = bpf_text.replace('THREAD_FILTER', thread_filter)
bpf_text = bpf_text.replace('STATE_FILTER', state_filter)
+if BPF.kernel_struct_has_field(b'task_struct', b'__state') == 1:
+ bpf_text = bpf_text.replace('STATE_FIELD', '__state')
+else:
+ bpf_text = bpf_text.replace('STATE_FIELD', 'state')
# set stack storage size
bpf_text = bpf_text.replace('STACK_STORAGE_SIZE', str(args.stack_storage_size))