【一】 sched.h
2015-08-24 19:16 cascle 阅读(3387) 评论(0) 编辑 收藏 举报第一个数据结构体是 task_struct ,这个数据结构被内核用来表示进程,包含其所有信息。
定义于文件 include/linux/sched.h 中,先看看其完整定义
1 struct task_struct { 2 volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ 3 void *stack; 4 atomic_t usage; 5 unsigned int flags; /* per process flags, defined below */ 6 unsigned int ptrace; 7 8 #ifdef CONFIG_SMP 9 struct llist_node wake_entry; 10 int on_cpu; 11 #endif 12 int on_rq; 13 14 int prio, static_prio, normal_prio; 15 unsigned int rt_priority; 16 const struct sched_class *sched_class; 17 struct sched_entity se; 18 struct sched_rt_entity rt; 19 #ifdef CONFIG_CGROUP_SCHED 20 struct task_group *sched_task_group; 21 #endif 22 23 #ifdef CONFIG_PREEMPT_NOTIFIERS 24 /* list of struct preempt_notifier: */ 25 struct hlist_head preempt_notifiers; 26 #endif 27 28 /* 29 * fpu_counter contains the number of consecutive context switches 30 * that the FPU is used. If this is over a threshold, the lazy fpu 31 * saving becomes unlazy to save the trap. This is an unsigned char 32 * so that after 256 times the counter wraps and the behavior turns 33 * lazy again; this to deal with bursty apps that only use FPU for 34 * a short time 35 */ 36 unsigned char fpu_counter; 37 #ifdef CONFIG_BLK_DEV_IO_TRACE 38 unsigned int btrace_seq; 39 #endif 40 41 unsigned int policy; 42 int nr_cpus_allowed; 43 cpumask_t cpus_allowed; 44 45 #ifdef CONFIG_PREEMPT_RCU 46 int rcu_read_lock_nesting; 47 char rcu_read_unlock_special; 48 struct list_head rcu_node_entry; 49 #endif /* #ifdef CONFIG_PREEMPT_RCU */ 50 #ifdef CONFIG_TREE_PREEMPT_RCU 51 struct rcu_node *rcu_blocked_node; 52 #endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */ 53 #ifdef CONFIG_RCU_BOOST 54 struct rt_mutex *rcu_boost_mutex; 55 #endif /* #ifdef CONFIG_RCU_BOOST */ 56 57 #if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT) 58 struct sched_info sched_info; 59 #endif 60 61 struct list_head tasks; 62 #ifdef CONFIG_SMP 63 struct plist_node pushable_tasks; 64 #endif 65 66 struct mm_struct *mm, *active_mm; 67 #ifdef CONFIG_COMPAT_BRK 68 unsigned brk_randomized:1; 69 #endif 70 #if defined(SPLIT_RSS_COUNTING) 71 struct task_rss_stat rss_stat; 72 #endif 73 /* task state */ 74 int exit_state; 75 int exit_code, exit_signal; 76 int pdeath_signal; /* The signal sent when the parent dies */ 77 unsigned int jobctl; /* JOBCTL_*, siglock protected */ 78 79 /* Used for emulating ABI behavior of previous Linux versions */ 80 unsigned int personality; 81 82 unsigned did_exec:1; 83 unsigned in_execve:1; /* Tell the LSMs that the process is doing an 84 * execve */ 85 unsigned in_iowait:1; 86 87 /* Revert to default priority/policy when forking */ 88 unsigned sched_reset_on_fork:1; 89 unsigned sched_contributes_to_load:1; 90 91 unsigned long atomic_flags; /* Flags needing atomic access. */ 92 93 pid_t pid; 94 pid_t tgid; 95 96 #ifdef CONFIG_CC_STACKPROTECTOR 97 /* Canary value for the -fstack-protector gcc feature */ 98 unsigned long stack_canary; 99 #endif 100 /* 101 * pointers to (original) parent process, youngest child, younger sibling, 102 * older sibling, respectively. (p->father can be replaced with 103 * p->real_parent->pid) 104 */ 105 struct task_struct __rcu *real_parent; /* real parent process */ 106 struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */ 107 /* 108 * children/sibling forms the list of my natural children 109 */ 110 struct list_head children; /* list of my children */ 111 struct list_head sibling; /* linkage in my parent's children list */ 112 struct task_struct *group_leader; /* threadgroup leader */ 113 114 #ifdef CONFIG_MTK_SCHED_CMP_TGS 115 raw_spinlock_t thread_group_info_lock; 116 struct thread_group_info_t thread_group_info[NUM_CLUSTER]; 117 #endif 118 119 /* 120 * ptraced is the list of tasks this task is using ptrace on. 121 * This includes both natural children and PTRACE_ATTACH targets. 122 * p->ptrace_entry is p's link on the p->parent->ptraced list. 123 */ 124 struct list_head ptraced; 125 struct list_head ptrace_entry; 126 127 /* PID/PID hash table linkage. */ 128 struct pid_link pids[PIDTYPE_MAX]; 129 struct list_head thread_group; 130 struct list_head thread_node; 131 132 struct completion *vfork_done; /* for vfork() */ 133 int __user *set_child_tid; /* CLONE_CHILD_SETTID */ 134 int __user *clear_child_tid; /* CLONE_CHILD_CLEARTID */ 135 136 cputime_t utime, stime, utimescaled, stimescaled; 137 cputime_t gtime; 138 #ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE 139 struct cputime prev_cputime; 140 #endif 141 #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN 142 seqlock_t vtime_seqlock; 143 unsigned long long vtime_snap; 144 enum { 145 VTIME_SLEEPING = 0, 146 VTIME_USER, 147 VTIME_SYS, 148 } vtime_snap_whence; 149 #endif 150 unsigned long nvcsw, nivcsw; /* context switch counts */ 151 struct timespec start_time; /* monotonic time */ 152 struct timespec real_start_time; /* boot based time */ 153 /* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */ 154 unsigned long min_flt, maj_flt; 155 /* for thrashing accounting */ 156 #ifdef CONFIG_ZRAM 157 unsigned long fm_flt, swap_in, swap_out; 158 #endif 159 160 struct task_cputime cputime_expires; 161 struct list_head cpu_timers[3]; 162 163 /* process credentials */ 164 const struct cred __rcu *real_cred; /* objective and real subjective task 165 * credentials (COW) */ 166 const struct cred __rcu *cred; /* effective (overridable) subjective task 167 * credentials (COW) */ 168 char comm[TASK_COMM_LEN]; /* executable name excluding path 169 - access with [gs]et_task_comm (which lock 170 it with task_lock()) 171 - initialized normally by setup_new_exec */ 172 /* file system info */ 173 int link_count, total_link_count; 174 #ifdef CONFIG_SYSVIPC 175 /* ipc stuff */ 176 struct sysv_sem sysvsem; 177 #endif 178 #ifdef CONFIG_DETECT_HUNG_TASK 179 /* hung task detection */ 180 unsigned long last_switch_count; 181 #endif 182 /* CPU-specific state of this task */ 183 struct thread_struct thread; 184 /* filesystem information */ 185 struct fs_struct *fs; 186 /* open file information */ 187 struct files_struct *files; 188 /* namespaces */ 189 struct nsproxy *nsproxy; 190 /* signal handlers */ 191 struct signal_struct *signal; 192 struct sighand_struct *sighand; 193 194 sigset_t blocked, real_blocked; 195 sigset_t saved_sigmask; /* restored if set_restore_sigmask() was used */ 196 struct sigpending pending; 197 198 unsigned long sas_ss_sp; 199 size_t sas_ss_size; 200 int (*notifier)(void *priv); 201 void *notifier_data; 202 sigset_t *notifier_mask; 203 struct callback_head *task_works; 204 205 struct audit_context *audit_context; 206 #ifdef CONFIG_AUDITSYSCALL 207 kuid_t loginuid; 208 unsigned int sessionid; 209 #endif 210 struct seccomp seccomp; 211 212 /* Thread group tracking */ 213 u32 parent_exec_id; 214 u32 self_exec_id; 215 /* Protection of (de-)allocation: mm, files, fs, tty, keyrings, mems_allowed, 216 * mempolicy */ 217 spinlock_t alloc_lock; 218 219 /* Protection of the PI data structures: */ 220 raw_spinlock_t pi_lock; 221 222 #ifdef CONFIG_RT_MUTEXES 223 /* PI waiters blocked on a rt_mutex held by this task */ 224 struct plist_head pi_waiters; 225 /* Deadlock detection and priority inheritance handling */ 226 struct rt_mutex_waiter *pi_blocked_on; 227 #endif 228 229 #ifdef CONFIG_DEBUG_MUTEXES 230 /* mutex deadlock detection */ 231 struct mutex_waiter *blocked_on; 232 #endif 233 #ifdef CONFIG_TRACE_IRQFLAGS 234 unsigned int irq_events; 235 unsigned long hardirq_enable_ip; 236 unsigned long hardirq_disable_ip; 237 unsigned int hardirq_enable_event; 238 unsigned int hardirq_disable_event; 239 int hardirqs_enabled; 240 int hardirq_context; 241 unsigned long softirq_disable_ip; 242 unsigned long softirq_enable_ip; 243 unsigned int softirq_disable_event; 244 unsigned int softirq_enable_event; 245 int softirqs_enabled; 246 int softirq_context; 247 #endif 248 #ifdef CONFIG_LOCKDEP 249 # define MAX_LOCK_DEPTH 48UL 250 u64 curr_chain_key; 251 int lockdep_depth; 252 unsigned int lockdep_recursion; 253 struct held_lock held_locks[MAX_LOCK_DEPTH]; 254 gfp_t lockdep_reclaim_gfp; 255 #endif 256 257 /* journalling filesystem info */ 258 void *journal_info; 259 260 /* stacked block device info */ 261 struct bio_list *bio_list; 262 263 #ifdef CONFIG_BLOCK 264 /* stack plugging */ 265 struct blk_plug *plug; 266 #endif 267 268 /* VM state */ 269 struct reclaim_state *reclaim_state; 270 271 struct backing_dev_info *backing_dev_info; 272 273 struct io_context *io_context; 274 275 unsigned long ptrace_message; 276 siginfo_t *last_siginfo; /* For ptrace use. */ 277 struct task_io_accounting ioac; 278 #if defined(CONFIG_TASK_XACCT) 279 u64 acct_rss_mem1; /* accumulated rss usage */ 280 u64 acct_vm_mem1; /* accumulated virtual memory usage */ 281 cputime_t acct_timexpd; /* stime + utime since last update */ 282 #endif 283 #ifdef CONFIG_CPUSETS 284 nodemask_t mems_allowed; /* Protected by alloc_lock */ 285 seqcount_t mems_allowed_seq; /* Seqence no to catch updates */ 286 int cpuset_mem_spread_rotor; 287 int cpuset_slab_spread_rotor; 288 #endif 289 #ifdef CONFIG_CGROUPS 290 /* Control Group info protected by css_set_lock */ 291 struct css_set __rcu *cgroups; 292 /* cg_list protected by css_set_lock and tsk->alloc_lock */ 293 struct list_head cg_list; 294 #endif 295 #ifdef CONFIG_FUTEX 296 struct robust_list_head __user *robust_list; 297 #ifdef CONFIG_COMPAT 298 struct compat_robust_list_head __user *compat_robust_list; 299 #endif 300 struct list_head pi_state_list; 301 struct futex_pi_state *pi_state_cache; 302 #endif 303 #ifdef CONFIG_PERF_EVENTS 304 struct perf_event_context *perf_event_ctxp[perf_nr_task_contexts]; 305 struct mutex perf_event_mutex; 306 struct list_head perf_event_list; 307 #endif 308 #ifdef CONFIG_NUMA 309 struct mempolicy *mempolicy; /* Protected by alloc_lock */ 310 short il_next; 311 short pref_node_fork; 312 #endif 313 #ifdef CONFIG_NUMA_BALANCING 314 int numa_scan_seq; 315 int numa_migrate_seq; 316 unsigned int numa_scan_period; 317 u64 node_stamp; /* migration stamp */ 318 struct callback_head numa_work; 319 #endif /* CONFIG_NUMA_BALANCING */ 320 321 struct rcu_head rcu; 322 323 /* 324 * cache last used pipe for splice 325 */ 326 struct pipe_inode_info *splice_pipe; 327 328 struct page_frag task_frag; 329 330 #ifdef CONFIG_TASK_DELAY_ACCT 331 struct task_delay_info *delays; 332 #endif 333 #ifdef CONFIG_FAULT_INJECTION 334 int make_it_fail; 335 #endif 336 /* 337 * when (nr_dirtied >= nr_dirtied_pause), it's time to call 338 * balance_dirty_pages() for some dirty throttling pause 339 */ 340 int nr_dirtied; 341 int nr_dirtied_pause; 342 unsigned long dirty_paused_when; /* start of a write-and-pause period */ 343 344 #ifdef CONFIG_LATENCYTOP 345 int latency_record_count; 346 struct latency_record latency_record[LT_SAVECOUNT]; 347 #endif 348 /* 349 * time slack values; these are used to round up poll() and 350 * select() etc timeout values. These are in nanoseconds. 351 */ 352 unsigned long timer_slack_ns; 353 unsigned long default_timer_slack_ns; 354 355 #ifdef CONFIG_FUNCTION_GRAPH_TRACER 356 /* Index of current stored address in ret_stack */ 357 int curr_ret_stack; 358 /* Stack of return addresses for return function tracing */ 359 struct ftrace_ret_stack *ret_stack; 360 /* time stamp for last schedule */ 361 unsigned long long ftrace_timestamp; 362 /* 363 * Number of functions that haven't been traced 364 * because of depth overrun. 365 */ 366 atomic_t trace_overrun; 367 /* Pause for the tracing */ 368 atomic_t tracing_graph_pause; 369 #endif 370 #ifdef CONFIG_TRACING 371 /* state flags for use by tracers */ 372 unsigned long trace; 373 /* bitmask and counter of trace recursion */ 374 unsigned long trace_recursion; 375 #endif /* CONFIG_TRACING */ 376 #ifdef CONFIG_MEMCG /* memcg uses this to do batch job */ 377 struct memcg_batch_info { 378 int do_batch; /* incremented when batch uncharge started */ 379 struct mem_cgroup *memcg; /* target memcg of uncharge */ 380 unsigned long nr_pages; /* uncharged usage */ 381 unsigned long memsw_nr_pages; /* uncharged mem+swap usage */ 382 } memcg_batch; 383 unsigned int memcg_kmem_skip_account; 384 struct memcg_oom_info { 385 struct mem_cgroup *memcg; 386 gfp_t gfp_mask; 387 int order; 388 unsigned int may_oom:1; 389 } memcg_oom; 390 #endif 391 #ifdef CONFIG_HAVE_HW_BREAKPOINT 392 atomic_t ptrace_bp_refcnt; 393 #endif 394 #ifdef CONFIG_UPROBES 395 struct uprobe_task *utask; 396 #endif 397 #if defined(CONFIG_BCACHE) || defined(CONFIG_BCACHE_MODULE) 398 unsigned int sequential_io; 399 unsigned int sequential_io_avg; 400 #endif 401 };
下面一个结构一个结构的看
1. volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
当前进程的状态,由以下宏定义
1 /* 2 * Task state bitmask. NOTE! These bits are also 3 * encoded in fs/proc/array.c: get_task_state(). 4 * 5 * We have two separate sets of flags: task->state 6 * is about runnability, while task->exit_state are 7 * about the task exiting. Confusing, but this way 8 * modifying one set can't modify the other one by 9 * mistake. 10 */ 11 #define TASK_RUNNING 0 12 #define TASK_INTERRUPTIBLE 1 13 #define TASK_UNINTERRUPTIBLE 2 14 #define __TASK_STOPPED 4 15 #define __TASK_TRACED 8 16 /* in tsk->exit_state */ 17 #define EXIT_ZOMBIE 16 18 #define EXIT_DEAD 32 19 /* in tsk->state again */ 20 #define TASK_DEAD 64 21 #define TASK_WAKEKILL 128 22 #define TASK_WAKING 256 23 #define TASK_PARKED 512 24 #define TASK_STATE_MAX 1024
宏定义还包含了exit state的状态
还有以下组合宏,以方便使用
1 /* Convenience macros for the sake of set_task_state */ 2 #define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE) 3 #define TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED) 4 #define TASK_TRACED (TASK_WAKEKILL | __TASK_TRACED) 5 6 /* Convenience macros for the sake of wake_up */ 7 #define TASK_NORMAL (TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE) 8 #define TASK_ALL (TASK_NORMAL | __TASK_STOPPED | __TASK_TRACED) 9 10 /* get_task_state() */ 11 #define TASK_REPORT (TASK_RUNNING | TASK_INTERRUPTIBLE | \ 12 TASK_UNINTERRUPTIBLE | __TASK_STOPPED | \ 13 __TASK_TRACED)
判断task状态的宏
1 #define task_is_traced(task) ((task->state & __TASK_TRACED) != 0) 2 #define task_is_stopped(task) ((task->state & __TASK_STOPPED) != 0) 3 #define task_is_dead(task) ((task)->exit_state != 0) 4 #define task_is_stopped_or_traced(task) \ 5 ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0) 6 #define task_contributes_to_load(task) \ 7 ((task->state & TASK_UNINTERRUPTIBLE) != 0 && \ 8 (task->flags & PF_FROZEN) == 0)
设置task state的宏,分为mb顺序执行版本和读写内存操作乱序执行版本
1 #define __set_task_state(tsk, state_value) \ 2 do { (tsk)->state = (state_value); } while (0) 3 #define set_task_state(tsk, state_value) \ 4 set_mb((tsk)->state, (state_value)) 5 6 /* 7 * set_current_state() includes a barrier so that the write of current->state 8 * is correctly serialised wrt the caller's subsequent test of whether to 9 * actually sleep: 10 * 11 * set_current_state(TASK_UNINTERRUPTIBLE); 12 * if (do_i_need_to_sleep()) 13 * schedule(); 14 * 15 * If the caller does not need such serialisation then use __set_current_state() 16 */ 17 #define __set_current_state(state_value) \ 18 do { current->state = (state_value); } while (0) 19 #define set_current_state(state_value) \ 20 set_mb(current->state, (state_value))
task command名长度宏
1 /* Task command name length */ 2 #define TASK_COMM_LEN 16
下边这两个不知道干什么用的
1 #define TASK_STATE_TO_CHAR_STR "RSDTtZXxKWP" 2 3 extern char ___assert_task_state[1 - 2*!!( 4 sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1)];
2. void *stack;
指明进程stack地址
3. atomic_t usage;
fork里边用到,但暂时不知道作用
4. unsigned int flags; /* per process flags, defined below */
每个进程的flag,定义如下
/* * Per process flags */ #define PF_EXITING 0x00000004 /* getting shut down */ #define PF_EXITPIDONE 0x00000008 /* pi exit done on shut down */ #define PF_VCPU 0x00000010 /* I'm a virtual CPU */ #define PF_WQ_WORKER 0x00000020 /* I'm a workqueue worker */ #define PF_FORKNOEXEC 0x00000040 /* forked but didn't exec */ #define PF_MCE_PROCESS 0x00000080 /* process policy on mce errors */ #define PF_SUPERPRIV 0x00000100 /* used super-user privileges */ #define PF_DUMPCORE 0x00000200 /* dumped core */ #define PF_SIGNALED 0x00000400 /* killed by a signal */ #define PF_MEMALLOC 0x00000800 /* Allocating memory */ #define PF_NPROC_EXCEEDED 0x00001000 /* set_user noticed that RLIMIT_NPROC was exceeded */ #define PF_USED_MATH 0x00002000 /* if unset the fpu must be initialized before use */ #define PF_USED_ASYNC 0x00004000 /* used async_schedule*(), used by module init */ #define PF_NOFREEZE 0x00008000 /* this thread should not be frozen */ #define PF_FROZEN 0x00010000 /* frozen for system suspend */ #define PF_FSTRANS 0x00020000 /* inside a filesystem transaction */ #define PF_KSWAPD 0x00040000 /* I am kswapd */ #define PF_MEMALLOC_NOIO 0x00080000 /* Allocating memory without IO involved */ #define PF_LESS_THROTTLE 0x00100000 /* Throttle me less: I clean memory */ #define PF_KTHREAD 0x00200000 /* I am a kernel thread */ #define PF_RANDOMIZE 0x00400000 /* randomize virtual address space */ #define PF_SWAPWRITE 0x00800000 /* Allowed to write to swap */ #define PF_SPREAD_PAGE 0x01000000 /* Spread page cache over cpuset */ #define PF_SPREAD_SLAB 0x02000000 /* Spread some slab caches over cpuset */ #define PF_NO_SETAFFINITY 0x04000000 /* Userland is not allowed to meddle with cpus_allowed */ #define PF_MCE_EARLY 0x08000000 /* Early kill for mce process policy */ #define PF_MEMPOLICY 0x10000000 /* Non-default NUMA mempolicy */ #define PF_MUTEX_TESTER 0x20000000 /* Thread belongs to the rt mutex tester */ #define PF_FREEZER_SKIP 0x40000000 /* Freezer should not count it as freezable */ #define PF_MTKPASR 0x80000000 /* I am in MTKPASR process */
下边的宏操作flag,mtk的定制flag和fpu的使用有关,包括了current和非current的
1 #define task_in_mtkpasr(task) unlikely(task->flags & PF_MTKPASR) 2 3 /* 4 * Only the _current_ task can read/write to tsk->flags, but other 5 * tasks can access tsk->flags in readonly mode for example 6 * with tsk_used_math (like during threaded core dumping). 7 * There is however an exception to this rule during ptrace 8 * or during fork: the ptracer task is allowed to write to the 9 * child->flags of its traced child (same goes for fork, the parent 10 * can write to the child->flags), because we're guaranteed the 11 * child is not running and in turn not changing child->flags 12 * at the same time the parent does it. 13 */ 14 #define clear_stopped_child_used_math(child) do { (child)->flags &= ~PF_USED_MATH; } while (0) 15 #define set_stopped_child_used_math(child) do { (child)->flags |= PF_USED_MATH; } while (0) 16 #define clear_used_math() clear_stopped_child_used_math(current) 17 #define set_used_math() set_stopped_child_used_math(current) 18 #define conditional_stopped_child_used_math(condition, child) \ 19 do { (child)->flags &= ~PF_USED_MATH, (child)->flags |= (condition) ? PF_USED_MATH : 0; } while (0) 20 #define conditional_used_math(condition) \ 21 conditional_stopped_child_used_math(condition, current) 22 #define copy_to_stopped_child_used_math(child) \ 23 do { (child)->flags &= ~PF_USED_MATH, (child)->flags |= current->flags & PF_USED_MATH; } while (0) 24 /* NOTE: this will return 0 or PF_USED_MATH, it will never return 1 */ 25 #define tsk_used_math(p) ((p)->flags & PF_USED_MATH) 26 #define used_math() tsk_used_math(current)
memory alloc no io相关的操作
1 /* __GFP_IO isn't allowed if PF_MEMALLOC_NOIO is set in current->flags 2 * __GFP_FS is also cleared as it implies __GFP_IO. 3 */ 4 static inline gfp_t memalloc_noio_flags(gfp_t flags) 5 { 6 if (unlikely(current->flags & PF_MEMALLOC_NOIO)) 7 flags &= ~(__GFP_IO | __GFP_FS); 8 return flags; 9 } 10 11 static inline unsigned int memalloc_noio_save(void) 12 { 13 unsigned int flags = current->flags & PF_MEMALLOC_NOIO; 14 current->flags |= PF_MEMALLOC_NOIO; 15 return flags; 16 } 17 18 static inline void memalloc_noio_restore(unsigned int flags) 19 { 20 current->flags = (current->flags & ~PF_MEMALLOC_NOIO) | flags; 21 }
5. unsigned int ptrace;
跟ptrace相关,目前不知道怎么用
6.
1 #ifdef CONFIG_SMP 2 struct llist_node wake_entry;
被唤醒对象的linked list
7.
1 int on_cpu; 2 #endif
进程跑在哪个CPU上
8. int on_rq;
不清楚
9. 10. 11. int prio, static_prio, normal_prio;
进程的优先级
12. unsigned int rt_priority;
实时优先级
13. const struct sched_class *sched_class;
调度类别
14. struct sched_entity se;
调度实体
15. struct sched_rt_entity rt;
实时调度实体
16.
1 #ifdef CONFIG_CGROUP_SCHED 2 struct task_group *sched_task_group; 3 #endif
调度任务组
17.
1 #ifdef CONFIG_PREEMPT_NOTIFIERS 2 /* list of struct preempt_notifier: */ 3 struct hlist_head preempt_notifiers; 4 #endif
抢占通知hlist,MTK没定义宏 CONFIG_PREEMPT_NOTIFIERS
18.
1 /* 2 * fpu_counter contains the number of consecutive context switches 3 * that the FPU is used. If this is over a threshold, the lazy fpu 4 * saving becomes unlazy to save the trap. This is an unsigned char 5 * so that after 256 times the counter wraps and the behavior turns 6 * lazy again; this to deal with bursty apps that only use FPU for 7 * a short time 8 */ 9 unsigned char fpu_counter;
不清楚
19.
1 #ifdef CONFIG_BLK_DEV_IO_TRACE 2 unsigned int btrace_seq; 3 #endif
不清楚
20. unsigned int policy;
策略
21. int nr_cpus_allowed;
允许的CPU数量
22. cpumask_t cpus_allowed;
不清楚,类型 cpumask_t 要看
23.
1 #ifdef CONFIG_PREEMPT_RCU 2 int rcu_read_lock_nesting
rcu读锁的嵌套层数
24. 25.
1 char rcu_read_unlock_special; 2 struct list_head rcu_node_entry; 3 #endif /* #ifdef CONFIG_PREEMPT_RCU */
不清楚
26.
1 #ifdef CONFIG_TREE_PREEMPT_RCU 2 struct rcu_node *rcu_blocked_node; 3 #endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */
不清楚
27.
1 #ifdef CONFIG_RCU_BOOST 2 struct rt_mutex *rcu_boost_mutex; 3 #endif /* #ifdef CONFIG_RCU_BOOST */
不清楚,MTK没定义宏 CONFIG_RCU_BOOST
28.
1 #if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT) 2 struct sched_info sched_info; 3 #endif
调度信息,宏 CONFIG_SCHEDSTATS 和 CONFIG_TASK_DELAY_ACCT 未定义
29. struct list_head tasks;
tasks列表,不知道是否为子进程列表
30.
1 #ifdef CONFIG_SMP 2 struct plist_node pushable_tasks; 3 #endif
不清楚
31. 32 struct mm_struct *mm, *active_mm;
该进程内存管理的数据结构
33.
1 #ifdef CONFIG_COMPAT_BRK 2 unsigned brk_randomized:1; 3 #endif
不清楚
34.
1 #if defined(SPLIT_RSS_COUNTING) 2 struct task_rss_stat rss_stat; 3 #endif
不清楚
35.
1 /* task state */ 2 int exit_state;
进程退出时的状态
36. 37. int exit_code, exit_signal;
进程退出码和退出信号量
38. int pdeath_signal; /* The signal sent when the parent dies */
父进程死掉的信号量
39. unsigned int jobctl; /* JOBCTL_*, siglock protected */
job ctrl,信号锁保护
与之相关的宏定义如下
1 /* 2 * task->jobctl flags 3 */ 4 #define JOBCTL_STOP_SIGMASK 0xffff /* signr of the last group stop */ 5 6 #define JOBCTL_STOP_DEQUEUED_BIT 16 /* stop signal dequeued */ 7 #define JOBCTL_STOP_PENDING_BIT 17 /* task should stop for group stop */ 8 #define JOBCTL_STOP_CONSUME_BIT 18 /* consume group stop count */ 9 #define JOBCTL_TRAP_STOP_BIT 19 /* trap for STOP */ 10 #define JOBCTL_TRAP_NOTIFY_BIT 20 /* trap for NOTIFY */ 11 #define JOBCTL_TRAPPING_BIT 21 /* switching to TRACED */ 12 #define JOBCTL_LISTENING_BIT 22 /* ptracer is listening for events */ 13 14 #define JOBCTL_STOP_DEQUEUED (1 << JOBCTL_STOP_DEQUEUED_BIT) 15 #define JOBCTL_STOP_PENDING (1 << JOBCTL_STOP_PENDING_BIT) 16 #define JOBCTL_STOP_CONSUME (1 << JOBCTL_STOP_CONSUME_BIT) 17 #define JOBCTL_TRAP_STOP (1 << JOBCTL_TRAP_STOP_BIT) 18 #define JOBCTL_TRAP_NOTIFY (1 << JOBCTL_TRAP_NOTIFY_BIT) 19 #define JOBCTL_TRAPPING (1 << JOBCTL_TRAPPING_BIT) 20 #define JOBCTL_LISTENING (1 << JOBCTL_LISTENING_BIT) 21 22 #define JOBCTL_TRAP_MASK (JOBCTL_TRAP_STOP | JOBCTL_TRAP_NOTIFY) 23 #define JOBCTL_PENDING_MASK (JOBCTL_STOP_PENDING | JOBCTL_TRAP_MASK)
操作函数的声明如下,具体的实现位于 kernel/signal.c 文件中
1 extern bool task_set_jobctl_pending(struct task_struct *task, 2 unsigned int mask); 3 extern void task_clear_jobctl_trapping(struct task_struct *task); 4 extern void task_clear_jobctl_pending(struct task_struct *task, 5 unsigned int mask);
40.
1 /* Used for emulating ABI behavior of previous Linux versions */ 2 unsigned int personality;
不清楚
41. unsigned did_exec:1;
不清楚
42.
1 unsigned in_execve:1; /* Tell the LSMs that the process is doing an 2 * execve */
进程在执行中
43. unsigned in_iowait:1;
进程在IO等待中
44.
1 /* Revert to default priority/policy when forking */ 2 unsigned sched_reset_on_fork:1;
在fork的时候调度reset
45. unsigned sched_contributes_to_load:1;
调度对负载的影响
46. unsigned long atomic_flags; /* Flags needing atomic access. */
需要原子操作的flag
下边为跟此flag有关的宏和函数
1 /* Per-process atomic flags. */ 2 #define PFA_NO_NEW_PRIVS 0x00000001 /* May not gain new privileges. */ 3 4 static inline bool task_no_new_privs(struct task_struct *p) 5 { 6 return test_bit(PFA_NO_NEW_PRIVS, &p->atomic_flags); 7 } 8 9 static inline void task_set_no_new_privs(struct task_struct *p) 10 { 11 set_bit(PFA_NO_NEW_PRIVS, &p->atomic_flags); 12 }
47. pid_t pid;
进程pid
48. pid_t tgid;
threadgroup id
49.
1 #ifdef CONFIG_CC_STACKPROTECTOR 2 /* Canary value for the -fstack-protector gcc feature */ 3 unsigned long stack_canary; 4 #endif
栈金丝雀,防止栈被篡改,宏 CONFIG_CC_STACKPROTECTOR 未定义
50.
1 /* 2 * pointers to (original) parent process, youngest child, younger sibling, 3 * older sibling, respectively. (p->father can be replaced with 4 * p->real_parent->pid) 5 */ 6 struct task_struct __rcu *real_parent; /* real parent process */
真正的父进程
51. struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */
不清楚
52.
1 /* 2 * children/sibling forms the list of my natural children 3 */ 4 struct list_head children; /* list of my children */
子进程的list
53. struct list_head sibling; /* linkage in my parent's children list */
兄弟姐妹的list
54. struct task_struct *group_leader; /* threadgroup leader */
thread group的leader
55. 56.
1 #ifdef CONFIG_MTK_SCHED_CMP_TGS 2 raw_spinlock_t thread_group_info_lock; 3 struct thread_group_info_t thread_group_info[NUM_CLUSTER]; 4 #endif
不清楚,宏 CONFIG_MTK_SCHED_CMP_TGS 未定义
57. 58.
1 /* 2 * ptraced is the list of tasks this task is using ptrace on. 3 * This includes both natural children and PTRACE_ATTACH targets. 4 * p->ptrace_entry is p's link on the p->parent->ptraced list. 5 */ 6 struct list_head ptraced; 7 struct list_head ptrace_entry;
不清楚
59.
1 /* PID/PID hash table linkage. */ 2 struct pid_link pids[PIDTYPE_MAX];
跟进程namespace相关,不清楚
60. struct list_head thread_group;
thread group
61. struct list_head thread_node;
不清楚
62. struct completion *vfork_done; /* for vfork() */
不清楚
63. struct completion *vfork_done; /* for vfork() */
vfork是否完成
64. 65.
1 int __user *set_child_tid; /* CLONE_CHILD_SETTID */ 2 int __user *clear_child_tid; /* CLONE_CHILD_CLEARTID */
不清楚
66. 67. 68. 69. 70.
1 cputime_t utime, stime, utimescaled, stimescaled; 2 cputime_t gtime;
不清楚
71.
1 #ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE 2 struct cputime prev_cputime; 3 #endif
不清楚,宏 CONFIG_VIRT_CPU_ACCOUNTING_NATIVE 未定义
72. 73.
1 #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN 2 seqlock_t vtime_seqlock; 3 unsigned long long vtime_snap; 4 enum { 5 VTIME_SLEEPING = 0, 6 VTIME_USER, 7 VTIME_SYS, 8 } vtime_snap_whence; 9 #endif
不清楚,宏 CONFIG_VIRT_CPU_ACCOUNTING_GEN 未定义
74. 75.
unsigned long nvcsw, nivcsw; /* context switch counts */
不清楚
76. struct timespec start_time; /* monotonic time */
不清楚,单调时间不清楚
77. struct timespec real_start_time; /* boot based time */
真实启动时间
78. 79.
1 /* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */ 2 unsigned long min_flt, maj_flt;
不清楚
80. 81. 82.
1 /* for thrashing accounting */ 2 #ifdef CONFIG_ZRAM 3 unsigned long fm_flt, swap_in, swap_out; 4 #endif
不清楚,宏 CONFIG_ZRAM 未定义
83. struct task_cputime cputime_expires;
cputime到期
84. struct list_head cpu_timers[3];
不清楚
85. 86. 87.
1 /* process credentials */ 2 const struct cred __rcu *real_cred; /* objective and real subjective task 3 * credentials (COW) */ 4 const struct cred __rcu *cred; /* effective (overridable) subjective task 5 * credentials (COW) */ 6 char comm[TASK_COMM_LEN]; /* executable name excluding path 7 - access with [gs]et_task_comm (which lock 8 it with task_lock()) 9 - initialized normally by setup_new_exec */
不清楚,什么是process credential
88. 89.
1 /* file system info */ 2 int link_count, total_link_count;
link数和总共link数
90.
1 #ifdef CONFIG_SYSVIPC 2 /* ipc stuff */ 3 struct sysv_sem sysvsem; 4 #endif
IPC相关,宏 CONFIG_SYSVIPC 未定义
91.
1 #ifdef CONFIG_DETECT_HUNG_TASK 2 /* hung task detection */ 3 unsigned long last_switch_count; 4 #endif
task hung检测,宏 CONFIG_DETECT_HUNG_TASK 未定义
92.
1 /* CPU-specific state of this task */ 2 struct thread_struct thread;
task跟cpu相关的状态
93.
1 /* filesystem information */ 2 struct fs_struct *fs;
这个进程与之相关的文件系统
94.
1 /* open file information */ 2 struct files_struct *files;
这个进程打开的文件
95.
1 /* namespaces */ 2 struct nsproxy *nsproxy;
进程的namespace代理
96.
1 /* signal handlers */ 2 struct signal_struct *signal;
进程的信号
97. struct sighand_struct *sighand;
signal handler
98. 99. 100. 101.
1 sigset_t blocked, real_blocked; 2 sigset_t saved_sigmask; /* restored if set_restore_sigmask() was used */ 3 struct sigpending pending;
不清楚
102.
1 unsigned long sas_ss_sp; 2 size_t sas_ss_size;
不清楚
103. 104. 105.
1 int (*notifier)(void *priv); 2 void *notifier_data; 3 sigset_t *notifier_mask;
notifier相关,不清楚具体通知什么
106. struct callback_head *task_works;
进程的回调队列
107. struct audit_context *audit_context;
不清楚
108.
1 #ifdef CONFIG_AUDITSYSCALL 2 kuid_t loginuid; 3 unsigned int sessionid; 4 #endif
不清楚,宏 CONFIG_AUDITSYSCALL 未定义
109. struct seccomp seccomp;
不清楚
110. 111.
1 /* Thread group tracking */ 2 u32 parent_exec_id; 3 u32 self_exec_id;
thread group中parent和self的执行id
112.
1 /* Protection of (de-)allocation: mm, files, fs, tty, keyrings, mems_allowed, 2 * mempolicy */ 3 spinlock_t alloc_lock;
mm、files、fs、tty、keyrings、mems_allowed、mempolicy分配的锁
113.
1 /* Protection of the PI data structures: */ 2 raw_spinlock_t pi_lock;
pi data锁,不清楚pi是什么
114. 115.
1 #ifdef CONFIG_RT_MUTEXES 2 /* PI waiters blocked on a rt_mutex held by this task */ 3 struct plist_head pi_waiters; 4 /* Deadlock detection and priority inheritance handling */ 5 struct rt_mutex_waiter *pi_blocked_on; 6 #endif
不清楚,宏 CONFIG_RT_MUTEXES 有定义
116.
1 #ifdef CONFIG_DEBUG_MUTEXES 2 /* mutex deadlock detection */ 3 struct mutex_waiter *blocked_on; 4 #endif
不清楚,宏 CONFIG_DEBUG_MUTEXES 未定义
117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129.
1 #ifdef CONFIG_TRACE_IRQFLAGS 2 unsigned int irq_events; 3 unsigned long hardirq_enable_ip; 4 unsigned long hardirq_disable_ip; 5 unsigned int hardirq_enable_event; 6 unsigned int hardirq_disable_event; 7 int hardirqs_enabled; 8 int hardirq_context; 9 unsigned long softirq_disable_ip; 10 unsigned long softirq_enable_ip; 11 unsigned int softirq_disable_event; 12 unsigned int softirq_enable_event; 13 int softirqs_enabled; 14 int softirq_context; 15 #endif
中断跟踪,包括总的中断数、hard和soft中断的enable、disable中断数,不清楚ip是什么意思
130. 131. 132. 133. 134.
1 #ifdef CONFIG_LOCKDEP 2 # define MAX_LOCK_DEPTH 48UL 3 u64 curr_chain_key; 4 int lockdep_depth; 5 unsigned int lockdep_recursion; 6 struct held_lock held_locks[MAX_LOCK_DEPTH]; 7 gfp_t lockdep_reclaim_gfp; 8 #endif
跟锁依赖有关,不清楚具体做什么
135.
1 /* journalling filesystem info */ 2 void *journal_info;
文件系统的日志
136.
1 /* stacked block device info */ 2 struct bio_list *bio_list;
被存入堆栈的block device io list
137.
1 #ifdef CONFIG_BLOCK 2 /* stack plugging */ 3 struct blk_plug *plug; 4 #endif
block device的插拔
138.
1 /* VM state */ 2 struct reclaim_state *reclaim_state;
不清楚
139. struct backing_dev_info *backing_dev_info;
不清楚
140. struct io_context *io_context;
进程的io context
141. unsigned long ptrace_message;
ptrace message
142. siginfo_t *last_siginfo; /* For ptrace use. */
最后的signal信息
143. struct task_io_accounting ioac;
task io计数
144. 145. 146.
1 #if defined(CONFIG_TASK_XACCT) 2 u64 acct_rss_mem1; /* accumulated rss usage */ 3 u64 acct_vm_mem1; /* accumulated virtual memory usage */ 4 cputime_t acct_timexpd; /* stime + utime since last update */ 5 #endif
累积的rss memory、virtual memory、time话费,宏 CONFIG_TASK_XACCT 未定义
147. 148. 149. 150.
1 #ifdef CONFIG_CPUSETS 2 nodemask_t mems_allowed; /* Protected by alloc_lock */ 3 seqcount_t mems_allowed_seq; /* Seqence no to catch updates */ 4 int cpuset_mem_spread_rotor; 5 int cpuset_slab_spread_rotor; 6 #endif
不清楚,宏 CONFIG_CPUSETS 未定义
151. 152.
1 #ifdef CONFIG_CGROUPS 2 /* Control Group info protected by css_set_lock */ 3 struct css_set __rcu *cgroups; 4 /* cg_list protected by css_set_lock and tsk->alloc_lock */ 5 struct list_head cg_list; 6 #endif
css(cgroups subsys state)的cgroups和cgroup list
153. 154. 155. 156
1 #ifdef CONFIG_FUTEX 2 struct robust_list_head __user *robust_list; 3 #ifdef CONFIG_COMPAT 4 struct compat_robust_list_head __user *compat_robust_list; 5 #endif 6 struct list_head pi_state_list; 7 struct futex_pi_state *pi_state_cache; 8 #endif
不清楚,宏 CONFIG_FUTEX 未定义
157. 158. 159.
1 #ifdef CONFIG_PERF_EVENTS 2 struct perf_event_context *perf_event_ctxp[perf_nr_task_contexts]; 3 struct mutex perf_event_mutex; 4 struct list_head perf_event_list; 5 #endif
performance相关的event context数组、event mutex、event list
160. 161. 162.
1 #ifdef CONFIG_NUMA 2 struct mempolicy *mempolicy; /* Protected by alloc_lock */ 3 short il_next; 4 short pref_node_fork; 5 #endif
不清楚,宏 CONFIG_NUMA (Non-uniform memory access )未定义
163. 164. 165. 166. 167.
1 #ifdef CONFIG_NUMA_BALANCING 2 int numa_scan_seq; 3 int numa_migrate_seq; 4 unsigned int numa_scan_period; 5 u64 node_stamp; /* migration stamp */ 6 struct callback_head numa_work; 7 #endif /* CONFIG_NUMA_BALANCING */
不清楚
168. struct rcu_head rcu;
read copy update头
169.
1 /* 2 * cache last used pipe for splice 3 */ 4 struct pipe_inode_info *splice_pipe;
不清楚
170.
1 /* 2 * cache last used pipe for splice 3 */ 4 struct pipe_inode_info *splice_pipe;
splice pipe的信息
171. struct page_frag task_frag;
task的page fragment
172.
1 #ifdef CONFIG_TASK_DELAY_ACCT 2 struct task_delay_info *delays; 3 #endif
不清楚,宏 CONFIG_TASK_DELAY_ACCT 未定义
173.
1 #ifdef CONFIG_FAULT_INJECTION 2 int make_it_fail; 3 #endif
不清楚
174. 175. 176.
1 /* 2 * when (nr_dirtied >= nr_dirtied_pause), it's time to call 3 * balance_dirty_pages() for some dirty throttling pause 4 */ 5 int nr_dirtied; 6 int nr_dirtied_pause; 7 unsigned long dirty_paused_when; /* start of a write-and-pause period */
dirty page相关
177. 178.
1 #ifdef CONFIG_LATENCYTOP 2 int latency_record_count; 3 struct latency_record latency_record[LT_SAVECOUNT]; 4 #endif
不清楚,宏 CONFIG_LATENCYTOP 未定义
179. 180.
1 /* 2 * time slack values; these are used to round up poll() and 3 * select() etc timeout values. These are in nanoseconds. 4 */ 5 unsigned long timer_slack_ns; 6 unsigned long default_timer_slack_ns;
poll()和select()等的timeout值
181. 182. 183. 184. 185.
1 #ifdef CONFIG_FUNCTION_GRAPH_TRACER 2 /* Index of current stored address in ret_stack */ 3 int curr_ret_stack; 4 /* Stack of return addresses for return function tracing */ 5 struct ftrace_ret_stack *ret_stack; 6 /* time stamp for last schedule */ 7 unsigned long long ftrace_timestamp; 8 /* 9 * Number of functions that haven't been traced 10 * because of depth overrun. 11 */ 12 atomic_t trace_overrun; 13 /* Pause for the tracing */ 14 atomic_t tracing_graph_pause; 15 #endif
ftrace的图形化跟踪变量,宏 CONFIG_FUNCTION_GRAPH_TRACER 未定义
186. 187.
1 #ifdef CONFIG_TRACING 2 /* state flags for use by tracers */ 3 unsigned long trace; 4 /* bitmask and counter of trace recursion */ 5 unsigned long trace_recursion; 6 #endif /* CONFIG_TRACING */
trace的flag和trace递归的数量和bitmask
188. 189. 190
1 #ifdef CONFIG_MEMCG /* memcg uses this to do batch job */ 2 struct memcg_batch_info { 3 int do_batch; /* incremented when batch uncharge started */ 4 struct mem_cgroup *memcg; /* target memcg of uncharge */ 5 unsigned long nr_pages; /* uncharged usage */ 6 unsigned long memsw_nr_pages; /* uncharged mem+swap usage */ 7 } memcg_batch; 8 unsigned int memcg_kmem_skip_account; 9 struct memcg_oom_info { 10 struct mem_cgroup *memcg; 11 gfp_t gfp_mask; 12 int order; 13 unsigned int may_oom:1; 14 } memcg_oom; 15 #endif
不清楚,宏 CONFIG_MEMCG 未定义
191.
1 #ifdef CONFIG_HAVE_HW_BREAKPOINT 2 atomic_t ptrace_bp_refcnt; 3 #endif
ptrace的断点引用数量
192.
1 #ifdef CONFIG_UPROBES 2 struct uprobe_task *utask; 3 #endif
不清楚,宏 CONFIG_UPROBES 未定义
193. 194.
1 #if defined(CONFIG_BCACHE) || defined(CONFIG_BCACHE_MODULE) 2 unsigned int sequential_io; 3 unsigned int sequential_io_avg; 4 #endif
不清楚,宏 CONFIG_BCACHE 和 CONFIG_BCACHE 未定义