From owner-svn-src-all@freebsd.org Thu Apr 6 10:26:05 2017 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 3336FD3138C; Thu, 6 Apr 2017 10:26:05 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id EB3C630E; Thu, 6 Apr 2017 10:26:04 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v36AQ4i8097415; Thu, 6 Apr 2017 10:26:04 GMT (envelope-from hselasky@FreeBSD.org) Received: (from hselasky@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v36AQ3YG097413; Thu, 6 Apr 2017 10:26:04 GMT (envelope-from hselasky@FreeBSD.org) Message-Id: <201704061026.v36AQ3YG097413@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: hselasky set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky Date: Thu, 6 Apr 2017 10:26:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r316563 - in head/sys/compat/linuxkpi/common: include/linux src X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 06 Apr 2017 10:26:05 -0000 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); }