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