Files
linux-apfs/include/linux/pid.h
T

202 lines
5.8 KiB
C
Raw Normal View History

/* SPDX-License-Identifier: GPL-2.0 */
2005-04-16 15:20:36 -07:00
#ifndef _LINUX_PID_H
#define _LINUX_PID_H
#include <linux/rculist.h>
2005-04-16 15:20:36 -07:00
enum pid_type
{
PIDTYPE_PID,
PIDTYPE_PGID,
PIDTYPE_SID,
2017-08-21 17:35:02 +02:00
PIDTYPE_MAX,
/* only valid to __task_pid_nr_ns() */
__PIDTYPE_TGID
2005-04-16 15:20:36 -07:00
};
/*
* What is struct pid?
*
* A struct pid is the kernel's internal notion of a process identifier.
* It refers to individual tasks, process groups, and sessions. While
* there are processes attached to it the struct pid lives in a hash
* table, so it and then the processes that it refers to can be found
* quickly from the numeric pid value. The attached processes may be
* quickly accessed by following pointers from struct pid.
*
2011-03-30 22:57:33 -03:00
* Storing pid_t values in the kernel and referring to them later has a
* problem. The process originally with that pid may have exited and the
* pid allocator wrapped, and another process could have come along
* and been assigned that pid.
*
* Referring to user space processes by holding a reference to struct
* task_struct has a problem. When the user space process exits
* the now useless task_struct is still kept. A task_struct plus a
* stack consumes around 10K of low kernel memory. More precisely
* this is THREAD_SIZE + sizeof(struct task_struct). By comparison
* a struct pid is about 64 bytes.
*
* Holding a reference to struct pid solves both of these problems.
* It is small so holding a reference does not consume a lot of
2006-12-08 02:38:01 -08:00
* resources, and since a new struct pid is allocated when the numeric pid
* value is reused (when pids wrap around) we don't mistakenly refer to new
* processes.
*/
2007-10-18 23:40:03 -07:00
/*
* struct upid is used to get the id of the struct pid, as it is
* seen in particular namespace. Later the struct pid is found with
* find_pid_ns() using the int nr and struct pid_namespace *ns.
*/
struct upid {
int nr;
struct pid_namespace *ns;
};
2005-04-16 15:20:36 -07:00
struct pid
{
atomic_t count;
unsigned int level;
/* lists of tasks that use this pid */
struct hlist_head tasks[PIDTYPE_MAX];
struct rcu_head rcu;
2007-10-18 23:40:03 -07:00
struct upid numbers[1];
2005-04-16 15:20:36 -07:00
};
extern struct pid init_struct_pid;
struct pid_link
{
struct hlist_node node;
struct pid *pid;
};
static inline struct pid *get_pid(struct pid *pid)
{
if (pid)
atomic_inc(&pid->count);
return pid;
}
extern void put_pid(struct pid *pid);
extern struct task_struct *pid_task(struct pid *pid, enum pid_type);
extern struct task_struct *get_pid_task(struct pid *pid, enum pid_type);
2005-04-16 15:20:36 -07:00
extern struct pid *get_task_pid(struct task_struct *task, enum pid_type type);
2005-04-16 15:20:36 -07:00
/*
* these helpers must be called with the tasklist_lock write-held.
2005-04-16 15:20:36 -07:00
*/
extern void attach_pid(struct task_struct *task, enum pid_type);
extern void detach_pid(struct task_struct *task, enum pid_type);
2008-04-30 00:54:26 -07:00
extern void change_pid(struct task_struct *task, enum pid_type,
struct pid *pid);
extern void transfer_pid(struct task_struct *old, struct task_struct *new,
enum pid_type);
2005-04-16 15:20:36 -07:00
struct pid_namespace;
extern struct pid_namespace init_pid_ns;
2005-04-16 15:20:36 -07:00
/*
* look up a PID in the hash table. Must be called with the tasklist_lock
* or rcu_read_lock() held.
*
* find_pid_ns() finds the pid in the namespace specified
2011-05-26 16:25:57 -07:00
* find_vpid() finds the pid by its virtual id, i.e. in the current namespace
*
* see also find_task_by_vpid() set in include/linux/sched.h
2005-04-16 15:20:36 -07:00
*/
extern struct pid *find_pid_ns(int nr, struct pid_namespace *ns);
2007-10-18 23:40:19 -07:00
extern struct pid *find_vpid(int nr);
2005-04-16 15:20:36 -07:00
/*
* Lookup a PID in the hash table, and return with it's count elevated.
*/
extern struct pid *find_get_pid(int nr);
extern struct pid *find_ge_pid(int nr, struct pid_namespace *);
2011-04-18 10:35:30 -07:00
int next_pidmap(struct pid_namespace *pid_ns, unsigned int last);
2005-04-16 15:20:36 -07:00
extern struct pid *alloc_pid(struct pid_namespace *ns);
extern void free_pid(struct pid *pid);
2012-12-21 20:27:12 -08:00
extern void disable_pid_allocation(struct pid_namespace *ns);
2009-01-07 18:08:46 -08:00
/*
* ns_of_pid() returns the pid namespace in which the specified pid was
* allocated.
*
* NOTE:
* ns_of_pid() is expected to be called for a process (task) that has
* an attached 'struct pid' (see attach_pid(), detach_pid()) i.e @pid
* is expected to be non-NULL. If @pid is NULL, caller should handle
* the resulting NULL pid-ns.
*/
static inline struct pid_namespace *ns_of_pid(struct pid *pid)
{
struct pid_namespace *ns = NULL;
if (pid)
ns = pid->numbers[pid->level].ns;
return ns;
}
/*
* is_child_reaper returns true if the pid is the init process
* of the current namespace. As this one could be checked before
* pid_ns->child_reaper is assigned in copy_process, we check
* with the pid number.
*/
static inline bool is_child_reaper(struct pid *pid)
{
return pid->numbers[pid->level].nr == 1;
}
/*
* the helpers to get the pid's id seen from different namespaces
*
* pid_nr() : global id, i.e. the id seen from the init namespace;
2008-02-08 04:19:15 -08:00
* pid_vnr() : virtual id, i.e. the id seen from the pid namespace of
* current.
* pid_nr_ns() : id seen from the ns specified.
*
* see also task_xid_nr() etc in include/linux/sched.h
*/
2006-10-02 02:17:12 -07:00
static inline pid_t pid_nr(struct pid *pid)
{
pid_t nr = 0;
if (pid)
nr = pid->numbers[0].nr;
return nr;
}
pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns);
2008-02-08 04:19:15 -08:00
pid_t pid_vnr(struct pid *pid);
2006-10-02 02:17:12 -07:00
2006-10-03 01:13:45 -07:00
#define do_each_pid_task(pid, type, task) \
do { \
2008-12-04 00:26:39 -05:00
if ((pid) != NULL) \
hlist_for_each_entry_rcu((task), \
2008-12-04 00:26:39 -05:00
&(pid)->tasks[type], pids[type].node) {
2005-04-16 15:20:36 -07:00
/*
* Both old and new leaders may be attached to
* the same pid in the middle of de_thread().
*/
2006-10-03 01:13:45 -07:00
#define while_each_pid_task(pid, type, task) \
if (type == PIDTYPE_PID) \
break; \
2006-10-03 01:13:45 -07:00
} \
2006-10-02 02:17:22 -07:00
} while (0)
2006-10-02 02:17:09 -07:00
#define do_each_pid_thread(pid, type, task) \
do_each_pid_task(pid, type, task) { \
struct task_struct *tg___ = task; \
for_each_thread(tg___, task) {
#define while_each_pid_thread(pid, type, task) \
} \
task = tg___; \
} while_each_pid_task(pid, type, task)
2005-04-16 15:20:36 -07:00
#endif /* _LINUX_PID_H */