13d0407baSopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 23d0407baSopenharmony_ci#ifndef _LINUX_SCHED_H 33d0407baSopenharmony_ci#define _LINUX_SCHED_H 43d0407baSopenharmony_ci 53d0407baSopenharmony_ci/* 63d0407baSopenharmony_ci * Define 'struct task_struct' and provide the main scheduler 73d0407baSopenharmony_ci * APIs (schedule(), wakeup variants, etc.) 83d0407baSopenharmony_ci */ 93d0407baSopenharmony_ci 103d0407baSopenharmony_ci#include <uapi/linux/sched.h> 113d0407baSopenharmony_ci 123d0407baSopenharmony_ci#include <asm/current.h> 133d0407baSopenharmony_ci 143d0407baSopenharmony_ci#include <linux/pid.h> 153d0407baSopenharmony_ci#include <linux/sem.h> 163d0407baSopenharmony_ci#include <linux/shm.h> 173d0407baSopenharmony_ci#include <linux/kcov.h> 183d0407baSopenharmony_ci#include <linux/mutex.h> 193d0407baSopenharmony_ci#include <linux/plist.h> 203d0407baSopenharmony_ci#include <linux/hrtimer.h> 213d0407baSopenharmony_ci#include <linux/irqflags.h> 223d0407baSopenharmony_ci#include <linux/seccomp.h> 233d0407baSopenharmony_ci#include <linux/nodemask.h> 243d0407baSopenharmony_ci#include <linux/rcupdate.h> 253d0407baSopenharmony_ci#include <linux/refcount.h> 263d0407baSopenharmony_ci#include <linux/resource.h> 273d0407baSopenharmony_ci#include <linux/latencytop.h> 283d0407baSopenharmony_ci#include <linux/sched/prio.h> 293d0407baSopenharmony_ci#include <linux/sched/types.h> 303d0407baSopenharmony_ci#include <linux/signal_types.h> 313d0407baSopenharmony_ci#include <linux/mm_types_task.h> 323d0407baSopenharmony_ci#include <linux/task_io_accounting.h> 333d0407baSopenharmony_ci#include <linux/posix-timers.h> 343d0407baSopenharmony_ci#include <linux/rseq.h> 353d0407baSopenharmony_ci#include <linux/seqlock.h> 363d0407baSopenharmony_ci#include <linux/kcsan.h> 373d0407baSopenharmony_ci#include <linux/sched/rtg.h> 383d0407baSopenharmony_ci 393d0407baSopenharmony_ci/* task_struct member predeclarations (sorted alphabetically): */ 403d0407baSopenharmony_cistruct audit_context; 413d0407baSopenharmony_cistruct backing_dev_info; 423d0407baSopenharmony_cistruct bio_list; 433d0407baSopenharmony_cistruct blk_plug; 443d0407baSopenharmony_cistruct bpf_run_ctx; 453d0407baSopenharmony_cistruct capture_control; 463d0407baSopenharmony_cistruct cfs_rq; 473d0407baSopenharmony_cistruct fs_struct; 483d0407baSopenharmony_cistruct futex_pi_state; 493d0407baSopenharmony_cistruct io_context; 503d0407baSopenharmony_cistruct mempolicy; 513d0407baSopenharmony_cistruct nameidata; 523d0407baSopenharmony_cistruct nsproxy; 533d0407baSopenharmony_cistruct perf_event_context; 543d0407baSopenharmony_cistruct pid_namespace; 553d0407baSopenharmony_cistruct pipe_inode_info; 563d0407baSopenharmony_cistruct rcu_node; 573d0407baSopenharmony_ci#ifdef CONFIG_RECLAIM_ACCT 583d0407baSopenharmony_cistruct reclaim_acct; 593d0407baSopenharmony_ci#endif 603d0407baSopenharmony_cistruct reclaim_state; 613d0407baSopenharmony_cistruct robust_list_head; 623d0407baSopenharmony_cistruct root_domain; 633d0407baSopenharmony_cistruct rq; 643d0407baSopenharmony_cistruct sched_attr; 653d0407baSopenharmony_cistruct sched_param; 663d0407baSopenharmony_cistruct seq_file; 673d0407baSopenharmony_cistruct sighand_struct; 683d0407baSopenharmony_cistruct signal_struct; 693d0407baSopenharmony_cistruct task_delay_info; 703d0407baSopenharmony_cistruct task_group; 713d0407baSopenharmony_cistruct io_uring_task; 723d0407baSopenharmony_ci 733d0407baSopenharmony_ci/* 743d0407baSopenharmony_ci * Task state bitmask. NOTE! These bits are also 753d0407baSopenharmony_ci * encoded in fs/proc/array.c: get_task_state(). 763d0407baSopenharmony_ci * 773d0407baSopenharmony_ci * We have two separate sets of flags: task->state 783d0407baSopenharmony_ci * is about runnability, while task->exit_state are 793d0407baSopenharmony_ci * about the task exiting. Confusing, but this way 803d0407baSopenharmony_ci * modifying one set can't modify the other one by 813d0407baSopenharmony_ci * mistake. 823d0407baSopenharmony_ci */ 833d0407baSopenharmony_ci 843d0407baSopenharmony_ci/* Used in tsk->state: */ 853d0407baSopenharmony_ci#define TASK_RUNNING 0x0000 863d0407baSopenharmony_ci#define TASK_INTERRUPTIBLE 0x0001 873d0407baSopenharmony_ci#define TASK_UNINTERRUPTIBLE 0x0002 883d0407baSopenharmony_ci#define __TASK_STOPPED 0x0004 893d0407baSopenharmony_ci#define __TASK_TRACED 0x0008 903d0407baSopenharmony_ci/* Used in tsk->exit_state: */ 913d0407baSopenharmony_ci#define EXIT_DEAD 0x0010 923d0407baSopenharmony_ci#define EXIT_ZOMBIE 0x0020 933d0407baSopenharmony_ci#define EXIT_TRACE (EXIT_ZOMBIE | EXIT_DEAD) 943d0407baSopenharmony_ci/* Used in tsk->state again: */ 953d0407baSopenharmony_ci#define TASK_PARKED 0x0040 963d0407baSopenharmony_ci#define TASK_DEAD 0x0080 973d0407baSopenharmony_ci#define TASK_WAKEKILL 0x0100 983d0407baSopenharmony_ci#define TASK_WAKING 0x0200 993d0407baSopenharmony_ci#define TASK_NOLOAD 0x0400 1003d0407baSopenharmony_ci#define TASK_NEW 0x0800 1013d0407baSopenharmony_ci#define TASK_STATE_MAX 0x1000 1023d0407baSopenharmony_ci 1033d0407baSopenharmony_ci/* Convenience macros for the sake of set_current_state: */ 1043d0407baSopenharmony_ci#define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE) 1053d0407baSopenharmony_ci#define TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED) 1063d0407baSopenharmony_ci#define TASK_TRACED (TASK_WAKEKILL | __TASK_TRACED) 1073d0407baSopenharmony_ci 1083d0407baSopenharmony_ci#define TASK_IDLE (TASK_UNINTERRUPTIBLE | TASK_NOLOAD) 1093d0407baSopenharmony_ci 1103d0407baSopenharmony_ci/* Convenience macros for the sake of wake_up(): */ 1113d0407baSopenharmony_ci#define TASK_NORMAL (TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE) 1123d0407baSopenharmony_ci 1133d0407baSopenharmony_ci/* get_task_state(): */ 1143d0407baSopenharmony_ci#define TASK_REPORT \ 1153d0407baSopenharmony_ci (TASK_RUNNING | TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE | __TASK_STOPPED | __TASK_TRACED | EXIT_DEAD | \ 1163d0407baSopenharmony_ci EXIT_ZOMBIE | TASK_PARKED) 1173d0407baSopenharmony_ci 1183d0407baSopenharmony_ci#define task_is_traced(task) (((task)->state & __TASK_TRACED) != 0) 1193d0407baSopenharmony_ci 1203d0407baSopenharmony_ci#define task_is_stopped(task) (((task)->state & __TASK_STOPPED) != 0) 1213d0407baSopenharmony_ci 1223d0407baSopenharmony_ci#define task_is_stopped_or_traced(task) (((task)->state & (__TASK_STOPPED | __TASK_TRACED)) != 0) 1233d0407baSopenharmony_ci 1243d0407baSopenharmony_ci#ifdef CONFIG_DEBUG_ATOMIC_SLEEP 1253d0407baSopenharmony_ci 1263d0407baSopenharmony_ci/* 1273d0407baSopenharmony_ci * Special states are those that do not use the normal wait-loop pattern. See 1283d0407baSopenharmony_ci * the comment with set_special_state(). 1293d0407baSopenharmony_ci */ 1303d0407baSopenharmony_ci#define is_special_task_state(state) ((state) & (__TASK_STOPPED | __TASK_TRACED | TASK_PARKED | TASK_DEAD)) 1313d0407baSopenharmony_ci 1323d0407baSopenharmony_ci#define __set_current_state(state_value) \ 1333d0407baSopenharmony_ci do { \ 1343d0407baSopenharmony_ci WARN_ON_ONCE(is_special_task_state(state_value)); \ 1353d0407baSopenharmony_ci current->task_state_change = _THIS_IP_; \ 1363d0407baSopenharmony_ci current->state = (state_value); \ 1373d0407baSopenharmony_ci } while (0) 1383d0407baSopenharmony_ci 1393d0407baSopenharmony_ci#define set_current_state(state_value) \ 1403d0407baSopenharmony_ci do { \ 1413d0407baSopenharmony_ci WARN_ON_ONCE(is_special_task_state(state_value)); \ 1423d0407baSopenharmony_ci current->task_state_change = _THIS_IP_; \ 1433d0407baSopenharmony_ci smp_store_mb(current->state, (state_value)); \ 1443d0407baSopenharmony_ci } while (0) 1453d0407baSopenharmony_ci 1463d0407baSopenharmony_ci#define set_special_state(state_value) \ 1473d0407baSopenharmony_ci do { \ 1483d0407baSopenharmony_ci unsigned long flags; /* may shadow */ \ 1493d0407baSopenharmony_ci WARN_ON_ONCE(!is_special_task_state(state_value)); \ 1503d0407baSopenharmony_ci raw_spin_lock_irqsave(¤t->pi_lock, flags); \ 1513d0407baSopenharmony_ci current->task_state_change = _THIS_IP_; \ 1523d0407baSopenharmony_ci current->state = (state_value); \ 1533d0407baSopenharmony_ci raw_spin_unlock_irqrestore(¤t->pi_lock, flags); \ 1543d0407baSopenharmony_ci } while (0) 1553d0407baSopenharmony_ci#else 1563d0407baSopenharmony_ci/* 1573d0407baSopenharmony_ci * set_current_state() includes a barrier so that the write of current->state 1583d0407baSopenharmony_ci * is correctly serialised wrt the caller's subsequent test of whether to 1593d0407baSopenharmony_ci * actually sleep: 1603d0407baSopenharmony_ci * 1613d0407baSopenharmony_ci * for (;;) { 1623d0407baSopenharmony_ci * set_current_state(TASK_UNINTERRUPTIBLE); 1633d0407baSopenharmony_ci * if (CONDITION) 1643d0407baSopenharmony_ci * break; 1653d0407baSopenharmony_ci * 1663d0407baSopenharmony_ci * schedule(); 1673d0407baSopenharmony_ci * } 1683d0407baSopenharmony_ci * __set_current_state(TASK_RUNNING); 1693d0407baSopenharmony_ci * 1703d0407baSopenharmony_ci * If the caller does not need such serialisation (because, for instance, the 1713d0407baSopenharmony_ci * CONDITION test and condition change and wakeup are under the same lock) then 1723d0407baSopenharmony_ci * use __set_current_state(). 1733d0407baSopenharmony_ci * 1743d0407baSopenharmony_ci * The above is typically ordered against the wakeup, which does: 1753d0407baSopenharmony_ci * 1763d0407baSopenharmony_ci * CONDITION = 1; 1773d0407baSopenharmony_ci * wake_up_state(p, TASK_UNINTERRUPTIBLE); 1783d0407baSopenharmony_ci * 1793d0407baSopenharmony_ci * where wake_up_state()/try_to_wake_up() executes a full memory barrier before 1803d0407baSopenharmony_ci * accessing p->state. 1813d0407baSopenharmony_ci * 1823d0407baSopenharmony_ci * Wakeup will do: if (@state & p->state) p->state = TASK_RUNNING, that is, 1833d0407baSopenharmony_ci * once it observes the TASK_UNINTERRUPTIBLE store the waking CPU can issue a 1843d0407baSopenharmony_ci * TASK_RUNNING store which can collide with __set_current_state(TASK_RUNNING). 1853d0407baSopenharmony_ci * 1863d0407baSopenharmony_ci * However, with slightly different timing the wakeup TASK_RUNNING store can 1873d0407baSopenharmony_ci * also collide with the TASK_UNINTERRUPTIBLE store. Losing that store is not 1883d0407baSopenharmony_ci * a problem either because that will result in one extra go around the loop 1893d0407baSopenharmony_ci * and our @cond test will save the day. 1903d0407baSopenharmony_ci * 1913d0407baSopenharmony_ci * Also see the comments of try_to_wake_up(). 1923d0407baSopenharmony_ci */ 1933d0407baSopenharmony_ci#define __set_current_state(state_value) current->state = (state_value) 1943d0407baSopenharmony_ci 1953d0407baSopenharmony_ci#define set_current_state(state_value) smp_store_mb(current->state, (state_value)) 1963d0407baSopenharmony_ci 1973d0407baSopenharmony_ci/* 1983d0407baSopenharmony_ci * set_special_state() should be used for those states when the blocking task 1993d0407baSopenharmony_ci * can not use the regular condition based wait-loop. In that case we must 2003d0407baSopenharmony_ci * serialize against wakeups such that any possible in-flight TASK_RUNNING stores 2013d0407baSopenharmony_ci * will not collide with our state change. 2023d0407baSopenharmony_ci */ 2033d0407baSopenharmony_ci#define set_special_state(state_value) \ 2043d0407baSopenharmony_ci do { \ 2053d0407baSopenharmony_ci unsigned long flags; /* may shadow */ \ 2063d0407baSopenharmony_ci raw_spin_lock_irqsave(¤t->pi_lock, flags); \ 2073d0407baSopenharmony_ci current->state = (state_value); \ 2083d0407baSopenharmony_ci raw_spin_unlock_irqrestore(¤t->pi_lock, flags); \ 2093d0407baSopenharmony_ci } while (0) 2103d0407baSopenharmony_ci 2113d0407baSopenharmony_ci#endif 2123d0407baSopenharmony_ci 2133d0407baSopenharmony_ci/* Task command name length: */ 2143d0407baSopenharmony_ci#define TASK_COMM_LEN 16 2153d0407baSopenharmony_ci 2163d0407baSopenharmony_cienum task_event { 2173d0407baSopenharmony_ci PUT_PREV_TASK = 0, 2183d0407baSopenharmony_ci PICK_NEXT_TASK = 1, 2193d0407baSopenharmony_ci TASK_WAKE = 2, 2203d0407baSopenharmony_ci TASK_MIGRATE = 3, 2213d0407baSopenharmony_ci TASK_UPDATE = 4, 2223d0407baSopenharmony_ci IRQ_UPDATE = 5, 2233d0407baSopenharmony_ci}; 2243d0407baSopenharmony_ci 2253d0407baSopenharmony_ci/* Note: this need to be in sync with migrate_type_names array */ 2263d0407baSopenharmony_cienum migrate_types { 2273d0407baSopenharmony_ci GROUP_TO_RQ, 2283d0407baSopenharmony_ci RQ_TO_GROUP, 2293d0407baSopenharmony_ci}; 2303d0407baSopenharmony_ci 2313d0407baSopenharmony_ci#ifdef CONFIG_CPU_ISOLATION_OPT 2323d0407baSopenharmony_ciextern int sched_isolate_count(const cpumask_t *mask, bool include_offline); 2333d0407baSopenharmony_ciextern int sched_isolate_cpu(int cpu); 2343d0407baSopenharmony_ciextern int sched_unisolate_cpu(int cpu); 2353d0407baSopenharmony_ciextern int sched_unisolate_cpu_unlocked(int cpu); 2363d0407baSopenharmony_ci#else 2373d0407baSopenharmony_cistatic inline int sched_isolate_count(const cpumask_t *mask, bool include_offline) 2383d0407baSopenharmony_ci{ 2393d0407baSopenharmony_ci cpumask_t count_mask; 2403d0407baSopenharmony_ci 2413d0407baSopenharmony_ci if (include_offline) { 2423d0407baSopenharmony_ci cpumask_andnot(&count_mask, mask, cpu_online_mask); 2433d0407baSopenharmony_ci } else { 2443d0407baSopenharmony_ci return 0; 2453d0407baSopenharmony_ci } 2463d0407baSopenharmony_ci 2473d0407baSopenharmony_ci return cpumask_weight(&count_mask); 2483d0407baSopenharmony_ci} 2493d0407baSopenharmony_ci 2503d0407baSopenharmony_cistatic inline int sched_isolate_cpu(int cpu) 2513d0407baSopenharmony_ci{ 2523d0407baSopenharmony_ci return 0; 2533d0407baSopenharmony_ci} 2543d0407baSopenharmony_ci 2553d0407baSopenharmony_cistatic inline int sched_unisolate_cpu(int cpu) 2563d0407baSopenharmony_ci{ 2573d0407baSopenharmony_ci return 0; 2583d0407baSopenharmony_ci} 2593d0407baSopenharmony_ci 2603d0407baSopenharmony_cistatic inline int sched_unisolate_cpu_unlocked(int cpu) 2613d0407baSopenharmony_ci{ 2623d0407baSopenharmony_ci return 0; 2633d0407baSopenharmony_ci} 2643d0407baSopenharmony_ci#endif 2653d0407baSopenharmony_ci 2663d0407baSopenharmony_ciextern void scheduler_tick(void); 2673d0407baSopenharmony_ci 2683d0407baSopenharmony_ci#define MAX_SCHEDULE_TIMEOUT LONG_MAX 2693d0407baSopenharmony_ci 2703d0407baSopenharmony_ciextern long schedule_timeout(long timeout); 2713d0407baSopenharmony_ciextern long schedule_timeout_interruptible(long timeout); 2723d0407baSopenharmony_ciextern long schedule_timeout_killable(long timeout); 2733d0407baSopenharmony_ciextern long schedule_timeout_uninterruptible(long timeout); 2743d0407baSopenharmony_ciextern long schedule_timeout_idle(long timeout); 2753d0407baSopenharmony_ciasmlinkage void schedule(void); 2763d0407baSopenharmony_ciextern void schedule_preempt_disabled(void); 2773d0407baSopenharmony_ciasmlinkage void preempt_schedule_irq(void); 2783d0407baSopenharmony_ci 2793d0407baSopenharmony_ciextern int __must_check io_schedule_prepare(void); 2803d0407baSopenharmony_ciextern void io_schedule_finish(int token); 2813d0407baSopenharmony_ciextern long io_schedule_timeout(long timeout); 2823d0407baSopenharmony_ciextern void io_schedule(void); 2833d0407baSopenharmony_ci 2843d0407baSopenharmony_ci/** 2853d0407baSopenharmony_ci * struct prev_cputime - snapshot of system and user cputime 2863d0407baSopenharmony_ci * @utime: time spent in user mode 2873d0407baSopenharmony_ci * @stime: time spent in system mode 2883d0407baSopenharmony_ci * @lock: protects the above two fields 2893d0407baSopenharmony_ci * 2903d0407baSopenharmony_ci * Stores previous user/system time values such that we can guarantee 2913d0407baSopenharmony_ci * monotonicity. 2923d0407baSopenharmony_ci */ 2933d0407baSopenharmony_cistruct prev_cputime { 2943d0407baSopenharmony_ci#ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE 2953d0407baSopenharmony_ci u64 utime; 2963d0407baSopenharmony_ci u64 stime; 2973d0407baSopenharmony_ci raw_spinlock_t lock; 2983d0407baSopenharmony_ci#endif 2993d0407baSopenharmony_ci}; 3003d0407baSopenharmony_ci 3013d0407baSopenharmony_cienum vtime_state { 3023d0407baSopenharmony_ci /* Task is sleeping or running in a CPU with VTIME inactive: */ 3033d0407baSopenharmony_ci VTIME_INACTIVE = 0, 3043d0407baSopenharmony_ci /* Task is idle */ 3053d0407baSopenharmony_ci VTIME_IDLE, 3063d0407baSopenharmony_ci /* Task runs in kernelspace in a CPU with VTIME active: */ 3073d0407baSopenharmony_ci VTIME_SYS, 3083d0407baSopenharmony_ci /* Task runs in userspace in a CPU with VTIME active: */ 3093d0407baSopenharmony_ci VTIME_USER, 3103d0407baSopenharmony_ci /* Task runs as guests in a CPU with VTIME active: */ 3113d0407baSopenharmony_ci VTIME_GUEST, 3123d0407baSopenharmony_ci}; 3133d0407baSopenharmony_ci 3143d0407baSopenharmony_cistruct vtime { 3153d0407baSopenharmony_ci seqcount_t seqcount; 3163d0407baSopenharmony_ci unsigned long long starttime; 3173d0407baSopenharmony_ci enum vtime_state state; 3183d0407baSopenharmony_ci unsigned int cpu; 3193d0407baSopenharmony_ci u64 utime; 3203d0407baSopenharmony_ci u64 stime; 3213d0407baSopenharmony_ci u64 gtime; 3223d0407baSopenharmony_ci}; 3233d0407baSopenharmony_ci 3243d0407baSopenharmony_ci/* 3253d0407baSopenharmony_ci * Utilization clamp constraints. 3263d0407baSopenharmony_ci * @UCLAMP_MIN: Minimum utilization 3273d0407baSopenharmony_ci * @UCLAMP_MAX: Maximum utilization 3283d0407baSopenharmony_ci * @UCLAMP_CNT: Utilization clamp constraints count 3293d0407baSopenharmony_ci */ 3303d0407baSopenharmony_cienum uclamp_id { UCLAMP_MIN = 0, UCLAMP_MAX, UCLAMP_CNT }; 3313d0407baSopenharmony_ci 3323d0407baSopenharmony_ci#ifdef CONFIG_SMP 3333d0407baSopenharmony_ciextern struct root_domain def_root_domain; 3343d0407baSopenharmony_ciextern struct mutex sched_domains_mutex; 3353d0407baSopenharmony_ci#endif 3363d0407baSopenharmony_ci 3373d0407baSopenharmony_cistruct sched_info { 3383d0407baSopenharmony_ci#ifdef CONFIG_SCHED_INFO 3393d0407baSopenharmony_ci /* Cumulative counters: */ 3403d0407baSopenharmony_ci 3413d0407baSopenharmony_ci /* # of times we have run on this CPU: */ 3423d0407baSopenharmony_ci unsigned long pcount; 3433d0407baSopenharmony_ci 3443d0407baSopenharmony_ci /* Time spent waiting on a runqueue: */ 3453d0407baSopenharmony_ci unsigned long long run_delay; 3463d0407baSopenharmony_ci 3473d0407baSopenharmony_ci /* Timestamps: */ 3483d0407baSopenharmony_ci 3493d0407baSopenharmony_ci /* When did we last run on a CPU? */ 3503d0407baSopenharmony_ci unsigned long long last_arrival; 3513d0407baSopenharmony_ci 3523d0407baSopenharmony_ci /* When were we last queued to run? */ 3533d0407baSopenharmony_ci unsigned long long last_queued; 3543d0407baSopenharmony_ci 3553d0407baSopenharmony_ci#endif /* CONFIG_SCHED_INFO */ 3563d0407baSopenharmony_ci}; 3573d0407baSopenharmony_ci 3583d0407baSopenharmony_ci/* 3593d0407baSopenharmony_ci * Integer metrics need fixed point arithmetic, e.g., sched/fair 3603d0407baSopenharmony_ci * has a few: load, load_avg, util_avg, freq, and capacity. 3613d0407baSopenharmony_ci * 3623d0407baSopenharmony_ci * We define a basic fixed point arithmetic range, and then formalize 3633d0407baSopenharmony_ci * all these metrics based on that basic range. 3643d0407baSopenharmony_ci */ 3653d0407baSopenharmony_ci#define SCHED_FIXEDPOINT_SHIFT 10 3663d0407baSopenharmony_ci#define SCHED_FIXEDPOINT_SCALE (1L << SCHED_FIXEDPOINT_SHIFT) 3673d0407baSopenharmony_ci 3683d0407baSopenharmony_ci/* Increase resolution of cpu_capacity calculations */ 3693d0407baSopenharmony_ci#define SCHED_CAPACITY_SHIFT SCHED_FIXEDPOINT_SHIFT 3703d0407baSopenharmony_ci#define SCHED_CAPACITY_SCALE (1L << SCHED_CAPACITY_SHIFT) 3713d0407baSopenharmony_ci 3723d0407baSopenharmony_cistruct load_weight { 3733d0407baSopenharmony_ci unsigned long weight; 3743d0407baSopenharmony_ci u32 inv_weight; 3753d0407baSopenharmony_ci}; 3763d0407baSopenharmony_ci 3773d0407baSopenharmony_ci/** 3783d0407baSopenharmony_ci * struct util_est - Estimation utilization of FAIR tasks 3793d0407baSopenharmony_ci * @enqueued: instantaneous estimated utilization of a task/cpu 3803d0407baSopenharmony_ci * @ewma: the Exponential Weighted Moving Average (EWMA) 3813d0407baSopenharmony_ci * utilization of a task 3823d0407baSopenharmony_ci * 3833d0407baSopenharmony_ci * Support data structure to track an Exponential Weighted Moving Average 3843d0407baSopenharmony_ci * (EWMA) of a FAIR task's utilization. New samples are added to the moving 3853d0407baSopenharmony_ci * average each time a task completes an activation. Sample's weight is chosen 3863d0407baSopenharmony_ci * so that the EWMA will be relatively insensitive to transient changes to the 3873d0407baSopenharmony_ci * task's workload. 3883d0407baSopenharmony_ci * 3893d0407baSopenharmony_ci * The enqueued attribute has a slightly different meaning for tasks and cpus: 3903d0407baSopenharmony_ci * - task: the task's util_avg at last task dequeue time 3913d0407baSopenharmony_ci * - cfs_rq: the sum of util_est.enqueued for each RUNNABLE task on that CPU 3923d0407baSopenharmony_ci * Thus, the util_est.enqueued of a task represents the contribution on the 3933d0407baSopenharmony_ci * estimated utilization of the CPU where that task is currently enqueued. 3943d0407baSopenharmony_ci * 3953d0407baSopenharmony_ci * Only for tasks we track a moving average of the past instantaneous 3963d0407baSopenharmony_ci * estimated utilization. This allows to absorb sporadic drops in utilization 3973d0407baSopenharmony_ci * of an otherwise almost periodic task. 3983d0407baSopenharmony_ci * 3993d0407baSopenharmony_ci * The UTIL_AVG_UNCHANGED flag is used to synchronize util_est with util_avg 4003d0407baSopenharmony_ci * updates. When a task is dequeued, its util_est should not be updated if its 4013d0407baSopenharmony_ci * util_avg has not been updated in the meantime. 4023d0407baSopenharmony_ci * This information is mapped into the MSB bit of util_est.enqueued at dequeue 4033d0407baSopenharmony_ci * time. Since max value of util_est.enqueued for a task is 1024 (PELT util_avg 4043d0407baSopenharmony_ci * for a task) it is safe to use MSB. 4053d0407baSopenharmony_ci */ 4063d0407baSopenharmony_cistruct util_est { 4073d0407baSopenharmony_ci unsigned int enqueued; 4083d0407baSopenharmony_ci unsigned int ewma; 4093d0407baSopenharmony_ci#define UTIL_EST_WEIGHT_SHIFT 2 4103d0407baSopenharmony_ci#define UTIL_AVG_UNCHANGED 0x80000000 4113d0407baSopenharmony_ci} __attribute__((__aligned__(sizeof(u64)))); 4123d0407baSopenharmony_ci 4133d0407baSopenharmony_ci/* 4143d0407baSopenharmony_ci * The load/runnable/util_avg accumulates an infinite geometric series 4153d0407baSopenharmony_ci * (see __update_load_avg_cfs_rq() in kernel/sched/pelt.c). 4163d0407baSopenharmony_ci * 4173d0407baSopenharmony_ci * [load_avg definition] 4183d0407baSopenharmony_ci * 4193d0407baSopenharmony_ci * load_avg = runnable% * scale_load_down(load) 4203d0407baSopenharmony_ci * 4213d0407baSopenharmony_ci * [runnable_avg definition] 4223d0407baSopenharmony_ci * 4233d0407baSopenharmony_ci * runnable_avg = runnable% * SCHED_CAPACITY_SCALE 4243d0407baSopenharmony_ci * 4253d0407baSopenharmony_ci * [util_avg definition] 4263d0407baSopenharmony_ci * 4273d0407baSopenharmony_ci * util_avg = running% * SCHED_CAPACITY_SCALE 4283d0407baSopenharmony_ci * 4293d0407baSopenharmony_ci * where runnable% is the time ratio that a sched_entity is runnable and 4303d0407baSopenharmony_ci * running% the time ratio that a sched_entity is running. 4313d0407baSopenharmony_ci * 4323d0407baSopenharmony_ci * For cfs_rq, they are the aggregated values of all runnable and blocked 4333d0407baSopenharmony_ci * sched_entities. 4343d0407baSopenharmony_ci * 4353d0407baSopenharmony_ci * The load/runnable/util_avg doesn't directly factor frequency scaling and CPU 4363d0407baSopenharmony_ci * capacity scaling. The scaling is done through the rq_clock_pelt that is used 4373d0407baSopenharmony_ci * for computing those signals (see update_rq_clock_pelt()) 4383d0407baSopenharmony_ci * 4393d0407baSopenharmony_ci * N.B., the above ratios (runnable% and running%) themselves are in the 4403d0407baSopenharmony_ci * range of [0, 1]. To do fixed point arithmetics, we therefore scale them 4413d0407baSopenharmony_ci * to as large a range as necessary. This is for example reflected by 4423d0407baSopenharmony_ci * util_avg's SCHED_CAPACITY_SCALE. 4433d0407baSopenharmony_ci * 4443d0407baSopenharmony_ci * [Overflow issue] 4453d0407baSopenharmony_ci * 4463d0407baSopenharmony_ci * The 64-bit load_sum can have 4353082796 (=2^64/47742/88761) entities 4473d0407baSopenharmony_ci * with the highest load (=88761), always runnable on a single cfs_rq, 4483d0407baSopenharmony_ci * and should not overflow as the number already hits PID_MAX_LIMIT. 4493d0407baSopenharmony_ci * 4503d0407baSopenharmony_ci * For all other cases (including 32-bit kernels), struct load_weight's 4513d0407baSopenharmony_ci * weight will overflow first before we do, because: 4523d0407baSopenharmony_ci * 4533d0407baSopenharmony_ci * Max(load_avg) <= Max(load.weight) 4543d0407baSopenharmony_ci * 4553d0407baSopenharmony_ci * Then it is the load_weight's responsibility to consider overflow 4563d0407baSopenharmony_ci * issues. 4573d0407baSopenharmony_ci */ 4583d0407baSopenharmony_cistruct sched_avg { 4593d0407baSopenharmony_ci u64 last_update_time; 4603d0407baSopenharmony_ci u64 load_sum; 4613d0407baSopenharmony_ci u64 runnable_sum; 4623d0407baSopenharmony_ci u32 util_sum; 4633d0407baSopenharmony_ci u32 period_contrib; 4643d0407baSopenharmony_ci unsigned long load_avg; 4653d0407baSopenharmony_ci unsigned long runnable_avg; 4663d0407baSopenharmony_ci unsigned long util_avg; 4673d0407baSopenharmony_ci struct util_est util_est; 4683d0407baSopenharmony_ci} ____cacheline_aligned; 4693d0407baSopenharmony_ci 4703d0407baSopenharmony_cistruct sched_statistics { 4713d0407baSopenharmony_ci#ifdef CONFIG_SCHEDSTATS 4723d0407baSopenharmony_ci u64 wait_start; 4733d0407baSopenharmony_ci u64 wait_max; 4743d0407baSopenharmony_ci u64 wait_count; 4753d0407baSopenharmony_ci u64 wait_sum; 4763d0407baSopenharmony_ci u64 iowait_count; 4773d0407baSopenharmony_ci u64 iowait_sum; 4783d0407baSopenharmony_ci 4793d0407baSopenharmony_ci u64 sleep_start; 4803d0407baSopenharmony_ci u64 sleep_max; 4813d0407baSopenharmony_ci s64 sum_sleep_runtime; 4823d0407baSopenharmony_ci 4833d0407baSopenharmony_ci u64 block_start; 4843d0407baSopenharmony_ci u64 block_max; 4853d0407baSopenharmony_ci u64 exec_max; 4863d0407baSopenharmony_ci u64 slice_max; 4873d0407baSopenharmony_ci 4883d0407baSopenharmony_ci u64 nr_migrations_cold; 4893d0407baSopenharmony_ci u64 nr_failed_migrations_affine; 4903d0407baSopenharmony_ci u64 nr_failed_migrations_running; 4913d0407baSopenharmony_ci u64 nr_failed_migrations_hot; 4923d0407baSopenharmony_ci u64 nr_forced_migrations; 4933d0407baSopenharmony_ci 4943d0407baSopenharmony_ci u64 nr_wakeups; 4953d0407baSopenharmony_ci u64 nr_wakeups_sync; 4963d0407baSopenharmony_ci u64 nr_wakeups_migrate; 4973d0407baSopenharmony_ci u64 nr_wakeups_local; 4983d0407baSopenharmony_ci u64 nr_wakeups_remote; 4993d0407baSopenharmony_ci u64 nr_wakeups_affine; 5003d0407baSopenharmony_ci u64 nr_wakeups_affine_attempts; 5013d0407baSopenharmony_ci u64 nr_wakeups_passive; 5023d0407baSopenharmony_ci u64 nr_wakeups_idle; 5033d0407baSopenharmony_ci#endif 5043d0407baSopenharmony_ci}; 5053d0407baSopenharmony_ci 5063d0407baSopenharmony_cistruct sched_entity { 5073d0407baSopenharmony_ci /* For load-balancing: */ 5083d0407baSopenharmony_ci struct load_weight load; 5093d0407baSopenharmony_ci struct rb_node run_node; 5103d0407baSopenharmony_ci struct list_head group_node; 5113d0407baSopenharmony_ci unsigned int on_rq; 5123d0407baSopenharmony_ci 5133d0407baSopenharmony_ci u64 exec_start; 5143d0407baSopenharmony_ci u64 sum_exec_runtime; 5153d0407baSopenharmony_ci u64 vruntime; 5163d0407baSopenharmony_ci u64 prev_sum_exec_runtime; 5173d0407baSopenharmony_ci 5183d0407baSopenharmony_ci u64 nr_migrations; 5193d0407baSopenharmony_ci 5203d0407baSopenharmony_ci struct sched_statistics statistics; 5213d0407baSopenharmony_ci 5223d0407baSopenharmony_ci#ifdef CONFIG_FAIR_GROUP_SCHED 5233d0407baSopenharmony_ci int depth; 5243d0407baSopenharmony_ci struct sched_entity *parent; 5253d0407baSopenharmony_ci /* rq on which this entity is (to be) queued: */ 5263d0407baSopenharmony_ci struct cfs_rq *cfs_rq; 5273d0407baSopenharmony_ci /* rq "owned" by this entity/group: */ 5283d0407baSopenharmony_ci struct cfs_rq *my_q; 5293d0407baSopenharmony_ci /* cached value of my_q->h_nr_running */ 5303d0407baSopenharmony_ci unsigned long runnable_weight; 5313d0407baSopenharmony_ci#endif 5323d0407baSopenharmony_ci 5333d0407baSopenharmony_ci#ifdef CONFIG_SCHED_LATENCY_NICE 5343d0407baSopenharmony_ci int latency_weight; 5353d0407baSopenharmony_ci#endif 5363d0407baSopenharmony_ci#ifdef CONFIG_SMP 5373d0407baSopenharmony_ci /* 5383d0407baSopenharmony_ci * Per entity load average tracking. 5393d0407baSopenharmony_ci * 5403d0407baSopenharmony_ci * Put into separate cache line so it does not 5413d0407baSopenharmony_ci * collide with read-mostly values above. 5423d0407baSopenharmony_ci */ 5433d0407baSopenharmony_ci struct sched_avg avg; 5443d0407baSopenharmony_ci#endif 5453d0407baSopenharmony_ci}; 5463d0407baSopenharmony_ci 5473d0407baSopenharmony_ci#ifdef CONFIG_SCHED_WALT 5483d0407baSopenharmony_ciextern void sched_exit(struct task_struct *p); 5493d0407baSopenharmony_ciextern int sched_set_init_task_load(struct task_struct *p, int init_load_pct); 5503d0407baSopenharmony_ciextern u32 sched_get_init_task_load(struct task_struct *p); 5513d0407baSopenharmony_ciextern void free_task_load_ptrs(struct task_struct *p); 5523d0407baSopenharmony_ci#define RAVG_HIST_SIZE_MAX 5 5533d0407baSopenharmony_cistruct ravg { 5543d0407baSopenharmony_ci /* 5553d0407baSopenharmony_ci * 'mark_start' marks the beginning of an event (task waking up, task 5563d0407baSopenharmony_ci * starting to execute, task being preempted) within a window 5573d0407baSopenharmony_ci * 5583d0407baSopenharmony_ci * 'sum' represents how runnable a task has been within current 5593d0407baSopenharmony_ci * window. It incorporates both running time and wait time and is 5603d0407baSopenharmony_ci * frequency scaled. 5613d0407baSopenharmony_ci * 5623d0407baSopenharmony_ci * 'sum_history' keeps track of history of 'sum' seen over previous 5633d0407baSopenharmony_ci * RAVG_HIST_SIZE windows. Windows where task was entirely sleeping are 5643d0407baSopenharmony_ci * ignored. 5653d0407baSopenharmony_ci * 5663d0407baSopenharmony_ci * 'demand' represents maximum sum seen over previous 5673d0407baSopenharmony_ci * sysctl_sched_ravg_hist_size windows. 'demand' could drive frequency 5683d0407baSopenharmony_ci * demand for tasks. 5693d0407baSopenharmony_ci * 5703d0407baSopenharmony_ci * 'curr_window_cpu' represents task's contribution to cpu busy time on 5713d0407baSopenharmony_ci * various CPUs in the current window 5723d0407baSopenharmony_ci * 5733d0407baSopenharmony_ci * 'prev_window_cpu' represents task's contribution to cpu busy time on 5743d0407baSopenharmony_ci * various CPUs in the previous window 5753d0407baSopenharmony_ci * 5763d0407baSopenharmony_ci * 'curr_window' represents the sum of all entries in curr_window_cpu 5773d0407baSopenharmony_ci * 5783d0407baSopenharmony_ci * 'prev_window' represents the sum of all entries in prev_window_cpu 5793d0407baSopenharmony_ci * 5803d0407baSopenharmony_ci */ 5813d0407baSopenharmony_ci u64 mark_start; 5823d0407baSopenharmony_ci u32 sum, demand; 5833d0407baSopenharmony_ci u32 sum_history[RAVG_HIST_SIZE_MAX]; 5843d0407baSopenharmony_ci u32 *curr_window_cpu, *prev_window_cpu; 5853d0407baSopenharmony_ci u32 curr_window, prev_window; 5863d0407baSopenharmony_ci u16 active_windows; 5873d0407baSopenharmony_ci u16 demand_scaled; 5883d0407baSopenharmony_ci}; 5893d0407baSopenharmony_ci#else 5903d0407baSopenharmony_cistatic inline void sched_exit(struct task_struct *p) 5913d0407baSopenharmony_ci{ 5923d0407baSopenharmony_ci} 5933d0407baSopenharmony_cistatic inline void free_task_load_ptrs(struct task_struct *p) 5943d0407baSopenharmony_ci{ 5953d0407baSopenharmony_ci} 5963d0407baSopenharmony_ci#endif /* CONFIG_SCHED_WALT */ 5973d0407baSopenharmony_ci 5983d0407baSopenharmony_cistruct sched_rt_entity { 5993d0407baSopenharmony_ci struct list_head run_list; 6003d0407baSopenharmony_ci unsigned long timeout; 6013d0407baSopenharmony_ci unsigned long watchdog_stamp; 6023d0407baSopenharmony_ci unsigned int time_slice; 6033d0407baSopenharmony_ci unsigned short on_rq; 6043d0407baSopenharmony_ci unsigned short on_list; 6053d0407baSopenharmony_ci 6063d0407baSopenharmony_ci struct sched_rt_entity *back; 6073d0407baSopenharmony_ci#ifdef CONFIG_RT_GROUP_SCHED 6083d0407baSopenharmony_ci struct sched_rt_entity *parent; 6093d0407baSopenharmony_ci /* rq on which this entity is (to be) queued: */ 6103d0407baSopenharmony_ci struct rt_rq *rt_rq; 6113d0407baSopenharmony_ci /* rq "owned" by this entity/group: */ 6123d0407baSopenharmony_ci struct rt_rq *my_q; 6133d0407baSopenharmony_ci#endif 6143d0407baSopenharmony_ci} __randomize_layout; 6153d0407baSopenharmony_ci 6163d0407baSopenharmony_cistruct sched_dl_entity { 6173d0407baSopenharmony_ci struct rb_node rb_node; 6183d0407baSopenharmony_ci 6193d0407baSopenharmony_ci /* 6203d0407baSopenharmony_ci * Original scheduling parameters. Copied here from sched_attr 6213d0407baSopenharmony_ci * during sched_setattr(), they will remain the same until 6223d0407baSopenharmony_ci * the next sched_setattr(). 6233d0407baSopenharmony_ci */ 6243d0407baSopenharmony_ci u64 dl_runtime; /* Maximum runtime for each instance */ 6253d0407baSopenharmony_ci u64 dl_deadline; /* Relative deadline of each instance */ 6263d0407baSopenharmony_ci u64 dl_period; /* Separation of two instances (period) */ 6273d0407baSopenharmony_ci u64 dl_bw; /* dl_runtime / dl_period */ 6283d0407baSopenharmony_ci u64 dl_density; /* dl_runtime / dl_deadline */ 6293d0407baSopenharmony_ci 6303d0407baSopenharmony_ci /* 6313d0407baSopenharmony_ci * Actual scheduling parameters. Initialized with the values above, 6323d0407baSopenharmony_ci * they are continuously updated during task execution. Note that 6333d0407baSopenharmony_ci * the remaining runtime could be < 0 in case we are in overrun. 6343d0407baSopenharmony_ci */ 6353d0407baSopenharmony_ci s64 runtime; /* Remaining runtime for this instance */ 6363d0407baSopenharmony_ci u64 deadline; /* Absolute deadline for this instance */ 6373d0407baSopenharmony_ci unsigned int flags; /* Specifying the scheduler behaviour */ 6383d0407baSopenharmony_ci 6393d0407baSopenharmony_ci /* 6403d0407baSopenharmony_ci * Some bool flags: 6413d0407baSopenharmony_ci * 6423d0407baSopenharmony_ci * @dl_throttled tells if we exhausted the runtime. If so, the 6433d0407baSopenharmony_ci * task has to wait for a replenishment to be performed at the 6443d0407baSopenharmony_ci * next firing of dl_timer. 6453d0407baSopenharmony_ci * 6463d0407baSopenharmony_ci * @dl_boosted tells if we are boosted due to DI. If so we are 6473d0407baSopenharmony_ci * outside bandwidth enforcement mechanism (but only until we 6483d0407baSopenharmony_ci * exit the critical section); 6493d0407baSopenharmony_ci * 6503d0407baSopenharmony_ci * @dl_yielded tells if task gave up the CPU before consuming 6513d0407baSopenharmony_ci * all its available runtime during the last job. 6523d0407baSopenharmony_ci * 6533d0407baSopenharmony_ci * @dl_non_contending tells if the task is inactive while still 6543d0407baSopenharmony_ci * contributing to the active utilization. In other words, it 6553d0407baSopenharmony_ci * indicates if the inactive timer has been armed and its handler 6563d0407baSopenharmony_ci * has not been executed yet. This flag is useful to avoid race 6573d0407baSopenharmony_ci * conditions between the inactive timer handler and the wakeup 6583d0407baSopenharmony_ci * code. 6593d0407baSopenharmony_ci * 6603d0407baSopenharmony_ci * @dl_overrun tells if the task asked to be informed about runtime 6613d0407baSopenharmony_ci * overruns. 6623d0407baSopenharmony_ci */ 6633d0407baSopenharmony_ci unsigned int dl_throttled : 1; 6643d0407baSopenharmony_ci unsigned int dl_yielded : 1; 6653d0407baSopenharmony_ci unsigned int dl_non_contending : 1; 6663d0407baSopenharmony_ci unsigned int dl_overrun : 1; 6673d0407baSopenharmony_ci 6683d0407baSopenharmony_ci /* 6693d0407baSopenharmony_ci * Bandwidth enforcement timer. Each -deadline task has its 6703d0407baSopenharmony_ci * own bandwidth to be enforced, thus we need one timer per task. 6713d0407baSopenharmony_ci */ 6723d0407baSopenharmony_ci struct hrtimer dl_timer; 6733d0407baSopenharmony_ci 6743d0407baSopenharmony_ci /* 6753d0407baSopenharmony_ci * Inactive timer, responsible for decreasing the active utilization 6763d0407baSopenharmony_ci * at the "0-lag time". When a -deadline task blocks, it contributes 6773d0407baSopenharmony_ci * to GRUB's active utilization until the "0-lag time", hence a 6783d0407baSopenharmony_ci * timer is needed to decrease the active utilization at the correct 6793d0407baSopenharmony_ci * time. 6803d0407baSopenharmony_ci */ 6813d0407baSopenharmony_ci struct hrtimer inactive_timer; 6823d0407baSopenharmony_ci 6833d0407baSopenharmony_ci#ifdef CONFIG_RT_MUTEXES 6843d0407baSopenharmony_ci /* 6853d0407baSopenharmony_ci * Priority Inheritance. When a DEADLINE scheduling entity is boosted 6863d0407baSopenharmony_ci * pi_se points to the donor, otherwise points to the dl_se it belongs 6873d0407baSopenharmony_ci * to (the original one/itself). 6883d0407baSopenharmony_ci */ 6893d0407baSopenharmony_ci struct sched_dl_entity *pi_se; 6903d0407baSopenharmony_ci#endif 6913d0407baSopenharmony_ci}; 6923d0407baSopenharmony_ci 6933d0407baSopenharmony_ci#ifdef CONFIG_UCLAMP_TASK 6943d0407baSopenharmony_ci/* Number of utilization clamp buckets (shorter alias) */ 6953d0407baSopenharmony_ci#define UCLAMP_BUCKETS CONFIG_UCLAMP_BUCKETS_COUNT 6963d0407baSopenharmony_ci 6973d0407baSopenharmony_ci/* 6983d0407baSopenharmony_ci * Utilization clamp for a scheduling entity 6993d0407baSopenharmony_ci * @value: clamp value "assigned" to a se 7003d0407baSopenharmony_ci * @bucket_id: bucket index corresponding to the "assigned" value 7013d0407baSopenharmony_ci * @active: the se is currently refcounted in a rq's bucket 7023d0407baSopenharmony_ci * @user_defined: the requested clamp value comes from user-space 7033d0407baSopenharmony_ci * 7043d0407baSopenharmony_ci * The bucket_id is the index of the clamp bucket matching the clamp value 7053d0407baSopenharmony_ci * which is pre-computed and stored to avoid expensive integer divisions from 7063d0407baSopenharmony_ci * the fast path. 7073d0407baSopenharmony_ci * 7083d0407baSopenharmony_ci * The active bit is set whenever a task has got an "effective" value assigned, 7093d0407baSopenharmony_ci * which can be different from the clamp value "requested" from user-space. 7103d0407baSopenharmony_ci * This allows to know a task is refcounted in the rq's bucket corresponding 7113d0407baSopenharmony_ci * to the "effective" bucket_id. 7123d0407baSopenharmony_ci * 7133d0407baSopenharmony_ci * The user_defined bit is set whenever a task has got a task-specific clamp 7143d0407baSopenharmony_ci * value requested from userspace, i.e. the system defaults apply to this task 7153d0407baSopenharmony_ci * just as a restriction. This allows to relax default clamps when a less 7163d0407baSopenharmony_ci * restrictive task-specific value has been requested, thus allowing to 7173d0407baSopenharmony_ci * implement a "nice" semantic. For example, a task running with a 20% 7183d0407baSopenharmony_ci * default boost can still drop its own boosting to 0%. 7193d0407baSopenharmony_ci */ 7203d0407baSopenharmony_cistruct uclamp_se { 7213d0407baSopenharmony_ci unsigned int value : bits_per(SCHED_CAPACITY_SCALE); 7223d0407baSopenharmony_ci unsigned int bucket_id : bits_per(UCLAMP_BUCKETS); 7233d0407baSopenharmony_ci unsigned int active : 1; 7243d0407baSopenharmony_ci unsigned int user_defined : 1; 7253d0407baSopenharmony_ci}; 7263d0407baSopenharmony_ci#endif /* CONFIG_UCLAMP_TASK */ 7273d0407baSopenharmony_ci 7283d0407baSopenharmony_ciunion rcu_special { 7293d0407baSopenharmony_ci struct { 7303d0407baSopenharmony_ci u8 blocked; 7313d0407baSopenharmony_ci u8 need_qs; 7323d0407baSopenharmony_ci u8 exp_hint; /* Hint for performance. */ 7333d0407baSopenharmony_ci u8 need_mb; /* Readers need smp_mb(). */ 7343d0407baSopenharmony_ci } b; /* Bits. */ 7353d0407baSopenharmony_ci u32 s; /* Set of bits. */ 7363d0407baSopenharmony_ci}; 7373d0407baSopenharmony_ci 7383d0407baSopenharmony_cienum perf_event_task_context { 7393d0407baSopenharmony_ci perf_invalid_context = -1, 7403d0407baSopenharmony_ci perf_hw_context = 0, 7413d0407baSopenharmony_ci perf_sw_context, 7423d0407baSopenharmony_ci perf_nr_task_contexts, 7433d0407baSopenharmony_ci}; 7443d0407baSopenharmony_ci 7453d0407baSopenharmony_cistruct wake_q_node { 7463d0407baSopenharmony_ci struct wake_q_node *next; 7473d0407baSopenharmony_ci}; 7483d0407baSopenharmony_ci 7493d0407baSopenharmony_cistruct task_struct { 7503d0407baSopenharmony_ci#ifdef CONFIG_THREAD_INFO_IN_TASK 7513d0407baSopenharmony_ci /* 7523d0407baSopenharmony_ci * For reasons of header soup (see current_thread_info()), this 7533d0407baSopenharmony_ci * must be the first element of task_struct. 7543d0407baSopenharmony_ci */ 7553d0407baSopenharmony_ci struct thread_info thread_info; 7563d0407baSopenharmony_ci#endif 7573d0407baSopenharmony_ci /* -1 unrunnable, 0 runnable, >0 stopped: */ 7583d0407baSopenharmony_ci volatile long state; 7593d0407baSopenharmony_ci 7603d0407baSopenharmony_ci /* 7613d0407baSopenharmony_ci * This begins the randomizable portion of task_struct. Only 7623d0407baSopenharmony_ci * scheduling-critical items should be added above here. 7633d0407baSopenharmony_ci */ 7643d0407baSopenharmony_ci randomized_struct_fields_start 7653d0407baSopenharmony_ci 7663d0407baSopenharmony_ci void *stack; 7673d0407baSopenharmony_ci refcount_t usage; 7683d0407baSopenharmony_ci /* Per task flags (PF_*), defined further below: */ 7693d0407baSopenharmony_ci unsigned int flags; 7703d0407baSopenharmony_ci unsigned int ptrace; 7713d0407baSopenharmony_ci 7723d0407baSopenharmony_ci#ifdef CONFIG_SMP 7733d0407baSopenharmony_ci int on_cpu; 7743d0407baSopenharmony_ci struct __call_single_node wake_entry; 7753d0407baSopenharmony_ci#ifdef CONFIG_THREAD_INFO_IN_TASK 7763d0407baSopenharmony_ci /* Current CPU: */ 7773d0407baSopenharmony_ci unsigned int cpu; 7783d0407baSopenharmony_ci#endif 7793d0407baSopenharmony_ci unsigned int wakee_flips; 7803d0407baSopenharmony_ci unsigned long wakee_flip_decay_ts; 7813d0407baSopenharmony_ci struct task_struct *last_wakee; 7823d0407baSopenharmony_ci 7833d0407baSopenharmony_ci /* 7843d0407baSopenharmony_ci * recent_used_cpu is initially set as the last CPU used by a task 7853d0407baSopenharmony_ci * that wakes affine another task. Waker/wakee relationships can 7863d0407baSopenharmony_ci * push tasks around a CPU where each wakeup moves to the next one. 7873d0407baSopenharmony_ci * Tracking a recently used CPU allows a quick search for a recently 7883d0407baSopenharmony_ci * used CPU that may be idle. 7893d0407baSopenharmony_ci */ 7903d0407baSopenharmony_ci int recent_used_cpu; 7913d0407baSopenharmony_ci int wake_cpu; 7923d0407baSopenharmony_ci#endif 7933d0407baSopenharmony_ci int on_rq; 7943d0407baSopenharmony_ci 7953d0407baSopenharmony_ci int prio; 7963d0407baSopenharmony_ci int static_prio; 7973d0407baSopenharmony_ci int normal_prio; 7983d0407baSopenharmony_ci unsigned int rt_priority; 7993d0407baSopenharmony_ci#ifdef CONFIG_SCHED_LATENCY_NICE 8003d0407baSopenharmony_ci int latency_prio; 8013d0407baSopenharmony_ci#endif 8023d0407baSopenharmony_ci 8033d0407baSopenharmony_ci const struct sched_class *sched_class; 8043d0407baSopenharmony_ci struct sched_entity se; 8053d0407baSopenharmony_ci struct sched_rt_entity rt; 8063d0407baSopenharmony_ci#ifdef CONFIG_SCHED_WALT 8073d0407baSopenharmony_ci struct ravg ravg; 8083d0407baSopenharmony_ci /* 8093d0407baSopenharmony_ci * 'init_load_pct' represents the initial task load assigned to children 8103d0407baSopenharmony_ci * of this task 8113d0407baSopenharmony_ci */ 8123d0407baSopenharmony_ci u32 init_load_pct; 8133d0407baSopenharmony_ci u64 last_sleep_ts; 8143d0407baSopenharmony_ci#endif 8153d0407baSopenharmony_ci 8163d0407baSopenharmony_ci#ifdef CONFIG_SCHED_RTG 8173d0407baSopenharmony_ci int rtg_depth; 8183d0407baSopenharmony_ci struct related_thread_group *grp; 8193d0407baSopenharmony_ci struct list_head grp_list; 8203d0407baSopenharmony_ci#endif 8213d0407baSopenharmony_ci 8223d0407baSopenharmony_ci#ifdef CONFIG_CGROUP_SCHED 8233d0407baSopenharmony_ci struct task_group *sched_task_group; 8243d0407baSopenharmony_ci#endif 8253d0407baSopenharmony_ci struct sched_dl_entity dl; 8263d0407baSopenharmony_ci 8273d0407baSopenharmony_ci#ifdef CONFIG_UCLAMP_TASK 8283d0407baSopenharmony_ci /* 8293d0407baSopenharmony_ci * Clamp values requested for a scheduling entity. 8303d0407baSopenharmony_ci * Must be updated with task_rq_lock() held. 8313d0407baSopenharmony_ci */ 8323d0407baSopenharmony_ci struct uclamp_se uclamp_req[UCLAMP_CNT]; 8333d0407baSopenharmony_ci /* 8343d0407baSopenharmony_ci * Effective clamp values used for a scheduling entity. 8353d0407baSopenharmony_ci * Must be updated with task_rq_lock() held. 8363d0407baSopenharmony_ci */ 8373d0407baSopenharmony_ci struct uclamp_se uclamp[UCLAMP_CNT]; 8383d0407baSopenharmony_ci#endif 8393d0407baSopenharmony_ci 8403d0407baSopenharmony_ci#ifdef CONFIG_PREEMPT_NOTIFIERS 8413d0407baSopenharmony_ci /* List of struct preempt_notifier: */ 8423d0407baSopenharmony_ci struct hlist_head preempt_notifiers; 8433d0407baSopenharmony_ci#endif 8443d0407baSopenharmony_ci 8453d0407baSopenharmony_ci#ifdef CONFIG_BLK_DEV_IO_TRACE 8463d0407baSopenharmony_ci unsigned int btrace_seq; 8473d0407baSopenharmony_ci#endif 8483d0407baSopenharmony_ci 8493d0407baSopenharmony_ci unsigned int policy; 8503d0407baSopenharmony_ci int nr_cpus_allowed; 8513d0407baSopenharmony_ci const cpumask_t *cpus_ptr; 8523d0407baSopenharmony_ci cpumask_t cpus_mask; 8533d0407baSopenharmony_ci 8543d0407baSopenharmony_ci#ifdef CONFIG_PREEMPT_RCU 8553d0407baSopenharmony_ci int rcu_read_lock_nesting; 8563d0407baSopenharmony_ci union rcu_special rcu_read_unlock_special; 8573d0407baSopenharmony_ci struct list_head rcu_node_entry; 8583d0407baSopenharmony_ci struct rcu_node *rcu_blocked_node; 8593d0407baSopenharmony_ci#endif /* #ifdef CONFIG_PREEMPT_RCU */ 8603d0407baSopenharmony_ci 8613d0407baSopenharmony_ci#ifdef CONFIG_TASKS_RCU 8623d0407baSopenharmony_ci unsigned long rcu_tasks_nvcsw; 8633d0407baSopenharmony_ci u8 rcu_tasks_holdout; 8643d0407baSopenharmony_ci u8 rcu_tasks_idx; 8653d0407baSopenharmony_ci int rcu_tasks_idle_cpu; 8663d0407baSopenharmony_ci struct list_head rcu_tasks_holdout_list; 8673d0407baSopenharmony_ci#endif /* #ifdef CONFIG_TASKS_RCU */ 8683d0407baSopenharmony_ci 8693d0407baSopenharmony_ci#ifdef CONFIG_TASKS_TRACE_RCU 8703d0407baSopenharmony_ci int trc_reader_nesting; 8713d0407baSopenharmony_ci int trc_ipi_to_cpu; 8723d0407baSopenharmony_ci union rcu_special trc_reader_special; 8733d0407baSopenharmony_ci bool trc_reader_checked; 8743d0407baSopenharmony_ci struct list_head trc_holdout_list; 8753d0407baSopenharmony_ci#endif /* #ifdef CONFIG_TASKS_TRACE_RCU */ 8763d0407baSopenharmony_ci 8773d0407baSopenharmony_ci struct sched_info sched_info; 8783d0407baSopenharmony_ci 8793d0407baSopenharmony_ci struct list_head tasks; 8803d0407baSopenharmony_ci#ifdef CONFIG_SMP 8813d0407baSopenharmony_ci struct plist_node pushable_tasks; 8823d0407baSopenharmony_ci struct rb_node pushable_dl_tasks; 8833d0407baSopenharmony_ci#endif 8843d0407baSopenharmony_ci 8853d0407baSopenharmony_ci struct mm_struct *mm; 8863d0407baSopenharmony_ci struct mm_struct *active_mm; 8873d0407baSopenharmony_ci 8883d0407baSopenharmony_ci /* Per-thread vma caching: */ 8893d0407baSopenharmony_ci struct vmacache vmacache; 8903d0407baSopenharmony_ci 8913d0407baSopenharmony_ci#ifdef SPLIT_RSS_COUNTING 8923d0407baSopenharmony_ci struct task_rss_stat rss_stat; 8933d0407baSopenharmony_ci#endif 8943d0407baSopenharmony_ci int exit_state; 8953d0407baSopenharmony_ci int exit_code; 8963d0407baSopenharmony_ci int exit_signal; 8973d0407baSopenharmony_ci /* The signal sent when the parent dies: */ 8983d0407baSopenharmony_ci int pdeath_signal; 8993d0407baSopenharmony_ci /* JOBCTL_*, siglock protected: */ 9003d0407baSopenharmony_ci unsigned long jobctl; 9013d0407baSopenharmony_ci 9023d0407baSopenharmony_ci /* Used for emulating ABI behavior of previous Linux versions: */ 9033d0407baSopenharmony_ci unsigned int personality; 9043d0407baSopenharmony_ci 9053d0407baSopenharmony_ci /* Scheduler bits, serialized by scheduler locks: */ 9063d0407baSopenharmony_ci unsigned sched_reset_on_fork : 1; 9073d0407baSopenharmony_ci unsigned sched_contributes_to_load : 1; 9083d0407baSopenharmony_ci unsigned sched_migrated : 1; 9093d0407baSopenharmony_ci#ifdef CONFIG_PSI 9103d0407baSopenharmony_ci unsigned sched_psi_wake_requeue : 1; 9113d0407baSopenharmony_ci#endif 9123d0407baSopenharmony_ci 9133d0407baSopenharmony_ci /* Force alignment to the next boundary: */ 9143d0407baSopenharmony_ci unsigned : 0; 9153d0407baSopenharmony_ci 9163d0407baSopenharmony_ci /* Unserialized, strictly 'current' */ 9173d0407baSopenharmony_ci 9183d0407baSopenharmony_ci /* 9193d0407baSopenharmony_ci * This field must not be in the scheduler word above due to wakelist 9203d0407baSopenharmony_ci * queueing no longer being serialized by p->on_cpu. However: 9213d0407baSopenharmony_ci * 9223d0407baSopenharmony_ci * p->XXX = X; ttwu() 9233d0407baSopenharmony_ci * schedule() if (p->on_rq && ..) // false 9243d0407baSopenharmony_ci * smp_mb__after_spinlock(); if (smp_load_acquire(&p->on_cpu) && //true 9253d0407baSopenharmony_ci * deactivate_task() ttwu_queue_wakelist()) 9263d0407baSopenharmony_ci * p->on_rq = 0; p->sched_remote_wakeup = Y; 9273d0407baSopenharmony_ci * 9283d0407baSopenharmony_ci * guarantees all stores of 'current' are visible before 9293d0407baSopenharmony_ci * ->sched_remote_wakeup gets used, so it can be in this word. 9303d0407baSopenharmony_ci */ 9313d0407baSopenharmony_ci unsigned sched_remote_wakeup : 1; 9323d0407baSopenharmony_ci 9333d0407baSopenharmony_ci /* Bit to tell LSMs we're in execve(): */ 9343d0407baSopenharmony_ci unsigned in_execve : 1; 9353d0407baSopenharmony_ci unsigned in_iowait : 1; 9363d0407baSopenharmony_ci#ifndef TIF_RESTORE_SIGMASK 9373d0407baSopenharmony_ci unsigned restore_sigmask : 1; 9383d0407baSopenharmony_ci#endif 9393d0407baSopenharmony_ci#ifdef CONFIG_MEMCG 9403d0407baSopenharmony_ci unsigned in_user_fault : 1; 9413d0407baSopenharmony_ci#endif 9423d0407baSopenharmony_ci#ifdef CONFIG_COMPAT_BRK 9433d0407baSopenharmony_ci unsigned brk_randomized : 1; 9443d0407baSopenharmony_ci#endif 9453d0407baSopenharmony_ci#ifdef CONFIG_CGROUPS 9463d0407baSopenharmony_ci /* disallow userland-initiated cgroup migration */ 9473d0407baSopenharmony_ci unsigned no_cgroup_migration : 1; 9483d0407baSopenharmony_ci /* task is frozen/stopped (used by the cgroup freezer) */ 9493d0407baSopenharmony_ci unsigned frozen : 1; 9503d0407baSopenharmony_ci#endif 9513d0407baSopenharmony_ci#ifdef CONFIG_BLK_CGROUP 9523d0407baSopenharmony_ci unsigned use_memdelay : 1; 9533d0407baSopenharmony_ci#endif 9543d0407baSopenharmony_ci#ifdef CONFIG_PSI 9553d0407baSopenharmony_ci /* Stalled due to lack of memory */ 9563d0407baSopenharmony_ci unsigned in_memstall : 1; 9573d0407baSopenharmony_ci#endif 9583d0407baSopenharmony_ci 9593d0407baSopenharmony_ci unsigned long atomic_flags; /* Flags requiring atomic access. */ 9603d0407baSopenharmony_ci 9613d0407baSopenharmony_ci struct restart_block restart_block; 9623d0407baSopenharmony_ci 9633d0407baSopenharmony_ci pid_t pid; 9643d0407baSopenharmony_ci pid_t tgid; 9653d0407baSopenharmony_ci 9663d0407baSopenharmony_ci#ifdef CONFIG_STACKPROTECTOR 9673d0407baSopenharmony_ci /* Canary value for the -fstack-protector GCC feature: */ 9683d0407baSopenharmony_ci unsigned long stack_canary; 9693d0407baSopenharmony_ci#endif 9703d0407baSopenharmony_ci /* 9713d0407baSopenharmony_ci * Pointers to the (original) parent process, youngest child, younger sibling, 9723d0407baSopenharmony_ci * older sibling, respectively. (p->father can be replaced with 9733d0407baSopenharmony_ci * p->real_parent->pid) 9743d0407baSopenharmony_ci */ 9753d0407baSopenharmony_ci 9763d0407baSopenharmony_ci /* Real parent process: */ 9773d0407baSopenharmony_ci struct task_struct __rcu *real_parent; 9783d0407baSopenharmony_ci 9793d0407baSopenharmony_ci /* Recipient of SIGCHLD, wait4() reports: */ 9803d0407baSopenharmony_ci struct task_struct __rcu *parent; 9813d0407baSopenharmony_ci 9823d0407baSopenharmony_ci /* 9833d0407baSopenharmony_ci * Children/sibling form the list of natural children: 9843d0407baSopenharmony_ci */ 9853d0407baSopenharmony_ci struct list_head children; 9863d0407baSopenharmony_ci struct list_head sibling; 9873d0407baSopenharmony_ci struct task_struct *group_leader; 9883d0407baSopenharmony_ci 9893d0407baSopenharmony_ci /* 9903d0407baSopenharmony_ci * 'ptraced' is the list of tasks this task is using ptrace() on. 9913d0407baSopenharmony_ci * 9923d0407baSopenharmony_ci * This includes both natural children and PTRACE_ATTACH targets. 9933d0407baSopenharmony_ci * 'ptrace_entry' is this task's link on the p->parent->ptraced list. 9943d0407baSopenharmony_ci */ 9953d0407baSopenharmony_ci struct list_head ptraced; 9963d0407baSopenharmony_ci struct list_head ptrace_entry; 9973d0407baSopenharmony_ci 9983d0407baSopenharmony_ci /* PID/PID hash table linkage. */ 9993d0407baSopenharmony_ci struct pid *thread_pid; 10003d0407baSopenharmony_ci struct hlist_node pid_links[PIDTYPE_MAX]; 10013d0407baSopenharmony_ci struct list_head thread_group; 10023d0407baSopenharmony_ci struct list_head thread_node; 10033d0407baSopenharmony_ci 10043d0407baSopenharmony_ci struct completion *vfork_done; 10053d0407baSopenharmony_ci 10063d0407baSopenharmony_ci /* CLONE_CHILD_SETTID: */ 10073d0407baSopenharmony_ci int __user *set_child_tid; 10083d0407baSopenharmony_ci 10093d0407baSopenharmony_ci /* CLONE_CHILD_CLEARTID: */ 10103d0407baSopenharmony_ci int __user *clear_child_tid; 10113d0407baSopenharmony_ci 10123d0407baSopenharmony_ci /* PF_IO_WORKER */ 10133d0407baSopenharmony_ci void *pf_io_worker; 10143d0407baSopenharmony_ci 10153d0407baSopenharmony_ci u64 utime; 10163d0407baSopenharmony_ci u64 stime; 10173d0407baSopenharmony_ci#ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME 10183d0407baSopenharmony_ci u64 utimescaled; 10193d0407baSopenharmony_ci u64 stimescaled; 10203d0407baSopenharmony_ci#endif 10213d0407baSopenharmony_ci u64 gtime; 10223d0407baSopenharmony_ci struct prev_cputime prev_cputime; 10233d0407baSopenharmony_ci#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN 10243d0407baSopenharmony_ci struct vtime vtime; 10253d0407baSopenharmony_ci#endif 10263d0407baSopenharmony_ci 10273d0407baSopenharmony_ci#ifdef CONFIG_NO_HZ_FULL 10283d0407baSopenharmony_ci atomic_t tick_dep_mask; 10293d0407baSopenharmony_ci#endif 10303d0407baSopenharmony_ci /* Context switch counts: */ 10313d0407baSopenharmony_ci unsigned long nvcsw; 10323d0407baSopenharmony_ci unsigned long nivcsw; 10333d0407baSopenharmony_ci 10343d0407baSopenharmony_ci /* Monotonic time in nsecs: */ 10353d0407baSopenharmony_ci u64 start_time; 10363d0407baSopenharmony_ci 10373d0407baSopenharmony_ci /* Boot based time in nsecs: */ 10383d0407baSopenharmony_ci u64 start_boottime; 10393d0407baSopenharmony_ci 10403d0407baSopenharmony_ci /* MM fault and swap info: this can arguably be seen as either mm-specific or thread-specific: */ 10413d0407baSopenharmony_ci unsigned long min_flt; 10423d0407baSopenharmony_ci unsigned long maj_flt; 10433d0407baSopenharmony_ci 10443d0407baSopenharmony_ci /* Empty if CONFIG_POSIX_CPUTIMERS=n */ 10453d0407baSopenharmony_ci struct posix_cputimers posix_cputimers; 10463d0407baSopenharmony_ci 10473d0407baSopenharmony_ci#ifdef CONFIG_POSIX_CPU_TIMERS_TASK_WORK 10483d0407baSopenharmony_ci struct posix_cputimers_work posix_cputimers_work; 10493d0407baSopenharmony_ci#endif 10503d0407baSopenharmony_ci 10513d0407baSopenharmony_ci /* Process credentials: */ 10523d0407baSopenharmony_ci 10533d0407baSopenharmony_ci /* Tracer's credentials at attach: */ 10543d0407baSopenharmony_ci const struct cred __rcu *ptracer_cred; 10553d0407baSopenharmony_ci 10563d0407baSopenharmony_ci /* Objective and real subjective task credentials (COW): */ 10573d0407baSopenharmony_ci const struct cred __rcu *real_cred; 10583d0407baSopenharmony_ci 10593d0407baSopenharmony_ci /* Effective (overridable) subjective task credentials (COW): */ 10603d0407baSopenharmony_ci const struct cred __rcu *cred; 10613d0407baSopenharmony_ci 10623d0407baSopenharmony_ci#ifdef CONFIG_KEYS 10633d0407baSopenharmony_ci /* Cached requested key. */ 10643d0407baSopenharmony_ci struct key *cached_requested_key; 10653d0407baSopenharmony_ci#endif 10663d0407baSopenharmony_ci 10673d0407baSopenharmony_ci /* 10683d0407baSopenharmony_ci * executable name, excluding path. 10693d0407baSopenharmony_ci * 10703d0407baSopenharmony_ci * - normally initialized setup_new_exec() 10713d0407baSopenharmony_ci * - access it with [gs]et_task_comm() 10723d0407baSopenharmony_ci * - lock it with task_lock() 10733d0407baSopenharmony_ci */ 10743d0407baSopenharmony_ci char comm[TASK_COMM_LEN]; 10753d0407baSopenharmony_ci 10763d0407baSopenharmony_ci struct nameidata *nameidata; 10773d0407baSopenharmony_ci 10783d0407baSopenharmony_ci#ifdef CONFIG_SYSVIPC 10793d0407baSopenharmony_ci struct sysv_sem sysvsem; 10803d0407baSopenharmony_ci struct sysv_shm sysvshm; 10813d0407baSopenharmony_ci#endif 10823d0407baSopenharmony_ci#ifdef CONFIG_DETECT_HUNG_TASK 10833d0407baSopenharmony_ci unsigned long last_switch_count; 10843d0407baSopenharmony_ci unsigned long last_switch_time; 10853d0407baSopenharmony_ci#endif 10863d0407baSopenharmony_ci /* Filesystem information: */ 10873d0407baSopenharmony_ci struct fs_struct *fs; 10883d0407baSopenharmony_ci 10893d0407baSopenharmony_ci /* Open file information: */ 10903d0407baSopenharmony_ci struct files_struct *files; 10913d0407baSopenharmony_ci 10923d0407baSopenharmony_ci#ifdef CONFIG_IO_URING 10933d0407baSopenharmony_ci struct io_uring_task *io_uring; 10943d0407baSopenharmony_ci#endif 10953d0407baSopenharmony_ci 10963d0407baSopenharmony_ci /* Namespaces: */ 10973d0407baSopenharmony_ci struct nsproxy *nsproxy; 10983d0407baSopenharmony_ci 10993d0407baSopenharmony_ci /* Signal handlers: */ 11003d0407baSopenharmony_ci struct signal_struct *signal; 11013d0407baSopenharmony_ci struct sighand_struct __rcu *sighand; 11023d0407baSopenharmony_ci sigset_t blocked; 11033d0407baSopenharmony_ci sigset_t real_blocked; 11043d0407baSopenharmony_ci /* Restored if set_restore_sigmask() was used: */ 11053d0407baSopenharmony_ci sigset_t saved_sigmask; 11063d0407baSopenharmony_ci struct sigpending pending; 11073d0407baSopenharmony_ci unsigned long sas_ss_sp; 11083d0407baSopenharmony_ci size_t sas_ss_size; 11093d0407baSopenharmony_ci unsigned int sas_ss_flags; 11103d0407baSopenharmony_ci 11113d0407baSopenharmony_ci struct callback_head *task_works; 11123d0407baSopenharmony_ci 11133d0407baSopenharmony_ci#ifdef CONFIG_AUDIT 11143d0407baSopenharmony_ci#ifdef CONFIG_AUDITSYSCALL 11153d0407baSopenharmony_ci struct audit_context *audit_context; 11163d0407baSopenharmony_ci#endif 11173d0407baSopenharmony_ci kuid_t loginuid; 11183d0407baSopenharmony_ci unsigned int sessionid; 11193d0407baSopenharmony_ci#endif 11203d0407baSopenharmony_ci struct seccomp seccomp; 11213d0407baSopenharmony_ci 11223d0407baSopenharmony_ci /* Thread group tracking: */ 11233d0407baSopenharmony_ci u64 parent_exec_id; 11243d0407baSopenharmony_ci u64 self_exec_id; 11253d0407baSopenharmony_ci 11263d0407baSopenharmony_ci /* Protection against (de-)allocation: mm, files, fs, tty, keyrings, mems_allowed, mempolicy: */ 11273d0407baSopenharmony_ci spinlock_t alloc_lock; 11283d0407baSopenharmony_ci 11293d0407baSopenharmony_ci /* Protection of the PI data structures: */ 11303d0407baSopenharmony_ci raw_spinlock_t pi_lock; 11313d0407baSopenharmony_ci 11323d0407baSopenharmony_ci struct wake_q_node wake_q; 11333d0407baSopenharmony_ci 11343d0407baSopenharmony_ci#ifdef CONFIG_RT_MUTEXES 11353d0407baSopenharmony_ci /* PI waiters blocked on a rt_mutex held by this task: */ 11363d0407baSopenharmony_ci struct rb_root_cached pi_waiters; 11373d0407baSopenharmony_ci /* Updated under owner's pi_lock and rq lock */ 11383d0407baSopenharmony_ci struct task_struct *pi_top_task; 11393d0407baSopenharmony_ci /* Deadlock detection and priority inheritance handling: */ 11403d0407baSopenharmony_ci struct rt_mutex_waiter *pi_blocked_on; 11413d0407baSopenharmony_ci#endif 11423d0407baSopenharmony_ci 11433d0407baSopenharmony_ci#ifdef CONFIG_DEBUG_MUTEXES 11443d0407baSopenharmony_ci /* Mutex deadlock detection: */ 11453d0407baSopenharmony_ci struct mutex_waiter *blocked_on; 11463d0407baSopenharmony_ci#endif 11473d0407baSopenharmony_ci 11483d0407baSopenharmony_ci#ifdef CONFIG_DEBUG_ATOMIC_SLEEP 11493d0407baSopenharmony_ci int non_block_count; 11503d0407baSopenharmony_ci#endif 11513d0407baSopenharmony_ci 11523d0407baSopenharmony_ci#ifdef CONFIG_TRACE_IRQFLAGS 11533d0407baSopenharmony_ci struct irqtrace_events irqtrace; 11543d0407baSopenharmony_ci unsigned int hardirq_threaded; 11553d0407baSopenharmony_ci u64 hardirq_chain_key; 11563d0407baSopenharmony_ci int softirqs_enabled; 11573d0407baSopenharmony_ci int softirq_context; 11583d0407baSopenharmony_ci int irq_config; 11593d0407baSopenharmony_ci#endif 11603d0407baSopenharmony_ci 11613d0407baSopenharmony_ci#ifdef CONFIG_LOCKDEP 11623d0407baSopenharmony_ci#define MAX_LOCK_DEPTH 48UL 11633d0407baSopenharmony_ci u64 curr_chain_key; 11643d0407baSopenharmony_ci int lockdep_depth; 11653d0407baSopenharmony_ci unsigned int lockdep_recursion; 11663d0407baSopenharmony_ci struct held_lock held_locks[MAX_LOCK_DEPTH]; 11673d0407baSopenharmony_ci#endif 11683d0407baSopenharmony_ci 11693d0407baSopenharmony_ci#if defined(CONFIG_UBSAN) && !defined(CONFIG_UBSAN_TRAP) 11703d0407baSopenharmony_ci unsigned int in_ubsan; 11713d0407baSopenharmony_ci#endif 11723d0407baSopenharmony_ci 11733d0407baSopenharmony_ci /* Journalling filesystem info: */ 11743d0407baSopenharmony_ci void *journal_info; 11753d0407baSopenharmony_ci 11763d0407baSopenharmony_ci /* Stacked block device info: */ 11773d0407baSopenharmony_ci struct bio_list *bio_list; 11783d0407baSopenharmony_ci 11793d0407baSopenharmony_ci#ifdef CONFIG_BLOCK 11803d0407baSopenharmony_ci /* Stack plugging: */ 11813d0407baSopenharmony_ci struct blk_plug *plug; 11823d0407baSopenharmony_ci#endif 11833d0407baSopenharmony_ci 11843d0407baSopenharmony_ci /* VM state: */ 11853d0407baSopenharmony_ci struct reclaim_state *reclaim_state; 11863d0407baSopenharmony_ci 11873d0407baSopenharmony_ci struct backing_dev_info *backing_dev_info; 11883d0407baSopenharmony_ci 11893d0407baSopenharmony_ci struct io_context *io_context; 11903d0407baSopenharmony_ci 11913d0407baSopenharmony_ci#ifdef CONFIG_COMPACTION 11923d0407baSopenharmony_ci struct capture_control *capture_control; 11933d0407baSopenharmony_ci#endif 11943d0407baSopenharmony_ci /* Ptrace state: */ 11953d0407baSopenharmony_ci unsigned long ptrace_message; 11963d0407baSopenharmony_ci kernel_siginfo_t *last_siginfo; 11973d0407baSopenharmony_ci 11983d0407baSopenharmony_ci struct task_io_accounting ioac; 11993d0407baSopenharmony_ci#ifdef CONFIG_PSI 12003d0407baSopenharmony_ci /* Pressure stall state */ 12013d0407baSopenharmony_ci unsigned int psi_flags; 12023d0407baSopenharmony_ci#endif 12033d0407baSopenharmony_ci#ifdef CONFIG_TASK_XACCT 12043d0407baSopenharmony_ci /* Accumulated RSS usage: */ 12053d0407baSopenharmony_ci u64 acct_rss_mem1; 12063d0407baSopenharmony_ci /* Accumulated virtual memory usage: */ 12073d0407baSopenharmony_ci u64 acct_vm_mem1; 12083d0407baSopenharmony_ci /* stime + utime since last update: */ 12093d0407baSopenharmony_ci u64 acct_timexpd; 12103d0407baSopenharmony_ci#endif 12113d0407baSopenharmony_ci#ifdef CONFIG_CPUSETS 12123d0407baSopenharmony_ci /* Protected by ->alloc_lock: */ 12133d0407baSopenharmony_ci nodemask_t mems_allowed; 12143d0407baSopenharmony_ci /* Seqence number to catch updates: */ 12153d0407baSopenharmony_ci seqcount_spinlock_t mems_allowed_seq; 12163d0407baSopenharmony_ci int cpuset_mem_spread_rotor; 12173d0407baSopenharmony_ci int cpuset_slab_spread_rotor; 12183d0407baSopenharmony_ci#endif 12193d0407baSopenharmony_ci#ifdef CONFIG_CGROUPS 12203d0407baSopenharmony_ci /* Control Group info protected by css_set_lock: */ 12213d0407baSopenharmony_ci struct css_set __rcu *cgroups; 12223d0407baSopenharmony_ci /* cg_list protected by css_set_lock and tsk->alloc_lock: */ 12233d0407baSopenharmony_ci struct list_head cg_list; 12243d0407baSopenharmony_ci#endif 12253d0407baSopenharmony_ci#ifdef CONFIG_X86_CPU_RESCTRL 12263d0407baSopenharmony_ci u32 closid; 12273d0407baSopenharmony_ci u32 rmid; 12283d0407baSopenharmony_ci#endif 12293d0407baSopenharmony_ci#ifdef CONFIG_FUTEX 12303d0407baSopenharmony_ci struct robust_list_head __user *robust_list; 12313d0407baSopenharmony_ci#ifdef CONFIG_COMPAT 12323d0407baSopenharmony_ci struct compat_robust_list_head __user *compat_robust_list; 12333d0407baSopenharmony_ci#endif 12343d0407baSopenharmony_ci struct list_head pi_state_list; 12353d0407baSopenharmony_ci struct futex_pi_state *pi_state_cache; 12363d0407baSopenharmony_ci struct mutex futex_exit_mutex; 12373d0407baSopenharmony_ci unsigned int futex_state; 12383d0407baSopenharmony_ci#endif 12393d0407baSopenharmony_ci#ifdef CONFIG_PERF_EVENTS 12403d0407baSopenharmony_ci struct perf_event_context *perf_event_ctxp[perf_nr_task_contexts]; 12413d0407baSopenharmony_ci struct mutex perf_event_mutex; 12423d0407baSopenharmony_ci struct list_head perf_event_list; 12433d0407baSopenharmony_ci#endif 12443d0407baSopenharmony_ci#ifdef CONFIG_DEBUG_PREEMPT 12453d0407baSopenharmony_ci unsigned long preempt_disable_ip; 12463d0407baSopenharmony_ci#endif 12473d0407baSopenharmony_ci#ifdef CONFIG_NUMA 12483d0407baSopenharmony_ci /* Protected by alloc_lock: */ 12493d0407baSopenharmony_ci struct mempolicy *mempolicy; 12503d0407baSopenharmony_ci short il_prev; 12513d0407baSopenharmony_ci short pref_node_fork; 12523d0407baSopenharmony_ci#endif 12533d0407baSopenharmony_ci#ifdef CONFIG_NUMA_BALANCING 12543d0407baSopenharmony_ci int numa_scan_seq; 12553d0407baSopenharmony_ci unsigned int numa_scan_period; 12563d0407baSopenharmony_ci unsigned int numa_scan_period_max; 12573d0407baSopenharmony_ci int numa_preferred_nid; 12583d0407baSopenharmony_ci unsigned long numa_migrate_retry; 12593d0407baSopenharmony_ci /* Migration stamp: */ 12603d0407baSopenharmony_ci u64 node_stamp; 12613d0407baSopenharmony_ci u64 last_task_numa_placement; 12623d0407baSopenharmony_ci u64 last_sum_exec_runtime; 12633d0407baSopenharmony_ci struct callback_head numa_work; 12643d0407baSopenharmony_ci 12653d0407baSopenharmony_ci /* 12663d0407baSopenharmony_ci * This pointer is only modified for current in syscall and 12673d0407baSopenharmony_ci * pagefault context (and for tasks being destroyed), so it can be read 12683d0407baSopenharmony_ci * from any of the following contexts: 12693d0407baSopenharmony_ci * - RCU read-side critical section 12703d0407baSopenharmony_ci * - current->numa_group from everywhere 12713d0407baSopenharmony_ci * - task's runqueue locked, task not running 12723d0407baSopenharmony_ci */ 12733d0407baSopenharmony_ci struct numa_group __rcu *numa_group; 12743d0407baSopenharmony_ci 12753d0407baSopenharmony_ci /* 12763d0407baSopenharmony_ci * numa_faults is an array split into four regions: 12773d0407baSopenharmony_ci * faults_memory, faults_cpu, faults_memory_buffer, faults_cpu_buffer 12783d0407baSopenharmony_ci * in this precise order. 12793d0407baSopenharmony_ci * 12803d0407baSopenharmony_ci * faults_memory: Exponential decaying average of faults on a per-node 12813d0407baSopenharmony_ci * basis. Scheduling placement decisions are made based on these 12823d0407baSopenharmony_ci * counts. The values remain static for the duration of a PTE scan. 12833d0407baSopenharmony_ci * faults_cpu: Track the nodes the process was running on when a NUMA 12843d0407baSopenharmony_ci * hinting fault was incurred. 12853d0407baSopenharmony_ci * faults_memory_buffer and faults_cpu_buffer: Record faults per node 12863d0407baSopenharmony_ci * during the current scan window. When the scan completes, the counts 12873d0407baSopenharmony_ci * in faults_memory and faults_cpu decay and these values are copied. 12883d0407baSopenharmony_ci */ 12893d0407baSopenharmony_ci unsigned long *numa_faults; 12903d0407baSopenharmony_ci unsigned long total_numa_faults; 12913d0407baSopenharmony_ci 12923d0407baSopenharmony_ci /* 12933d0407baSopenharmony_ci * numa_faults_locality tracks if faults recorded during the last 12943d0407baSopenharmony_ci * scan window were remote/local or failed to migrate. The task scan 12953d0407baSopenharmony_ci * period is adapted based on the locality of the faults with different 12963d0407baSopenharmony_ci * weights depending on whether they were shared or private faults 12973d0407baSopenharmony_ci */ 12983d0407baSopenharmony_ci unsigned long numa_faults_locality[3]; 12993d0407baSopenharmony_ci 13003d0407baSopenharmony_ci unsigned long numa_pages_migrated; 13013d0407baSopenharmony_ci#endif /* CONFIG_NUMA_BALANCING */ 13023d0407baSopenharmony_ci 13033d0407baSopenharmony_ci#ifdef CONFIG_RSEQ 13043d0407baSopenharmony_ci struct rseq __user *rseq; 13053d0407baSopenharmony_ci u32 rseq_sig; 13063d0407baSopenharmony_ci /* 13073d0407baSopenharmony_ci * RmW on rseq_event_mask must be performed atomically 13083d0407baSopenharmony_ci * with respect to preemption. 13093d0407baSopenharmony_ci */ 13103d0407baSopenharmony_ci unsigned long rseq_event_mask; 13113d0407baSopenharmony_ci#endif 13123d0407baSopenharmony_ci 13133d0407baSopenharmony_ci struct tlbflush_unmap_batch tlb_ubc; 13143d0407baSopenharmony_ci 13153d0407baSopenharmony_ci union { 13163d0407baSopenharmony_ci refcount_t rcu_users; 13173d0407baSopenharmony_ci struct rcu_head rcu; 13183d0407baSopenharmony_ci }; 13193d0407baSopenharmony_ci 13203d0407baSopenharmony_ci /* Cache last used pipe for splice(): */ 13213d0407baSopenharmony_ci struct pipe_inode_info *splice_pipe; 13223d0407baSopenharmony_ci 13233d0407baSopenharmony_ci struct page_frag task_frag; 13243d0407baSopenharmony_ci 13253d0407baSopenharmony_ci#ifdef CONFIG_TASK_DELAY_ACCT 13263d0407baSopenharmony_ci struct task_delay_info *delays; 13273d0407baSopenharmony_ci#endif 13283d0407baSopenharmony_ci 13293d0407baSopenharmony_ci#ifdef CONFIG_RECLAIM_ACCT 13303d0407baSopenharmony_ci struct reclaim_acct *reclaim_acct; 13313d0407baSopenharmony_ci#endif 13323d0407baSopenharmony_ci 13333d0407baSopenharmony_ci#ifdef CONFIG_FAULT_INJECTION 13343d0407baSopenharmony_ci int make_it_fail; 13353d0407baSopenharmony_ci unsigned int fail_nth; 13363d0407baSopenharmony_ci#endif 13373d0407baSopenharmony_ci /* 13383d0407baSopenharmony_ci * When (nr_dirtied >= nr_dirtied_pause), it's time to call 13393d0407baSopenharmony_ci * balance_dirty_pages() for a dirty throttling pause: 13403d0407baSopenharmony_ci */ 13413d0407baSopenharmony_ci int nr_dirtied; 13423d0407baSopenharmony_ci int nr_dirtied_pause; 13433d0407baSopenharmony_ci /* Start of a write-and-pause period: */ 13443d0407baSopenharmony_ci unsigned long dirty_paused_when; 13453d0407baSopenharmony_ci 13463d0407baSopenharmony_ci#ifdef CONFIG_LATENCYTOP 13473d0407baSopenharmony_ci int latency_record_count; 13483d0407baSopenharmony_ci struct latency_record latency_record[LT_SAVECOUNT]; 13493d0407baSopenharmony_ci#endif 13503d0407baSopenharmony_ci /* 13513d0407baSopenharmony_ci * Time slack values; these are used to round up poll() and 13523d0407baSopenharmony_ci * select() etc timeout values. These are in nanoseconds. 13533d0407baSopenharmony_ci */ 13543d0407baSopenharmony_ci u64 timer_slack_ns; 13553d0407baSopenharmony_ci u64 default_timer_slack_ns; 13563d0407baSopenharmony_ci 13573d0407baSopenharmony_ci#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) 13583d0407baSopenharmony_ci unsigned int kasan_depth; 13593d0407baSopenharmony_ci#endif 13603d0407baSopenharmony_ci 13613d0407baSopenharmony_ci#ifdef CONFIG_KCSAN 13623d0407baSopenharmony_ci struct kcsan_ctx kcsan_ctx; 13633d0407baSopenharmony_ci#ifdef CONFIG_TRACE_IRQFLAGS 13643d0407baSopenharmony_ci struct irqtrace_events kcsan_save_irqtrace; 13653d0407baSopenharmony_ci#endif 13663d0407baSopenharmony_ci#endif 13673d0407baSopenharmony_ci 13683d0407baSopenharmony_ci#if IS_ENABLED(CONFIG_KUNIT) 13693d0407baSopenharmony_ci struct kunit *kunit_test; 13703d0407baSopenharmony_ci#endif 13713d0407baSopenharmony_ci 13723d0407baSopenharmony_ci#ifdef CONFIG_FUNCTION_GRAPH_TRACER 13733d0407baSopenharmony_ci /* Index of current stored address in ret_stack: */ 13743d0407baSopenharmony_ci int curr_ret_stack; 13753d0407baSopenharmony_ci int curr_ret_depth; 13763d0407baSopenharmony_ci 13773d0407baSopenharmony_ci /* Stack of return addresses for return function tracing: */ 13783d0407baSopenharmony_ci struct ftrace_ret_stack *ret_stack; 13793d0407baSopenharmony_ci 13803d0407baSopenharmony_ci /* Timestamp for last schedule: */ 13813d0407baSopenharmony_ci unsigned long long ftrace_timestamp; 13823d0407baSopenharmony_ci 13833d0407baSopenharmony_ci /* 13843d0407baSopenharmony_ci * Number of functions that haven't been traced 13853d0407baSopenharmony_ci * because of depth overrun: 13863d0407baSopenharmony_ci */ 13873d0407baSopenharmony_ci atomic_t trace_overrun; 13883d0407baSopenharmony_ci 13893d0407baSopenharmony_ci /* Pause tracing: */ 13903d0407baSopenharmony_ci atomic_t tracing_graph_pause; 13913d0407baSopenharmony_ci#endif 13923d0407baSopenharmony_ci 13933d0407baSopenharmony_ci#ifdef CONFIG_TRACING 13943d0407baSopenharmony_ci /* State flags for use by tracers: */ 13953d0407baSopenharmony_ci unsigned long trace; 13963d0407baSopenharmony_ci 13973d0407baSopenharmony_ci /* Bitmask and counter of trace recursion: */ 13983d0407baSopenharmony_ci unsigned long trace_recursion; 13993d0407baSopenharmony_ci#endif /* CONFIG_TRACING */ 14003d0407baSopenharmony_ci 14013d0407baSopenharmony_ci#ifdef CONFIG_KCOV 14023d0407baSopenharmony_ci /* See kernel/kcov.c for more details. */ 14033d0407baSopenharmony_ci 14043d0407baSopenharmony_ci /* Coverage collection mode enabled for this task (0 if disabled): */ 14053d0407baSopenharmony_ci unsigned int kcov_mode; 14063d0407baSopenharmony_ci 14073d0407baSopenharmony_ci /* Size of the kcov_area: */ 14083d0407baSopenharmony_ci unsigned int kcov_size; 14093d0407baSopenharmony_ci 14103d0407baSopenharmony_ci /* Buffer for coverage collection: */ 14113d0407baSopenharmony_ci void *kcov_area; 14123d0407baSopenharmony_ci 14133d0407baSopenharmony_ci /* KCOV descriptor wired with this task or NULL: */ 14143d0407baSopenharmony_ci struct kcov *kcov; 14153d0407baSopenharmony_ci 14163d0407baSopenharmony_ci /* KCOV common handle for remote coverage collection: */ 14173d0407baSopenharmony_ci u64 kcov_handle; 14183d0407baSopenharmony_ci 14193d0407baSopenharmony_ci /* KCOV sequence number: */ 14203d0407baSopenharmony_ci int kcov_sequence; 14213d0407baSopenharmony_ci 14223d0407baSopenharmony_ci /* Collect coverage from softirq context: */ 14233d0407baSopenharmony_ci unsigned int kcov_softirq; 14243d0407baSopenharmony_ci#endif 14253d0407baSopenharmony_ci 14263d0407baSopenharmony_ci#ifdef CONFIG_MEMCG 14273d0407baSopenharmony_ci struct mem_cgroup *memcg_in_oom; 14283d0407baSopenharmony_ci gfp_t memcg_oom_gfp_mask; 14293d0407baSopenharmony_ci int memcg_oom_order; 14303d0407baSopenharmony_ci 14313d0407baSopenharmony_ci /* Number of pages to reclaim on returning to userland: */ 14323d0407baSopenharmony_ci unsigned int memcg_nr_pages_over_high; 14333d0407baSopenharmony_ci 14343d0407baSopenharmony_ci /* Used by memcontrol for targeted memcg charge: */ 14353d0407baSopenharmony_ci struct mem_cgroup *active_memcg; 14363d0407baSopenharmony_ci#endif 14373d0407baSopenharmony_ci 14383d0407baSopenharmony_ci#ifdef CONFIG_BLK_CGROUP 14393d0407baSopenharmony_ci struct request_queue *throttle_queue; 14403d0407baSopenharmony_ci#endif 14413d0407baSopenharmony_ci 14423d0407baSopenharmony_ci#ifdef CONFIG_UPROBES 14433d0407baSopenharmony_ci struct uprobe_task *utask; 14443d0407baSopenharmony_ci#endif 14453d0407baSopenharmony_ci#if defined(CONFIG_BCACHE) || defined(CONFIG_BCACHE_MODULE) 14463d0407baSopenharmony_ci unsigned int sequential_io; 14473d0407baSopenharmony_ci unsigned int sequential_io_avg; 14483d0407baSopenharmony_ci#endif 14493d0407baSopenharmony_ci#ifdef CONFIG_DEBUG_ATOMIC_SLEEP 14503d0407baSopenharmony_ci unsigned long task_state_change; 14513d0407baSopenharmony_ci#endif 14523d0407baSopenharmony_ci int pagefault_disabled; 14533d0407baSopenharmony_ci#ifdef CONFIG_MMU 14543d0407baSopenharmony_ci struct task_struct *oom_reaper_list; 14553d0407baSopenharmony_ci struct timer_list oom_reaper_timer; 14563d0407baSopenharmony_ci#endif 14573d0407baSopenharmony_ci#ifdef CONFIG_VMAP_STACK 14583d0407baSopenharmony_ci struct vm_struct *stack_vm_area; 14593d0407baSopenharmony_ci#endif 14603d0407baSopenharmony_ci#ifdef CONFIG_THREAD_INFO_IN_TASK 14613d0407baSopenharmony_ci /* A live task holds one reference: */ 14623d0407baSopenharmony_ci refcount_t stack_refcount; 14633d0407baSopenharmony_ci#endif 14643d0407baSopenharmony_ci#ifdef CONFIG_LIVEPATCH 14653d0407baSopenharmony_ci int patch_state; 14663d0407baSopenharmony_ci#endif 14673d0407baSopenharmony_ci#ifdef CONFIG_SECURITY 14683d0407baSopenharmony_ci /* Used by LSM modules for access restriction: */ 14693d0407baSopenharmony_ci void *security; 14703d0407baSopenharmony_ci#endif 14713d0407baSopenharmony_ci#ifdef CONFIG_BPF_SYSCALL 14723d0407baSopenharmony_ci /* Used for BPF run context */ 14733d0407baSopenharmony_ci struct bpf_run_ctx *bpf_ctx; 14743d0407baSopenharmony_ci#endif 14753d0407baSopenharmony_ci 14763d0407baSopenharmony_ci#ifdef CONFIG_GCC_PLUGIN_STACKLEAK 14773d0407baSopenharmony_ci unsigned long lowest_stack; 14783d0407baSopenharmony_ci unsigned long prev_lowest_stack; 14793d0407baSopenharmony_ci#endif 14803d0407baSopenharmony_ci 14813d0407baSopenharmony_ci#ifdef CONFIG_X86_MCE 14823d0407baSopenharmony_ci void __user *mce_vaddr; 14833d0407baSopenharmony_ci __u64 mce_kflags; 14843d0407baSopenharmony_ci u64 mce_addr; 14853d0407baSopenharmony_ci __u64 mce_ripv : 1, mce_whole_page : 1, __mce_reserved : 62; 14863d0407baSopenharmony_ci struct callback_head mce_kill_me; 14873d0407baSopenharmony_ci int mce_count; 14883d0407baSopenharmony_ci#endif 14893d0407baSopenharmony_ci 14903d0407baSopenharmony_ci#ifdef CONFIG_ACCESS_TOKENID 14913d0407baSopenharmony_ci u64 token; 14923d0407baSopenharmony_ci u64 ftoken; 14933d0407baSopenharmony_ci#endif 14943d0407baSopenharmony_ci /* 14953d0407baSopenharmony_ci * New fields for task_struct should be added above here, so that 14963d0407baSopenharmony_ci * they are included in the randomized portion of task_struct. 14973d0407baSopenharmony_ci */ 14983d0407baSopenharmony_ci randomized_struct_fields_end 14993d0407baSopenharmony_ci 15003d0407baSopenharmony_ci /* CPU-specific state of this task: */ 15013d0407baSopenharmony_ci struct thread_struct thread; 15023d0407baSopenharmony_ci 15033d0407baSopenharmony_ci /* 15043d0407baSopenharmony_ci * WARNING: on x86, 'thread_struct' contains a variable-sized 15053d0407baSopenharmony_ci * structure. It *MUST* be at the end of 'task_struct'. 15063d0407baSopenharmony_ci * 15073d0407baSopenharmony_ci * Do not put anything below here! 15083d0407baSopenharmony_ci */ 15093d0407baSopenharmony_ci}; 15103d0407baSopenharmony_ci 15113d0407baSopenharmony_cistatic inline struct pid *task_pid(struct task_struct *task) 15123d0407baSopenharmony_ci{ 15133d0407baSopenharmony_ci return task->thread_pid; 15143d0407baSopenharmony_ci} 15153d0407baSopenharmony_ci 15163d0407baSopenharmony_ci/* 15173d0407baSopenharmony_ci * the helpers to get the task's different pids as they are seen 15183d0407baSopenharmony_ci * from various namespaces 15193d0407baSopenharmony_ci * 15203d0407baSopenharmony_ci * task_xid_nr() : global id, i.e. the id seen from the init namespace; 15213d0407baSopenharmony_ci * task_xid_vnr() : virtual id, i.e. the id seen from the pid namespace of 15223d0407baSopenharmony_ci * current. 15233d0407baSopenharmony_ci * task_xid_nr_ns() : id seen from the ns specified; 15243d0407baSopenharmony_ci * 15253d0407baSopenharmony_ci * see also pid_nr() etc in include/linux/pid.h 15263d0407baSopenharmony_ci */ 15273d0407baSopenharmony_cipid_t __task_pid_nr_ns(struct task_struct *task, enum pid_type type, struct pid_namespace *ns); 15283d0407baSopenharmony_ci 15293d0407baSopenharmony_cistatic inline pid_t task_pid_nr(struct task_struct *tsk) 15303d0407baSopenharmony_ci{ 15313d0407baSopenharmony_ci return tsk->pid; 15323d0407baSopenharmony_ci} 15333d0407baSopenharmony_ci 15343d0407baSopenharmony_cistatic inline pid_t task_pid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns) 15353d0407baSopenharmony_ci{ 15363d0407baSopenharmony_ci return __task_pid_nr_ns(tsk, PIDTYPE_PID, ns); 15373d0407baSopenharmony_ci} 15383d0407baSopenharmony_ci 15393d0407baSopenharmony_cistatic inline pid_t task_pid_vnr(struct task_struct *tsk) 15403d0407baSopenharmony_ci{ 15413d0407baSopenharmony_ci return __task_pid_nr_ns(tsk, PIDTYPE_PID, NULL); 15423d0407baSopenharmony_ci} 15433d0407baSopenharmony_ci 15443d0407baSopenharmony_cistatic inline pid_t task_tgid_nr(struct task_struct *tsk) 15453d0407baSopenharmony_ci{ 15463d0407baSopenharmony_ci return tsk->tgid; 15473d0407baSopenharmony_ci} 15483d0407baSopenharmony_ci 15493d0407baSopenharmony_ci/** 15503d0407baSopenharmony_ci * pid_alive - check that a task structure is not stale 15513d0407baSopenharmony_ci * @p: Task structure to be checked. 15523d0407baSopenharmony_ci * 15533d0407baSopenharmony_ci * Test if a process is not yet dead (at most zombie state) 15543d0407baSopenharmony_ci * If pid_alive fails, then pointers within the task structure 15553d0407baSopenharmony_ci * can be stale and must not be dereferenced. 15563d0407baSopenharmony_ci * 15573d0407baSopenharmony_ci * Return: 1 if the process is alive. 0 otherwise. 15583d0407baSopenharmony_ci */ 15593d0407baSopenharmony_cistatic inline int pid_alive(const struct task_struct *p) 15603d0407baSopenharmony_ci{ 15613d0407baSopenharmony_ci return p->thread_pid != NULL; 15623d0407baSopenharmony_ci} 15633d0407baSopenharmony_ci 15643d0407baSopenharmony_cistatic inline pid_t task_pgrp_nr_ns(struct task_struct *tsk, struct pid_namespace *ns) 15653d0407baSopenharmony_ci{ 15663d0407baSopenharmony_ci return __task_pid_nr_ns(tsk, PIDTYPE_PGID, ns); 15673d0407baSopenharmony_ci} 15683d0407baSopenharmony_ci 15693d0407baSopenharmony_cistatic inline pid_t task_pgrp_vnr(struct task_struct *tsk) 15703d0407baSopenharmony_ci{ 15713d0407baSopenharmony_ci return __task_pid_nr_ns(tsk, PIDTYPE_PGID, NULL); 15723d0407baSopenharmony_ci} 15733d0407baSopenharmony_ci 15743d0407baSopenharmony_cistatic inline pid_t task_session_nr_ns(struct task_struct *tsk, struct pid_namespace *ns) 15753d0407baSopenharmony_ci{ 15763d0407baSopenharmony_ci return __task_pid_nr_ns(tsk, PIDTYPE_SID, ns); 15773d0407baSopenharmony_ci} 15783d0407baSopenharmony_ci 15793d0407baSopenharmony_cistatic inline pid_t task_session_vnr(struct task_struct *tsk) 15803d0407baSopenharmony_ci{ 15813d0407baSopenharmony_ci return __task_pid_nr_ns(tsk, PIDTYPE_SID, NULL); 15823d0407baSopenharmony_ci} 15833d0407baSopenharmony_ci 15843d0407baSopenharmony_cistatic inline pid_t task_tgid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns) 15853d0407baSopenharmony_ci{ 15863d0407baSopenharmony_ci return __task_pid_nr_ns(tsk, PIDTYPE_TGID, ns); 15873d0407baSopenharmony_ci} 15883d0407baSopenharmony_ci 15893d0407baSopenharmony_cistatic inline pid_t task_tgid_vnr(struct task_struct *tsk) 15903d0407baSopenharmony_ci{ 15913d0407baSopenharmony_ci return __task_pid_nr_ns(tsk, PIDTYPE_TGID, NULL); 15923d0407baSopenharmony_ci} 15933d0407baSopenharmony_ci 15943d0407baSopenharmony_cistatic inline pid_t task_ppid_nr_ns(const struct task_struct *tsk, struct pid_namespace *ns) 15953d0407baSopenharmony_ci{ 15963d0407baSopenharmony_ci pid_t pid = 0; 15973d0407baSopenharmony_ci 15983d0407baSopenharmony_ci rcu_read_lock(); 15993d0407baSopenharmony_ci if (pid_alive(tsk)) { 16003d0407baSopenharmony_ci pid = task_tgid_nr_ns(rcu_dereference(tsk->real_parent), ns); 16013d0407baSopenharmony_ci } 16023d0407baSopenharmony_ci rcu_read_unlock(); 16033d0407baSopenharmony_ci 16043d0407baSopenharmony_ci return pid; 16053d0407baSopenharmony_ci} 16063d0407baSopenharmony_ci 16073d0407baSopenharmony_cistatic inline pid_t task_ppid_nr(const struct task_struct *tsk) 16083d0407baSopenharmony_ci{ 16093d0407baSopenharmony_ci return task_ppid_nr_ns(tsk, &init_pid_ns); 16103d0407baSopenharmony_ci} 16113d0407baSopenharmony_ci 16123d0407baSopenharmony_ci/* Obsolete, do not use */ 16133d0407baSopenharmony_cistatic inline pid_t task_pgrp_nr(struct task_struct *tsk) 16143d0407baSopenharmony_ci{ 16153d0407baSopenharmony_ci return task_pgrp_nr_ns(tsk, &init_pid_ns); 16163d0407baSopenharmony_ci} 16173d0407baSopenharmony_ci 16183d0407baSopenharmony_ci#define TASK_REPORT_IDLE (TASK_REPORT + 1) 16193d0407baSopenharmony_ci#define TASK_REPORT_MAX (TASK_REPORT_IDLE << 1) 16203d0407baSopenharmony_ci 16213d0407baSopenharmony_cistatic inline unsigned int task_state_index(struct task_struct *tsk) 16223d0407baSopenharmony_ci{ 16233d0407baSopenharmony_ci unsigned int tsk_state = READ_ONCE(tsk->state); 16243d0407baSopenharmony_ci unsigned int state = (tsk_state | tsk->exit_state) & TASK_REPORT; 16253d0407baSopenharmony_ci 16263d0407baSopenharmony_ci BUILD_BUG_ON_NOT_POWER_OF_2(TASK_REPORT_MAX); 16273d0407baSopenharmony_ci 16283d0407baSopenharmony_ci if (tsk_state == TASK_IDLE) { 16293d0407baSopenharmony_ci state = TASK_REPORT_IDLE; 16303d0407baSopenharmony_ci } 16313d0407baSopenharmony_ci 16323d0407baSopenharmony_ci return fls(state); 16333d0407baSopenharmony_ci} 16343d0407baSopenharmony_ci 16353d0407baSopenharmony_cistatic inline char task_index_to_char(unsigned int state) 16363d0407baSopenharmony_ci{ 16373d0407baSopenharmony_ci static const char state_char[] = "RSDTtXZPI"; 16383d0407baSopenharmony_ci 16393d0407baSopenharmony_ci BUILD_BUG_ON(1 + ilog2(TASK_REPORT_MAX) != sizeof(state_char) - 1); 16403d0407baSopenharmony_ci 16413d0407baSopenharmony_ci return state_char[state]; 16423d0407baSopenharmony_ci} 16433d0407baSopenharmony_ci 16443d0407baSopenharmony_cistatic inline char task_state_to_char(struct task_struct *tsk) 16453d0407baSopenharmony_ci{ 16463d0407baSopenharmony_ci return task_index_to_char(task_state_index(tsk)); 16473d0407baSopenharmony_ci} 16483d0407baSopenharmony_ci 16493d0407baSopenharmony_ci/** 16503d0407baSopenharmony_ci * is_global_init - check if a task structure is init. Since init 16513d0407baSopenharmony_ci * is free to have sub-threads we need to check tgid. 16523d0407baSopenharmony_ci * @tsk: Task structure to be checked. 16533d0407baSopenharmony_ci * 16543d0407baSopenharmony_ci * Check if a task structure is the first user space task the kernel created. 16553d0407baSopenharmony_ci * 16563d0407baSopenharmony_ci * Return: 1 if the task structure is init. 0 otherwise. 16573d0407baSopenharmony_ci */ 16583d0407baSopenharmony_cistatic inline int is_global_init(struct task_struct *tsk) 16593d0407baSopenharmony_ci{ 16603d0407baSopenharmony_ci return task_tgid_nr(tsk) == 1; 16613d0407baSopenharmony_ci} 16623d0407baSopenharmony_ci 16633d0407baSopenharmony_ciextern struct pid *cad_pid; 16643d0407baSopenharmony_ci 16653d0407baSopenharmony_ci/* 16663d0407baSopenharmony_ci * Per process flags 16673d0407baSopenharmony_ci */ 16683d0407baSopenharmony_ci#define PF_VCPU 0x00000001 /* I'm a virtual CPU */ 16693d0407baSopenharmony_ci#define PF_IDLE 0x00000002 /* I am an IDLE thread */ 16703d0407baSopenharmony_ci#define PF_EXITING 0x00000004 /* Getting shut down */ 16713d0407baSopenharmony_ci#define PF_IO_WORKER 0x00000010 /* Task is an IO worker */ 16723d0407baSopenharmony_ci#define PF_WQ_WORKER 0x00000020 /* I'm a workqueue worker */ 16733d0407baSopenharmony_ci#define PF_FORKNOEXEC 0x00000040 /* Forked but didn't exec */ 16743d0407baSopenharmony_ci#define PF_MCE_PROCESS 0x00000080 /* Process policy on mce errors */ 16753d0407baSopenharmony_ci#define PF_SUPERPRIV 0x00000100 /* Used super-user privileges */ 16763d0407baSopenharmony_ci#define PF_DUMPCORE 0x00000200 /* Dumped core */ 16773d0407baSopenharmony_ci#define PF_SIGNALED 0x00000400 /* Killed by a signal */ 16783d0407baSopenharmony_ci#define PF_MEMALLOC 0x00000800 /* Allocating memory */ 16793d0407baSopenharmony_ci#define PF_NPROC_EXCEEDED 0x00001000 /* set_user() noticed that RLIMIT_NPROC was exceeded */ 16803d0407baSopenharmony_ci#define PF_USED_MATH 0x00002000 /* If unset the fpu must be initialized before use */ 16813d0407baSopenharmony_ci#define PF_NOFREEZE 0x00008000 /* This thread should not be frozen */ 16823d0407baSopenharmony_ci#define PF_FROZEN 0x00010000 /* Frozen for system suspend */ 16833d0407baSopenharmony_ci#define PF_KSWAPD 0x00020000 /* I am kswapd */ 16843d0407baSopenharmony_ci#define PF_MEMALLOC_NOFS 0x00040000 /* All allocation requests will inherit GFP_NOFS */ 16853d0407baSopenharmony_ci#define PF_MEMALLOC_NOIO 0x00080000 /* All allocation requests will inherit GFP_NOIO */ 16863d0407baSopenharmony_ci#define PF_LOCAL_THROTTLE \ 16873d0407baSopenharmony_ci 0x00100000 /* Throttle writes only against the bdi I write to, \ 16883d0407baSopenharmony_ci * I am cleaning dirty pages from some other bdi. */ 16893d0407baSopenharmony_ci#define PF_KTHREAD 0x00200000 /* I am a kernel thread */ 16903d0407baSopenharmony_ci#define PF_RANDOMIZE 0x00400000 /* Randomize virtual address space */ 16913d0407baSopenharmony_ci#define PF_SWAPWRITE 0x00800000 /* Allowed to write to swap */ 16923d0407baSopenharmony_ci#define PF_NO_SETAFFINITY 0x04000000 /* Userland is not allowed to meddle with cpus_mask */ 16933d0407baSopenharmony_ci#define PF_MCE_EARLY 0x08000000 /* Early kill for mce process policy */ 16943d0407baSopenharmony_ci#define PF_MEMALLOC_NOCMA 0x10000000 /* All allocation request will have _GFP_MOVABLE cleared */ 16953d0407baSopenharmony_ci#define PF_FREEZER_SKIP 0x40000000 /* Freezer should not count it as freezable */ 16963d0407baSopenharmony_ci#define PF_SUSPEND_TASK 0x80000000 /* This thread called freeze_processes() and should not be frozen */ 16973d0407baSopenharmony_ci 16983d0407baSopenharmony_ci/* 16993d0407baSopenharmony_ci * Only the _current_ task can read/write to tsk->flags, but other 17003d0407baSopenharmony_ci * tasks can access tsk->flags in readonly mode for example 17013d0407baSopenharmony_ci * with tsk_used_math (like during threaded core dumping). 17023d0407baSopenharmony_ci * There is however an exception to this rule during ptrace 17033d0407baSopenharmony_ci * or during fork: the ptracer task is allowed to write to the 17043d0407baSopenharmony_ci * child->flags of its traced child (same goes for fork, the parent 17053d0407baSopenharmony_ci * can write to the child->flags), because we're guaranteed the 17063d0407baSopenharmony_ci * child is not running and in turn not changing child->flags 17073d0407baSopenharmony_ci * at the same time the parent does it. 17083d0407baSopenharmony_ci */ 17093d0407baSopenharmony_ci#define clear_stopped_child_used_math(child) \ 17103d0407baSopenharmony_ci do { \ 17113d0407baSopenharmony_ci (child)->flags &= ~PF_USED_MATH; \ 17123d0407baSopenharmony_ci } while (0) 17133d0407baSopenharmony_ci#define set_stopped_child_used_math(child) \ 17143d0407baSopenharmony_ci do { \ 17153d0407baSopenharmony_ci (child)->flags |= PF_USED_MATH; \ 17163d0407baSopenharmony_ci } while (0) 17173d0407baSopenharmony_ci#define clear_used_math() clear_stopped_child_used_math(current) 17183d0407baSopenharmony_ci#define set_used_math() set_stopped_child_used_math(current) 17193d0407baSopenharmony_ci 17203d0407baSopenharmony_ci#define conditional_stopped_child_used_math(condition, child) \ 17213d0407baSopenharmony_ci do { \ 17223d0407baSopenharmony_ci (child)->flags &= ~PF_USED_MATH, (child)->flags |= (condition) ? PF_USED_MATH : 0; \ 17233d0407baSopenharmony_ci } while (0) 17243d0407baSopenharmony_ci 17253d0407baSopenharmony_ci#define conditional_used_math(condition) conditional_stopped_child_used_math(condition, current) 17263d0407baSopenharmony_ci 17273d0407baSopenharmony_ci#define copy_to_stopped_child_used_math(child) \ 17283d0407baSopenharmony_ci do { \ 17293d0407baSopenharmony_ci (child)->flags &= ~PF_USED_MATH, (child)->flags |= current->flags & PF_USED_MATH; \ 17303d0407baSopenharmony_ci } while (0) 17313d0407baSopenharmony_ci 17323d0407baSopenharmony_ci/* NOTE: this will return 0 or PF_USED_MATH, it will never return 1 */ 17333d0407baSopenharmony_ci#define tsk_used_math(p) ((p)->flags & PF_USED_MATH) 17343d0407baSopenharmony_ci#define used_math() tsk_used_math(current) 17353d0407baSopenharmony_ci 17363d0407baSopenharmony_cistatic __always_inline bool is_percpu_thread(void) 17373d0407baSopenharmony_ci{ 17383d0407baSopenharmony_ci#ifdef CONFIG_SMP 17393d0407baSopenharmony_ci return (current->flags & PF_NO_SETAFFINITY) && (current->nr_cpus_allowed == 1); 17403d0407baSopenharmony_ci#else 17413d0407baSopenharmony_ci return true; 17423d0407baSopenharmony_ci#endif 17433d0407baSopenharmony_ci} 17443d0407baSopenharmony_ci 17453d0407baSopenharmony_ci/* Per-process atomic flags. */ 17463d0407baSopenharmony_ci#define PFA_NO_NEW_PRIVS 0 /* May not gain new privileges. */ 17473d0407baSopenharmony_ci#define PFA_SPREAD_PAGE 1 /* Spread page cache over cpuset */ 17483d0407baSopenharmony_ci#define PFA_SPREAD_SLAB 2 /* Spread some slab caches over cpuset */ 17493d0407baSopenharmony_ci#define PFA_SPEC_SSB_DISABLE 3 /* Speculative Store Bypass disabled */ 17503d0407baSopenharmony_ci#define PFA_SPEC_SSB_FORCE_DISABLE 4 /* Speculative Store Bypass force disabled */ 17513d0407baSopenharmony_ci#define PFA_SPEC_IB_DISABLE 5 /* Indirect branch speculation restricted */ 17523d0407baSopenharmony_ci#define PFA_SPEC_IB_FORCE_DISABLE 6 /* Indirect branch speculation permanently restricted */ 17533d0407baSopenharmony_ci#define PFA_SPEC_SSB_NOEXEC 7 /* Speculative Store Bypass clear on execve() */ 17543d0407baSopenharmony_ci 17553d0407baSopenharmony_ci#define TASK_PFA_TEST(name, func) \ 17563d0407baSopenharmony_ci static inline bool task_##func(struct task_struct *p) \ 17573d0407baSopenharmony_ci { \ 17583d0407baSopenharmony_ci return test_bit(PFA_##name, &p->atomic_flags); \ 17593d0407baSopenharmony_ci } 17603d0407baSopenharmony_ci 17613d0407baSopenharmony_ci#define TASK_PFA_SET(name, func) \ 17623d0407baSopenharmony_ci static inline void task_set_##func(struct task_struct *p) \ 17633d0407baSopenharmony_ci { \ 17643d0407baSopenharmony_ci set_bit(PFA_##name, &p->atomic_flags); \ 17653d0407baSopenharmony_ci } 17663d0407baSopenharmony_ci 17673d0407baSopenharmony_ci#define TASK_PFA_CLEAR(name, func) \ 17683d0407baSopenharmony_ci static inline void task_clear_##func(struct task_struct *p) \ 17693d0407baSopenharmony_ci { \ 17703d0407baSopenharmony_ci clear_bit(PFA_##name, &p->atomic_flags); \ 17713d0407baSopenharmony_ci } 17723d0407baSopenharmony_ci 17733d0407baSopenharmony_ciTASK_PFA_TEST(NO_NEW_PRIVS, no_new_privs) 17743d0407baSopenharmony_ciTASK_PFA_SET(NO_NEW_PRIVS, no_new_privs) 17753d0407baSopenharmony_ci 17763d0407baSopenharmony_ciTASK_PFA_TEST(SPREAD_PAGE, spread_page) 17773d0407baSopenharmony_ciTASK_PFA_SET(SPREAD_PAGE, spread_page) 17783d0407baSopenharmony_ciTASK_PFA_CLEAR(SPREAD_PAGE, spread_page) 17793d0407baSopenharmony_ci 17803d0407baSopenharmony_ciTASK_PFA_TEST(SPREAD_SLAB, spread_slab) 17813d0407baSopenharmony_ciTASK_PFA_SET(SPREAD_SLAB, spread_slab) 17823d0407baSopenharmony_ciTASK_PFA_CLEAR(SPREAD_SLAB, spread_slab) 17833d0407baSopenharmony_ci 17843d0407baSopenharmony_ciTASK_PFA_TEST(SPEC_SSB_DISABLE, spec_ssb_disable) 17853d0407baSopenharmony_ciTASK_PFA_SET(SPEC_SSB_DISABLE, spec_ssb_disable) 17863d0407baSopenharmony_ciTASK_PFA_CLEAR(SPEC_SSB_DISABLE, spec_ssb_disable) 17873d0407baSopenharmony_ci 17883d0407baSopenharmony_ciTASK_PFA_TEST(SPEC_SSB_NOEXEC, spec_ssb_noexec) 17893d0407baSopenharmony_ciTASK_PFA_SET(SPEC_SSB_NOEXEC, spec_ssb_noexec) 17903d0407baSopenharmony_ciTASK_PFA_CLEAR(SPEC_SSB_NOEXEC, spec_ssb_noexec) 17913d0407baSopenharmony_ci 17923d0407baSopenharmony_ciTASK_PFA_TEST(SPEC_SSB_FORCE_DISABLE, spec_ssb_force_disable) 17933d0407baSopenharmony_ciTASK_PFA_SET(SPEC_SSB_FORCE_DISABLE, spec_ssb_force_disable) 17943d0407baSopenharmony_ci 17953d0407baSopenharmony_ciTASK_PFA_TEST(SPEC_IB_DISABLE, spec_ib_disable) 17963d0407baSopenharmony_ciTASK_PFA_SET(SPEC_IB_DISABLE, spec_ib_disable) 17973d0407baSopenharmony_ciTASK_PFA_CLEAR(SPEC_IB_DISABLE, spec_ib_disable) 17983d0407baSopenharmony_ci 17993d0407baSopenharmony_ciTASK_PFA_TEST(SPEC_IB_FORCE_DISABLE, spec_ib_force_disable) 18003d0407baSopenharmony_ciTASK_PFA_SET(SPEC_IB_FORCE_DISABLE, spec_ib_force_disable) 18013d0407baSopenharmony_ci 18023d0407baSopenharmony_cistatic inline void current_restore_flags(unsigned long orig_flags, unsigned long flags) 18033d0407baSopenharmony_ci{ 18043d0407baSopenharmony_ci current->flags &= ~flags; 18053d0407baSopenharmony_ci current->flags |= orig_flags & flags; 18063d0407baSopenharmony_ci} 18073d0407baSopenharmony_ci 18083d0407baSopenharmony_ciextern int cpuset_cpumask_can_shrink(const struct cpumask *cur, const struct cpumask *trial); 18093d0407baSopenharmony_ciextern int task_can_attach(struct task_struct *p, const struct cpumask *cs_cpus_allowed); 18103d0407baSopenharmony_ci#ifdef CONFIG_SMP 18113d0407baSopenharmony_ciextern void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask); 18123d0407baSopenharmony_ciextern int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask); 18133d0407baSopenharmony_ci#else 18143d0407baSopenharmony_cistatic inline void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) 18153d0407baSopenharmony_ci{ 18163d0407baSopenharmony_ci} 18173d0407baSopenharmony_cistatic inline int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask) 18183d0407baSopenharmony_ci{ 18193d0407baSopenharmony_ci if (!cpumask_test_cpu(0, new_mask)) { 18203d0407baSopenharmony_ci return -EINVAL; 18213d0407baSopenharmony_ci } 18223d0407baSopenharmony_ci return 0; 18233d0407baSopenharmony_ci} 18243d0407baSopenharmony_ci#endif 18253d0407baSopenharmony_ci 18263d0407baSopenharmony_ciextern int yield_to(struct task_struct *p, bool preempt); 18273d0407baSopenharmony_ciextern void set_user_nice(struct task_struct *p, long nice); 18283d0407baSopenharmony_ciextern int task_prio(const struct task_struct *p); 18293d0407baSopenharmony_ci 18303d0407baSopenharmony_ci/** 18313d0407baSopenharmony_ci * task_nice - return the nice value of a given task. 18323d0407baSopenharmony_ci * @p: the task in question. 18333d0407baSopenharmony_ci * 18343d0407baSopenharmony_ci * Return: The nice value [ -20 ... 0 ... 19 ]. 18353d0407baSopenharmony_ci */ 18363d0407baSopenharmony_cistatic inline int task_nice(const struct task_struct *p) 18373d0407baSopenharmony_ci{ 18383d0407baSopenharmony_ci return PRIO_TO_NICE((p)->static_prio); 18393d0407baSopenharmony_ci} 18403d0407baSopenharmony_ci 18413d0407baSopenharmony_ciextern int can_nice(const struct task_struct *p, const int nice); 18423d0407baSopenharmony_ciextern int task_curr(const struct task_struct *p); 18433d0407baSopenharmony_ciextern int idle_cpu(int cpu); 18443d0407baSopenharmony_ciextern int available_idle_cpu(int cpu); 18453d0407baSopenharmony_ciextern int sched_setscheduler(struct task_struct *, int, const struct sched_param *); 18463d0407baSopenharmony_ciextern int sched_setscheduler_nocheck(struct task_struct *, int, const struct sched_param *); 18473d0407baSopenharmony_ciextern void sched_set_fifo(struct task_struct *p); 18483d0407baSopenharmony_ciextern void sched_set_fifo_low(struct task_struct *p); 18493d0407baSopenharmony_ciextern void sched_set_normal(struct task_struct *p, int nice); 18503d0407baSopenharmony_ciextern int sched_setattr(struct task_struct *, const struct sched_attr *); 18513d0407baSopenharmony_ciextern int sched_setattr_nocheck(struct task_struct *, const struct sched_attr *); 18523d0407baSopenharmony_ciextern struct task_struct *idle_task(int cpu); 18533d0407baSopenharmony_ci 18543d0407baSopenharmony_ci/** 18553d0407baSopenharmony_ci * is_idle_task - is the specified task an idle task? 18563d0407baSopenharmony_ci * @p: the task in question. 18573d0407baSopenharmony_ci * 18583d0407baSopenharmony_ci * Return: 1 if @p is an idle task. 0 otherwise. 18593d0407baSopenharmony_ci */ 18603d0407baSopenharmony_cistatic __always_inline bool is_idle_task(const struct task_struct *p) 18613d0407baSopenharmony_ci{ 18623d0407baSopenharmony_ci return !!(p->flags & PF_IDLE); 18633d0407baSopenharmony_ci} 18643d0407baSopenharmony_ci 18653d0407baSopenharmony_ciextern struct task_struct *curr_task(int cpu); 18663d0407baSopenharmony_ciextern void ia64_set_curr_task(int cpu, struct task_struct *p); 18673d0407baSopenharmony_ci 18683d0407baSopenharmony_civoid yield(void); 18693d0407baSopenharmony_ci 18703d0407baSopenharmony_ciunion thread_union { 18713d0407baSopenharmony_ci#ifndef CONFIG_ARCH_TASK_STRUCT_ON_STACK 18723d0407baSopenharmony_ci struct task_struct task; 18733d0407baSopenharmony_ci#endif 18743d0407baSopenharmony_ci#ifndef CONFIG_THREAD_INFO_IN_TASK 18753d0407baSopenharmony_ci struct thread_info thread_info; 18763d0407baSopenharmony_ci#endif 18773d0407baSopenharmony_ci unsigned long stack[THREAD_SIZE / sizeof(long)]; 18783d0407baSopenharmony_ci}; 18793d0407baSopenharmony_ci 18803d0407baSopenharmony_ci#ifndef CONFIG_THREAD_INFO_IN_TASK 18813d0407baSopenharmony_ciextern struct thread_info init_thread_info; 18823d0407baSopenharmony_ci#endif 18833d0407baSopenharmony_ci 18843d0407baSopenharmony_ciextern unsigned long init_stack[THREAD_SIZE / sizeof(unsigned long)]; 18853d0407baSopenharmony_ci 18863d0407baSopenharmony_ci#ifdef CONFIG_THREAD_INFO_IN_TASK 18873d0407baSopenharmony_cistatic inline struct thread_info *task_thread_info(struct task_struct *task) 18883d0407baSopenharmony_ci{ 18893d0407baSopenharmony_ci return &task->thread_info; 18903d0407baSopenharmony_ci} 18913d0407baSopenharmony_ci#elif !defined(__HAVE_THREAD_FUNCTIONS) 18923d0407baSopenharmony_ci#define task_thread_info(task) ((struct thread_info *)(task)->stack) 18933d0407baSopenharmony_ci#endif 18943d0407baSopenharmony_ci 18953d0407baSopenharmony_ci/* 18963d0407baSopenharmony_ci * find a task by one of its numerical ids 18973d0407baSopenharmony_ci * 18983d0407baSopenharmony_ci * find_task_by_pid_ns(): 18993d0407baSopenharmony_ci * finds a task by its pid in the specified namespace 19003d0407baSopenharmony_ci * find_task_by_vpid(): 19013d0407baSopenharmony_ci * finds a task by its virtual pid 19023d0407baSopenharmony_ci * 19033d0407baSopenharmony_ci * see also find_vpid() etc in include/linux/pid.h 19043d0407baSopenharmony_ci */ 19053d0407baSopenharmony_ci 19063d0407baSopenharmony_ciextern struct task_struct *find_task_by_vpid(pid_t nr); 19073d0407baSopenharmony_ciextern struct task_struct *find_task_by_pid_ns(pid_t nr, struct pid_namespace *ns); 19083d0407baSopenharmony_ci 19093d0407baSopenharmony_ci/* 19103d0407baSopenharmony_ci * find a task by its virtual pid and get the task struct 19113d0407baSopenharmony_ci */ 19123d0407baSopenharmony_ciextern struct task_struct *find_get_task_by_vpid(pid_t nr); 19133d0407baSopenharmony_ci 19143d0407baSopenharmony_ciextern int wake_up_state(struct task_struct *tsk, unsigned int state); 19153d0407baSopenharmony_ciextern int wake_up_process(struct task_struct *tsk); 19163d0407baSopenharmony_ciextern void wake_up_new_task(struct task_struct *tsk); 19173d0407baSopenharmony_ci 19183d0407baSopenharmony_ci#ifdef CONFIG_SMP 19193d0407baSopenharmony_ciextern void kick_process(struct task_struct *tsk); 19203d0407baSopenharmony_ci#else 19213d0407baSopenharmony_cistatic inline void kick_process(struct task_struct *tsk) 19223d0407baSopenharmony_ci{ 19233d0407baSopenharmony_ci} 19243d0407baSopenharmony_ci#endif 19253d0407baSopenharmony_ci 19263d0407baSopenharmony_ciextern void __set_task_comm(struct task_struct *tsk, const char *from, bool exec); 19273d0407baSopenharmony_ci 19283d0407baSopenharmony_cistatic inline void set_task_comm(struct task_struct *tsk, const char *from) 19293d0407baSopenharmony_ci{ 19303d0407baSopenharmony_ci __set_task_comm(tsk, from, false); 19313d0407baSopenharmony_ci} 19323d0407baSopenharmony_ci 19333d0407baSopenharmony_ciextern char *__get_task_comm(char *to, size_t len, struct task_struct *tsk); 19343d0407baSopenharmony_ci#define get_task_comm(buf, tsk) \ 19353d0407baSopenharmony_ci ( { \ 19363d0407baSopenharmony_ci BUILD_BUG_ON(sizeof(buf) != TASK_COMM_LEN); \ 19373d0407baSopenharmony_ci __get_task_comm(buf, sizeof(buf), tsk); \ 19383d0407baSopenharmony_ci }) 19393d0407baSopenharmony_ci 19403d0407baSopenharmony_ci#ifdef CONFIG_SMP 19413d0407baSopenharmony_cistatic __always_inline void scheduler_ipi(void) 19423d0407baSopenharmony_ci{ 19433d0407baSopenharmony_ci /* 19443d0407baSopenharmony_ci * Fold TIF_NEED_RESCHED into the preempt_count; anybody setting 19453d0407baSopenharmony_ci * TIF_NEED_RESCHED remotely (for the first time) will also send 19463d0407baSopenharmony_ci * this IPI. 19473d0407baSopenharmony_ci */ 19483d0407baSopenharmony_ci preempt_fold_need_resched(); 19493d0407baSopenharmony_ci} 19503d0407baSopenharmony_ciextern unsigned long wait_task_inactive(struct task_struct *, long match_state); 19513d0407baSopenharmony_ci#else 19523d0407baSopenharmony_cistatic inline void scheduler_ipi(void) 19533d0407baSopenharmony_ci{ 19543d0407baSopenharmony_ci} 19553d0407baSopenharmony_cistatic inline unsigned long wait_task_inactive(struct task_struct *p, long match_state) 19563d0407baSopenharmony_ci{ 19573d0407baSopenharmony_ci return 1; 19583d0407baSopenharmony_ci} 19593d0407baSopenharmony_ci#endif 19603d0407baSopenharmony_ci 19613d0407baSopenharmony_ci/* 19623d0407baSopenharmony_ci * Set thread flags in other task's structures. 19633d0407baSopenharmony_ci * See asm/thread_info.h for TIF_xxxx flags available: 19643d0407baSopenharmony_ci */ 19653d0407baSopenharmony_cistatic inline void set_tsk_thread_flag(struct task_struct *tsk, int flag) 19663d0407baSopenharmony_ci{ 19673d0407baSopenharmony_ci set_ti_thread_flag(task_thread_info(tsk), flag); 19683d0407baSopenharmony_ci} 19693d0407baSopenharmony_ci 19703d0407baSopenharmony_cistatic inline void clear_tsk_thread_flag(struct task_struct *tsk, int flag) 19713d0407baSopenharmony_ci{ 19723d0407baSopenharmony_ci clear_ti_thread_flag(task_thread_info(tsk), flag); 19733d0407baSopenharmony_ci} 19743d0407baSopenharmony_ci 19753d0407baSopenharmony_cistatic inline void update_tsk_thread_flag(struct task_struct *tsk, int flag, bool value) 19763d0407baSopenharmony_ci{ 19773d0407baSopenharmony_ci update_ti_thread_flag(task_thread_info(tsk), flag, value); 19783d0407baSopenharmony_ci} 19793d0407baSopenharmony_ci 19803d0407baSopenharmony_cistatic inline int test_and_set_tsk_thread_flag(struct task_struct *tsk, int flag) 19813d0407baSopenharmony_ci{ 19823d0407baSopenharmony_ci return test_and_set_ti_thread_flag(task_thread_info(tsk), flag); 19833d0407baSopenharmony_ci} 19843d0407baSopenharmony_ci 19853d0407baSopenharmony_cistatic inline int test_and_clear_tsk_thread_flag(struct task_struct *tsk, int flag) 19863d0407baSopenharmony_ci{ 19873d0407baSopenharmony_ci return test_and_clear_ti_thread_flag(task_thread_info(tsk), flag); 19883d0407baSopenharmony_ci} 19893d0407baSopenharmony_ci 19903d0407baSopenharmony_cistatic inline int test_tsk_thread_flag(struct task_struct *tsk, int flag) 19913d0407baSopenharmony_ci{ 19923d0407baSopenharmony_ci return test_ti_thread_flag(task_thread_info(tsk), flag); 19933d0407baSopenharmony_ci} 19943d0407baSopenharmony_ci 19953d0407baSopenharmony_cistatic inline void set_tsk_need_resched(struct task_struct *tsk) 19963d0407baSopenharmony_ci{ 19973d0407baSopenharmony_ci set_tsk_thread_flag(tsk, TIF_NEED_RESCHED); 19983d0407baSopenharmony_ci} 19993d0407baSopenharmony_ci 20003d0407baSopenharmony_cistatic inline void clear_tsk_need_resched(struct task_struct *tsk) 20013d0407baSopenharmony_ci{ 20023d0407baSopenharmony_ci clear_tsk_thread_flag(tsk, TIF_NEED_RESCHED); 20033d0407baSopenharmony_ci} 20043d0407baSopenharmony_ci 20053d0407baSopenharmony_cistatic inline int test_tsk_need_resched(struct task_struct *tsk) 20063d0407baSopenharmony_ci{ 20073d0407baSopenharmony_ci return unlikely(test_tsk_thread_flag(tsk, TIF_NEED_RESCHED)); 20083d0407baSopenharmony_ci} 20093d0407baSopenharmony_ci 20103d0407baSopenharmony_ci/* 20113d0407baSopenharmony_ci * cond_resched() and cond_resched_lock(): latency reduction via 20123d0407baSopenharmony_ci * explicit rescheduling in places that are safe. The return 20133d0407baSopenharmony_ci * value indicates whether a reschedule was done in fact. 20143d0407baSopenharmony_ci * cond_resched_lock() will drop the spinlock before scheduling, 20153d0407baSopenharmony_ci */ 20163d0407baSopenharmony_ci#ifndef CONFIG_PREEMPTION 20173d0407baSopenharmony_ciextern int _cond_resched(void); 20183d0407baSopenharmony_ci#else 20193d0407baSopenharmony_cistatic inline int _cond_resched(void) 20203d0407baSopenharmony_ci{ 20213d0407baSopenharmony_ci return 0; 20223d0407baSopenharmony_ci} 20233d0407baSopenharmony_ci#endif 20243d0407baSopenharmony_ci 20253d0407baSopenharmony_ci#define cond_resched() \ 20263d0407baSopenharmony_ci ( { \ 20273d0407baSopenharmony_ci ___might_sleep(__FILE__, __LINE__, 0); \ 20283d0407baSopenharmony_ci _cond_resched(); \ 20293d0407baSopenharmony_ci }) 20303d0407baSopenharmony_ci 20313d0407baSopenharmony_ciextern int __cond_resched_lock(spinlock_t *lock); 20323d0407baSopenharmony_ci 20333d0407baSopenharmony_ci#define cond_resched_lock(lock) \ 20343d0407baSopenharmony_ci ( { \ 20353d0407baSopenharmony_ci ___might_sleep(__FILE__, __LINE__, PREEMPT_LOCK_OFFSET); \ 20363d0407baSopenharmony_ci __cond_resched_lock(lock); \ 20373d0407baSopenharmony_ci }) 20383d0407baSopenharmony_ci 20393d0407baSopenharmony_cistatic inline void cond_resched_rcu(void) 20403d0407baSopenharmony_ci{ 20413d0407baSopenharmony_ci#if defined(CONFIG_DEBUG_ATOMIC_SLEEP) || !defined(CONFIG_PREEMPT_RCU) 20423d0407baSopenharmony_ci rcu_read_unlock(); 20433d0407baSopenharmony_ci cond_resched(); 20443d0407baSopenharmony_ci rcu_read_lock(); 20453d0407baSopenharmony_ci#endif 20463d0407baSopenharmony_ci} 20473d0407baSopenharmony_ci 20483d0407baSopenharmony_ci/* 20493d0407baSopenharmony_ci * Does a critical section need to be broken due to another 20503d0407baSopenharmony_ci * task waiting?: (technically does not depend on CONFIG_PREEMPTION, 20513d0407baSopenharmony_ci * but a general need for low latency) 20523d0407baSopenharmony_ci */ 20533d0407baSopenharmony_cistatic inline int spin_needbreak(spinlock_t *lock) 20543d0407baSopenharmony_ci{ 20553d0407baSopenharmony_ci#ifdef CONFIG_PREEMPTION 20563d0407baSopenharmony_ci return spin_is_contended(lock); 20573d0407baSopenharmony_ci#else 20583d0407baSopenharmony_ci return 0; 20593d0407baSopenharmony_ci#endif 20603d0407baSopenharmony_ci} 20613d0407baSopenharmony_ci 20623d0407baSopenharmony_cistatic __always_inline bool need_resched(void) 20633d0407baSopenharmony_ci{ 20643d0407baSopenharmony_ci return unlikely(tif_need_resched()); 20653d0407baSopenharmony_ci} 20663d0407baSopenharmony_ci 20673d0407baSopenharmony_ci/* 20683d0407baSopenharmony_ci * Wrappers for p->thread_info->cpu access. No-op on UP. 20693d0407baSopenharmony_ci */ 20703d0407baSopenharmony_ci#ifdef CONFIG_SMP 20713d0407baSopenharmony_ci 20723d0407baSopenharmony_cistatic inline unsigned int task_cpu(const struct task_struct *p) 20733d0407baSopenharmony_ci{ 20743d0407baSopenharmony_ci#ifdef CONFIG_THREAD_INFO_IN_TASK 20753d0407baSopenharmony_ci return READ_ONCE(p->cpu); 20763d0407baSopenharmony_ci#else 20773d0407baSopenharmony_ci return READ_ONCE(task_thread_info(p)->cpu); 20783d0407baSopenharmony_ci#endif 20793d0407baSopenharmony_ci} 20803d0407baSopenharmony_ci 20813d0407baSopenharmony_ciextern void set_task_cpu(struct task_struct *p, unsigned int cpu); 20823d0407baSopenharmony_ci 20833d0407baSopenharmony_ci#else 20843d0407baSopenharmony_ci 20853d0407baSopenharmony_cistatic inline unsigned int task_cpu(const struct task_struct *p) 20863d0407baSopenharmony_ci{ 20873d0407baSopenharmony_ci return 0; 20883d0407baSopenharmony_ci} 20893d0407baSopenharmony_ci 20903d0407baSopenharmony_cistatic inline void set_task_cpu(struct task_struct *p, unsigned int cpu) 20913d0407baSopenharmony_ci{ 20923d0407baSopenharmony_ci} 20933d0407baSopenharmony_ci 20943d0407baSopenharmony_ci#endif /* CONFIG_SMP */ 20953d0407baSopenharmony_ci 20963d0407baSopenharmony_ci/* 20973d0407baSopenharmony_ci * In order to reduce various lock holder preemption latencies provide an 20983d0407baSopenharmony_ci * interface to see if a vCPU is currently running or not. 20993d0407baSopenharmony_ci * 21003d0407baSopenharmony_ci * This allows us to terminate optimistic spin loops and block, analogous to 21013d0407baSopenharmony_ci * the native optimistic spin heuristic of testing if the lock owner task is 21023d0407baSopenharmony_ci * running or not. 21033d0407baSopenharmony_ci */ 21043d0407baSopenharmony_ci#ifndef vcpu_is_preempted 21053d0407baSopenharmony_cistatic inline bool vcpu_is_preempted(int cpu) 21063d0407baSopenharmony_ci{ 21073d0407baSopenharmony_ci return false; 21083d0407baSopenharmony_ci} 21093d0407baSopenharmony_ci#endif 21103d0407baSopenharmony_ci 21113d0407baSopenharmony_ciextern long sched_setaffinity(pid_t pid, const struct cpumask *new_mask); 21123d0407baSopenharmony_ciextern long sched_getaffinity(pid_t pid, struct cpumask *mask); 21133d0407baSopenharmony_ci 21143d0407baSopenharmony_ci#ifndef TASK_SIZE_OF 21153d0407baSopenharmony_ci#define TASK_SIZE_OF(tsk) TASK_SIZE 21163d0407baSopenharmony_ci#endif 21173d0407baSopenharmony_ci 21183d0407baSopenharmony_ci#ifdef CONFIG_RSEQ 21193d0407baSopenharmony_ci 21203d0407baSopenharmony_ci/* 21213d0407baSopenharmony_ci * Map the event mask on the user-space ABI enum rseq_cs_flags 21223d0407baSopenharmony_ci * for direct mask checks. 21233d0407baSopenharmony_ci */ 21243d0407baSopenharmony_cienum rseq_event_mask_bits { 21253d0407baSopenharmony_ci RSEQ_EVENT_PREEMPT_BIT = RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT_BIT, 21263d0407baSopenharmony_ci RSEQ_EVENT_SIGNAL_BIT = RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL_BIT, 21273d0407baSopenharmony_ci RSEQ_EVENT_MIGRATE_BIT = RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT, 21283d0407baSopenharmony_ci}; 21293d0407baSopenharmony_ci 21303d0407baSopenharmony_cienum rseq_event_mask { 21313d0407baSopenharmony_ci RSEQ_EVENT_PREEMPT = (1U << RSEQ_EVENT_PREEMPT_BIT), 21323d0407baSopenharmony_ci RSEQ_EVENT_SIGNAL = (1U << RSEQ_EVENT_SIGNAL_BIT), 21333d0407baSopenharmony_ci RSEQ_EVENT_MIGRATE = (1U << RSEQ_EVENT_MIGRATE_BIT), 21343d0407baSopenharmony_ci}; 21353d0407baSopenharmony_ci 21363d0407baSopenharmony_cistatic inline void rseq_set_notify_resume(struct task_struct *t) 21373d0407baSopenharmony_ci{ 21383d0407baSopenharmony_ci if (t->rseq) { 21393d0407baSopenharmony_ci set_tsk_thread_flag(t, TIF_NOTIFY_RESUME); 21403d0407baSopenharmony_ci } 21413d0407baSopenharmony_ci} 21423d0407baSopenharmony_ci 21433d0407baSopenharmony_civoid __rseq_handle_notify_resume(struct ksignal *sig, struct pt_regs *regs); 21443d0407baSopenharmony_ci 21453d0407baSopenharmony_cistatic inline void rseq_handle_notify_resume(struct ksignal *ksig, struct pt_regs *regs) 21463d0407baSopenharmony_ci{ 21473d0407baSopenharmony_ci if (current->rseq) { 21483d0407baSopenharmony_ci __rseq_handle_notify_resume(ksig, regs); 21493d0407baSopenharmony_ci } 21503d0407baSopenharmony_ci} 21513d0407baSopenharmony_ci 21523d0407baSopenharmony_cistatic inline void rseq_signal_deliver(struct ksignal *ksig, struct pt_regs *regs) 21533d0407baSopenharmony_ci{ 21543d0407baSopenharmony_ci preempt_disable(); 21553d0407baSopenharmony_ci __set_bit(RSEQ_EVENT_SIGNAL_BIT, ¤t->rseq_event_mask); 21563d0407baSopenharmony_ci preempt_enable(); 21573d0407baSopenharmony_ci rseq_handle_notify_resume(ksig, regs); 21583d0407baSopenharmony_ci} 21593d0407baSopenharmony_ci 21603d0407baSopenharmony_ci/* rseq_preempt() requires preemption to be disabled. */ 21613d0407baSopenharmony_cistatic inline void rseq_preempt(struct task_struct *t) 21623d0407baSopenharmony_ci{ 21633d0407baSopenharmony_ci __set_bit(RSEQ_EVENT_PREEMPT_BIT, &t->rseq_event_mask); 21643d0407baSopenharmony_ci rseq_set_notify_resume(t); 21653d0407baSopenharmony_ci} 21663d0407baSopenharmony_ci 21673d0407baSopenharmony_ci/* rseq_migrate() requires preemption to be disabled. */ 21683d0407baSopenharmony_cistatic inline void rseq_migrate(struct task_struct *t) 21693d0407baSopenharmony_ci{ 21703d0407baSopenharmony_ci __set_bit(RSEQ_EVENT_MIGRATE_BIT, &t->rseq_event_mask); 21713d0407baSopenharmony_ci rseq_set_notify_resume(t); 21723d0407baSopenharmony_ci} 21733d0407baSopenharmony_ci 21743d0407baSopenharmony_ci/* 21753d0407baSopenharmony_ci * If parent process has a registered restartable sequences area, the 21763d0407baSopenharmony_ci * child inherits. Unregister rseq for a clone with CLONE_VM set. 21773d0407baSopenharmony_ci */ 21783d0407baSopenharmony_cistatic inline void rseq_fork(struct task_struct *t, unsigned long clone_flags) 21793d0407baSopenharmony_ci{ 21803d0407baSopenharmony_ci if (clone_flags & CLONE_VM) { 21813d0407baSopenharmony_ci t->rseq = NULL; 21823d0407baSopenharmony_ci t->rseq_sig = 0; 21833d0407baSopenharmony_ci t->rseq_event_mask = 0; 21843d0407baSopenharmony_ci } else { 21853d0407baSopenharmony_ci t->rseq = current->rseq; 21863d0407baSopenharmony_ci t->rseq_sig = current->rseq_sig; 21873d0407baSopenharmony_ci t->rseq_event_mask = current->rseq_event_mask; 21883d0407baSopenharmony_ci } 21893d0407baSopenharmony_ci} 21903d0407baSopenharmony_ci 21913d0407baSopenharmony_cistatic inline void rseq_execve(struct task_struct *t) 21923d0407baSopenharmony_ci{ 21933d0407baSopenharmony_ci t->rseq = NULL; 21943d0407baSopenharmony_ci t->rseq_sig = 0; 21953d0407baSopenharmony_ci t->rseq_event_mask = 0; 21963d0407baSopenharmony_ci} 21973d0407baSopenharmony_ci 21983d0407baSopenharmony_ci#else 21993d0407baSopenharmony_ci 22003d0407baSopenharmony_cistatic inline void rseq_set_notify_resume(struct task_struct *t) 22013d0407baSopenharmony_ci{ 22023d0407baSopenharmony_ci} 22033d0407baSopenharmony_cistatic inline void rseq_handle_notify_resume(struct ksignal *ksig, struct pt_regs *regs) 22043d0407baSopenharmony_ci{ 22053d0407baSopenharmony_ci} 22063d0407baSopenharmony_cistatic inline void rseq_signal_deliver(struct ksignal *ksig, struct pt_regs *regs) 22073d0407baSopenharmony_ci{ 22083d0407baSopenharmony_ci} 22093d0407baSopenharmony_cistatic inline void rseq_preempt(struct task_struct *t) 22103d0407baSopenharmony_ci{ 22113d0407baSopenharmony_ci} 22123d0407baSopenharmony_cistatic inline void rseq_migrate(struct task_struct *t) 22133d0407baSopenharmony_ci{ 22143d0407baSopenharmony_ci} 22153d0407baSopenharmony_cistatic inline void rseq_fork(struct task_struct *t, unsigned long clone_flags) 22163d0407baSopenharmony_ci{ 22173d0407baSopenharmony_ci} 22183d0407baSopenharmony_cistatic inline void rseq_execve(struct task_struct *t) 22193d0407baSopenharmony_ci{ 22203d0407baSopenharmony_ci} 22213d0407baSopenharmony_ci 22223d0407baSopenharmony_ci#endif 22233d0407baSopenharmony_ci 22243d0407baSopenharmony_ci#ifdef CONFIG_DEBUG_RSEQ 22253d0407baSopenharmony_ci 22263d0407baSopenharmony_civoid rseq_syscall(struct pt_regs *regs); 22273d0407baSopenharmony_ci 22283d0407baSopenharmony_ci#else 22293d0407baSopenharmony_ci 22303d0407baSopenharmony_cistatic inline void rseq_syscall(struct pt_regs *regs) 22313d0407baSopenharmony_ci{ 22323d0407baSopenharmony_ci} 22333d0407baSopenharmony_ci 22343d0407baSopenharmony_ci#endif 22353d0407baSopenharmony_ci 22363d0407baSopenharmony_ciconst struct sched_avg *sched_trace_cfs_rq_avg(struct cfs_rq *cfs_rq); 22373d0407baSopenharmony_cichar *sched_trace_cfs_rq_path(struct cfs_rq *cfs_rq, char *str, int len); 22383d0407baSopenharmony_ciint sched_trace_cfs_rq_cpu(struct cfs_rq *cfs_rq); 22393d0407baSopenharmony_ci 22403d0407baSopenharmony_ciconst struct sched_avg *sched_trace_rq_avg_rt(struct rq *rq); 22413d0407baSopenharmony_ciconst struct sched_avg *sched_trace_rq_avg_dl(struct rq *rq); 22423d0407baSopenharmony_ciconst struct sched_avg *sched_trace_rq_avg_irq(struct rq *rq); 22433d0407baSopenharmony_ci 22443d0407baSopenharmony_ciint sched_trace_rq_cpu(struct rq *rq); 22453d0407baSopenharmony_ciint sched_trace_rq_cpu_capacity(struct rq *rq); 22463d0407baSopenharmony_ciint sched_trace_rq_nr_running(struct rq *rq); 22473d0407baSopenharmony_ci 22483d0407baSopenharmony_ciconst struct cpumask *sched_trace_rd_span(struct root_domain *rd); 22493d0407baSopenharmony_ci 22503d0407baSopenharmony_ci#endif 2251