svn commit: r316563 - in head/sys/compat/linuxkpi/common: include/linux src

Hans Petter Selasky hselasky at FreeBSD.org
Thu Apr 6 10:26:05 UTC 2017


Author: hselasky
Date: Thu Apr  6 10:26:03 2017
New Revision: 316563
URL: https://svnweb.freebsd.org/changeset/base/316563

Log:
  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

Modified:
  head/sys/compat/linuxkpi/common/include/linux/sched.h
  head/sys/compat/linuxkpi/common/src/linux_current.c

Modified: head/sys/compat/linuxkpi/common/include/linux/sched.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/sched.h	Thu Apr  6 09:34:54 2017	(r316562)
+++ head/sys/compat/linuxkpi/common/include/linux/sched.h	Thu Apr  6 10:26:03 2017	(r316563)
@@ -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)

Modified: head/sys/compat/linuxkpi/common/src/linux_current.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_current.c	Thu Apr  6 09:34:54 2017	(r316562)
+++ head/sys/compat/linuxkpi/common/src/linux_current.c	Thu Apr  6 10:26:03 2017	(r316563)
@@ -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);
 }
 


More information about the svn-src-head mailing list