xref: /linux-6.15/include/linux/pid.h (revision 4bedea94)
1 #ifndef _LINUX_PID_H
2 #define _LINUX_PID_H
3 
4 enum pid_type
5 {
6 	PIDTYPE_PID,
7 	PIDTYPE_TGID,
8 	PIDTYPE_PGID,
9 	PIDTYPE_SID,
10 	PIDTYPE_MAX
11 };
12 
13 struct pid
14 {
15 	/* Try to keep pid_chain in the same cacheline as nr for find_pid */
16 	int nr;
17 	struct hlist_node pid_chain;
18 	/* list of pids with the same nr, only one of them is in the hash */
19 	struct list_head pid_list;
20 };
21 
22 #define pid_task(elem, type) \
23 	list_entry(elem, struct task_struct, pids[type].pid_list)
24 
25 /*
26  * attach_pid() and detach_pid() must be called with the tasklist_lock
27  * write-held.
28  */
29 extern int FASTCALL(attach_pid(struct task_struct *task, enum pid_type type, int nr));
30 
31 extern void FASTCALL(detach_pid(struct task_struct *task, enum pid_type));
32 
33 /*
34  * look up a PID in the hash table. Must be called with the tasklist_lock
35  * held.
36  */
37 extern struct pid *FASTCALL(find_pid(enum pid_type, int));
38 
39 extern int alloc_pidmap(void);
40 extern void FASTCALL(free_pidmap(int));
41 extern void switch_exec_pids(struct task_struct *leader, struct task_struct *thread);
42 
43 #define do_each_task_pid(who, type, task)				\
44 	if ((task = find_task_by_pid_type(type, who))) {		\
45 		prefetch((task)->pids[type].pid_list.next);		\
46 		do {
47 
48 #define while_each_task_pid(who, type, task)				\
49 		} while (task = pid_task((task)->pids[type].pid_list.next,\
50 						type),			\
51 			prefetch((task)->pids[type].pid_list.next),	\
52 			hlist_unhashed(&(task)->pids[type].pid_chain));	\
53 	}								\
54 
55 #endif /* _LINUX_PID_H */
56