From: Michael Jeanson Date: Wed, 21 Feb 2018 21:36:17 +0000 (-0500) Subject: Fix: use proper pid_ns in the process statedump X-Git-Tag: v2.11.0-rc1~64 X-Git-Url: http://git.lttng.org/?p=lttng-modules.git;a=commitdiff_plain;h=887bcdac230a9081d5088bde59725edab93b8fb7 Fix: use proper pid_ns in the process statedump The pid_ns we currently use from the nsproxy struct is not the task's pid_ns but the one that children of this task will use. As stated in include/linux/nsproxy.h : The pid namespace is an exception -- it's accessed using task_active_pid_ns. The pid namespace here is the namespace that children will use. While it will be the same most of the time, it will report incorrect information in some situations. Plus it has the side effect of simplifying the code and removing kernel version checks. Signed-off-by: Michael Jeanson Signed-off-by: Mathieu Desnoyers --- diff --git a/lttng-statedump-impl.c b/lttng-statedump-impl.c index a2520433..1c09e51a 100644 --- a/lttng-statedump-impl.c +++ b/lttng-statedump-impl.c @@ -52,7 +52,6 @@ #include #include #include -#include #include #include #include @@ -392,43 +391,14 @@ void lttng_statedump_process_ns(struct lttng_session *session, enum lttng_execution_submode submode, enum lttng_process_status status) { - struct nsproxy *proxy; struct pid_namespace *pid_ns; - /* - * Back and forth on locking strategy within Linux upstream for nsproxy. - * See Linux upstream commit 728dba3a39c66b3d8ac889ddbe38b5b1c264aec3 - * "namespaces: Use task_lock and not rcu to protect nsproxy" - * for details. - */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0) || \ - LTTNG_UBUNTU_KERNEL_RANGE(3,13,11,36, 3,14,0,0) || \ - LTTNG_UBUNTU_KERNEL_RANGE(3,16,1,11, 3,17,0,0) || \ - LTTNG_RHEL_KERNEL_RANGE(3,10,0,229,13,0, 3,11,0,0,0,0)) - proxy = p->nsproxy; -#else - rcu_read_lock(); - proxy = task_nsproxy(p); -#endif - if (proxy) { - pid_ns = lttng_get_proxy_pid_ns(proxy); - do { - trace_lttng_statedump_process_state(session, - p, type, mode, submode, status, pid_ns); - pid_ns = pid_ns->parent; - } while (pid_ns); - } else { + pid_ns = task_active_pid_ns(p); + do { trace_lttng_statedump_process_state(session, - p, type, mode, submode, status, NULL); - } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0) || \ - LTTNG_UBUNTU_KERNEL_RANGE(3,13,11,36, 3,14,0,0) || \ - LTTNG_UBUNTU_KERNEL_RANGE(3,16,1,11, 3,17,0,0) || \ - LTTNG_RHEL_KERNEL_RANGE(3,10,0,229,13,0, 3,11,0,0,0,0)) - /* (nothing) */ -#else - rcu_read_unlock(); -#endif + p, type, mode, submode, status, pid_ns); + pid_ns = pid_ns->parent; + } while (pid_ns); } static diff --git a/wrapper/nsproxy.h b/wrapper/nsproxy.h deleted file mode 100644 index e9766efc..00000000 --- a/wrapper/nsproxy.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef _LTTNG_WRAPPER_NSPROXY_H -#define _LTTNG_WRAPPER_NSPROXY_H - -/* - * wrapper/nsproxy.h - * - * Copyright (C) 2011-2012 Mathieu Desnoyers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; only - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)) -static inline -struct pid_namespace *lttng_get_proxy_pid_ns(struct nsproxy *proxy) -{ - return proxy->pid_ns_for_children; -} -#else -static inline -struct pid_namespace *lttng_get_proxy_pid_ns(struct nsproxy *proxy) -{ - return proxy->pid_ns; -} -#endif - - -#endif /* _LTTNG_WRAPPER_NSPROXY_H */