1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright (C) 2022 Huawei Technologies Co., Ltd. All rights reserved.
4 */
5
6#ifndef DFX_HUNGTASK_BASE_H
7#define DFX_HUNGTASK_BASE_H
8
9#include <linux/list.h>
10#include <linux/sched.h>
11#include <linux/types.h>
12
13#define ENABLE_SHOW_LEN 8
14#define WHITELIST_STORE_LEN 400
15#define WHITELIST_LEN 61
16#define WHITE_LIST 1
17#define BLACK_LIST 2
18#define HT_ENABLE 1
19#define HT_DISABLE 0
20#define HEARTBEAT_TIME 3
21#define MAX_LOOP_NUM (CONFIG_DEFAULT_HUNG_TASK_TIMEOUT / HEARTBEAT_TIME)
22#define ONE_MINUTE (60 / HEARTBEAT_TIME)
23#define ONE_AND_HALF_MINUTE (90 / HEARTBEAT_TIME)
24#define TWO_MINUTES (120 / HEARTBEAT_TIME)
25#define THREE_MINUTES (180 / HEARTBEAT_TIME)
26#define TWENTY_SECONDS (21 / HEARTBEAT_TIME)
27#define THIRTY_SECONDS (30 / HEARTBEAT_TIME)
28#define HUNG_ONE_HOUR (3600 / HEARTBEAT_TIME)
29#define HUNG_TEN_MINUTES (600 / HEARTBEAT_TIME)
30#define HUNGTASK_REPORT_TIMECOST TWENTY_SECONDS
31#define HT_DUMP_IN_PANIC_LOOSE 5
32#define HT_DUMP_IN_PANIC_STRICT 2
33#define REFRESH_INTERVAL THREE_MINUTES
34#define FLAG_DUMP_WHITE (1 << 0)
35#define FLAG_DUMP_APP (1 << 1)
36#define FLAG_DUMP_NOSCHEDULE (1 << 2)
37#define FLAG_DUMP_JANK (1 << 3)
38#define FLAG_PANIC (1 << 4)
39#define FLAG_PF_FROZEN (1 << 6)
40#define TASK_TYPE_IGNORE 0
41#define TASK_TYPE_WHITE (1 << 0)
42#define TASK_TYPE_APP (1 << 1)
43#define TASK_TYPE_JANK (1 << 2)
44#define TASK_TYPE_KERNEL (1 << 3)
45#define TASK_TYPE_NATIVE (1 << 4)
46#define TASK_TYPE_FROZEN (1 << 6)
47#define PID_INIT 1
48#define PID_KTHREAD 2
49#define DEFAULT_WHITE_DUMP_CNT MAX_LOOP_NUM
50#define DEFAULT_WHITE_PANIC_CNT MAX_LOOP_NUM
51#define HUNG_TASK_UPLOAD_ONCE 1
52#define FROZEN_BUF_LEN 1024
53#define MAX_REMOVE_LIST_NUM 200
54#define HUNGTASK_DOMAIN "KERNEL_VENDOR"
55#define HUNGTASK_NAME "HUNGTASK"
56#define INIT_FREEZE_NAME "INIT_FREEZE"
57#define HUNG_TASK_BATCHING 1024
58#define TIME_REFRESH_PIDS 20
59#define PID_ERROR (-1)
60#define HUNGTASK_EVENT_WHITELIST 1
61#define REPORT_MSGLENGTH 200
62
63struct task_item {
64	struct rb_node node;
65	pid_t pid;
66	pid_t tgid;
67	char name[TASK_COMM_LEN + 1];
68	unsigned long switch_count;
69	unsigned int task_type;
70	int dump_wa;
71	int panic_wa;
72	int dump_jank;
73	int d_state_time;
74	bool isdone_wa;
75};
76
77struct hashlist_node {
78	pid_t pid;
79	struct hlist_node list;
80};
81
82struct whitelist_item {
83	pid_t pid;
84	char name[TASK_COMM_LEN + 1];
85};
86
87struct task_hung_upload {
88	char name[TASK_COMM_LEN + 1];
89	pid_t pid;
90	pid_t tgid;
91	unsigned int flag;
92	int duration;
93};
94
95extern unsigned long sysctl_hung_task_timeout_secs;
96extern unsigned int sysctl_hung_task_panic;
97
98void do_dump_task(struct task_struct *task);
99int dump_task_wa(struct task_item *item, int dump_cnt,
100		 struct task_struct *task, unsigned int flag);
101void do_show_task(struct task_struct *task, unsigned int flag, int d_state_time);
102void hungtask_show_state_filter(unsigned long state_filter);
103int htbase_create_sysfs(void);
104void htbase_set_panic(int new_did_panic);
105void htbase_set_timeout_secs(unsigned long new_hungtask_timeout_secs);
106void htbase_check_tasks(unsigned long timeout);
107bool hashlist_find(struct hlist_head *head, int count, pid_t tgid);
108void hashlist_clear(struct hlist_head *head, int count);
109bool hashlist_insert(struct hlist_head *head, int count, pid_t tgid);
110
111#endif /* DFX_HUNGTASK_BASE_H */
112