From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752455AbbGFIwi (ORCPT ); Mon, 6 Jul 2015 04:52:38 -0400 Received: from mailhub.sw.ru ([195.214.232.25]:33444 "EHLO relay.sw.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754433AbbGFIve (ORCPT ); Mon, 6 Jul 2015 04:51:34 -0400 From: Andrey Vagin To: linux-kernel@vger.kernel.org Cc: linux-api@vger.kernel.org, Andrey Vagin , Oleg Nesterov , Andrew Morton , Cyrill Gorcunov , Pavel Emelyanov , Roger Luethi , Arnd Bergmann , Arnaldo Carvalho de Melo , David Ahern , Andy Lutomirski , Pavel Odintsov Subject: [PATCH 20/24] task_diag: Only add VMAs for thread_group leader Date: Mon, 6 Jul 2015 11:47:21 +0300 Message-Id: <1436172445-6979-21-git-send-email-avagin@openvz.org> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1436172445-6979-1-git-send-email-avagin@openvz.org> References: <1436172445-6979-1-git-send-email-avagin@openvz.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: David Ahern threads of a process share the same VMAs, so when dumping all threads for all processes only push vma data for group leader. Signed-off-by: David Ahern Signed-off-by: Andrey Vagin --- kernel/taskdiag.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/kernel/taskdiag.c b/kernel/taskdiag.c index e5a5eed..6549df3 100644 --- a/kernel/taskdiag.c +++ b/kernel/taskdiag.c @@ -443,9 +443,10 @@ err: } static int task_diag_fill(struct task_struct *tsk, struct sk_buff *skb, - u64 show_flags, u32 portid, u32 seq, - struct netlink_callback *cb) + struct task_diag_pid *req, u32 portid, u32 seq, + struct netlink_callback *cb) { + u64 show_flags = req->show_flags; void *reply; int err = 0, i = 0, n = 0; bool progress = false; @@ -492,6 +493,13 @@ static int task_diag_fill(struct task_struct *tsk, struct sk_buff *skb, } if (show_flags & TASK_DIAG_SHOW_VMA) { + /* if the request is to dump all threads of all processes + * only show VMAs for group leader. + */ + if (req->dump_strategy == TASK_DIAG_DUMP_ALL_THREAD && + !thread_group_leader(tsk)) + goto done; + if (i >= n) err = fill_vma(tsk, skb, cb, &progress, show_flags); if (err) @@ -499,6 +507,7 @@ static int task_diag_fill(struct task_struct *tsk, struct sk_buff *skb, i++; } +done: genlmsg_end(skb, reply); if (cb) cb->args[2] = 0; @@ -696,7 +705,7 @@ int taskdiag_dumpit(struct sk_buff *skb, struct netlink_callback *cb) for (; task; task = iter_next(&iter)) { if (!ptrace_may_access(task, PTRACE_MODE_READ)) continue; - rc = task_diag_fill(task, skb, iter.req.show_flags, + rc = task_diag_fill(task, skb, &iter.req, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq, cb); if (rc < 0) { if (rc != -EMSGSIZE) { @@ -755,7 +764,7 @@ int taskdiag_doit(struct sk_buff *skb, struct genl_info *info) return -EMSGSIZE; } - rc = task_diag_fill(tsk, msg, req.show_flags, + rc = task_diag_fill(tsk, msg, &req, info->snd_portid, info->snd_seq, NULL); if (rc != -EMSGSIZE) break; -- 2.1.0