Fix implementation of task_pid_group_leader() in the LinuxKPI.
In FreeBSD thread IDs and procedure IDs have distinct number spaces. When asking for the group leader task ID in the LinuxKPI, return the procedure ID and let this resolve to the first task in the procedure having a valid LinuxKPI task structure pointer. MFC after: 1 week Sponsored by: Mellanox Technologies
This commit is contained in:
parent
1ea4c85781
commit
8402f058ad
@ -74,8 +74,7 @@ struct task_struct {
|
||||
|
||||
#define current ((struct task_struct *)curthread->td_lkpi_task)
|
||||
|
||||
#define task_pid_group_leader(task) \
|
||||
FIRST_THREAD_IN_PROC((task)->task_thread->td_proc)->td_tid
|
||||
#define task_pid_group_leader(task) (task)->task_thread->td_proc->p_pid
|
||||
#define task_pid(task) ((task)->pid)
|
||||
#define task_pid_nr(task) ((task)->pid)
|
||||
#define get_pid(x) (x)
|
||||
|
@ -158,13 +158,28 @@ struct task_struct *
|
||||
linux_pid_task(pid_t pid)
|
||||
{
|
||||
struct thread *td;
|
||||
struct proc *p;
|
||||
|
||||
/* try to find corresponding thread */
|
||||
td = tdfind(pid, -1);
|
||||
if (td != NULL) {
|
||||
struct task_struct *ts = td->td_lkpi_task;
|
||||
PROC_UNLOCK(td->td_proc);
|
||||
return (ts);
|
||||
}
|
||||
|
||||
/* try to find corresponding procedure */
|
||||
p = pfind(pid);
|
||||
if (p != NULL) {
|
||||
FOREACH_THREAD_IN_PROC(p, td) {
|
||||
struct task_struct *ts = td->td_lkpi_task;
|
||||
if (ts != NULL) {
|
||||
PROC_UNLOCK(p);
|
||||
return (ts);
|
||||
}
|
||||
}
|
||||
PROC_UNLOCK(p);
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@ -172,7 +187,9 @@ struct task_struct *
|
||||
linux_get_pid_task(pid_t pid)
|
||||
{
|
||||
struct thread *td;
|
||||
struct proc *p;
|
||||
|
||||
/* try to find corresponding thread */
|
||||
td = tdfind(pid, -1);
|
||||
if (td != NULL) {
|
||||
struct task_struct *ts = td->td_lkpi_task;
|
||||
@ -181,6 +198,20 @@ linux_get_pid_task(pid_t pid)
|
||||
PROC_UNLOCK(td->td_proc);
|
||||
return (ts);
|
||||
}
|
||||
|
||||
/* try to find corresponding procedure */
|
||||
p = pfind(pid);
|
||||
if (p != NULL) {
|
||||
FOREACH_THREAD_IN_PROC(p, td) {
|
||||
struct task_struct *ts = td->td_lkpi_task;
|
||||
if (ts != NULL) {
|
||||
get_task_struct(ts);
|
||||
PROC_UNLOCK(p);
|
||||
return (ts);
|
||||
}
|
||||
}
|
||||
PROC_UNLOCK(p);
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user