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
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to