svn commit: r362886 - head/sys/compat/linuxkpi/common/src

Konstantin Belousov kib at FreeBSD.org
Thu Jul 2 10:42:59 UTC 2020


Author: kib
Date: Thu Jul  2 10:42:58 2020
New Revision: 362886
URL: https://svnweb.freebsd.org/changeset/base/362886

Log:
  linuxkpi: improvements for linux_pid_task() and linux_get_pid_task().
  
  Unify functions bodies.
  Do not call tdfind() if pid is passed, and do not call pfind() if tid
  is supplied.
  
  Reviewed by:	hselasky
  Sponsored by:	Mellanox Technologies
  MFC after:	1 week
  Differential revision:	https://reviews.freebsd.org/D25534

Modified:
  head/sys/compat/linuxkpi/common/src/linux_current.c

Modified: head/sys/compat/linuxkpi/common/src/linux_current.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_current.c	Thu Jul  2 10:40:47 2020	(r362885)
+++ head/sys/compat/linuxkpi/common/src/linux_current.c	Thu Jul  2 10:42:58 2020	(r362886)
@@ -155,65 +155,52 @@ linuxkpi_thread_dtor(void *arg __unused, struct thread
 	put_task_struct(ts);
 }
 
-struct task_struct *
-linux_pid_task(pid_t pid)
+static struct task_struct *
+linux_get_pid_task_int(pid_t pid, const bool do_get)
 {
 	struct thread *td;
 	struct proc *p;
+	struct task_struct *ts;
 
-	/* 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);
+	if (pid > PID_MAX) {
+		/* try to find corresponding thread */
+		td = tdfind(pid, -1);
+		if (td != NULL) {
+			ts = td->td_lkpi_task;
+			if (do_get && ts != NULL)
+				get_task_struct(ts);
+			PROC_UNLOCK(td->td_proc);
+			return (ts);
+		}
+	} else {
+		/* try to find corresponding procedure */
+		p = pfind(pid);
+		if (p != NULL) {
+			FOREACH_THREAD_IN_PROC(p, td) {
+				ts = td->td_lkpi_task;
+				if (ts != NULL) {
+					if (do_get)
+						get_task_struct(ts);
+					PROC_UNLOCK(p);
+					return (ts);
+				}
 			}
+			PROC_UNLOCK(p);
 		}
-		PROC_UNLOCK(p);
 	}
 	return (NULL);
 }
 
 struct task_struct *
-linux_get_pid_task(pid_t pid)
+linux_pid_task(pid_t pid)
 {
-	struct thread *td;
-	struct proc *p;
+	return (linux_get_pid_task_int(pid, false));
+}
 
-	/* try to find corresponding thread */
-	td = tdfind(pid, -1);
-	if (td != NULL) {
-		struct task_struct *ts = td->td_lkpi_task;
-		if (ts != NULL)
-			get_task_struct(ts);
-		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);
+struct task_struct *
+linux_get_pid_task(pid_t pid)
+{
+	return (linux_get_pid_task_int(pid, true));
 }
 
 bool


More information about the svn-src-head mailing list