[PATCH 20/24] task_diag: Only add VMAs for thread_group leader
From: Andrey Vagin <hidden>
Date: 2015-07-06 08:52:38
Also in:
lkml
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: David Ahern <redacted> 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 <redacted> Signed-off-by: Andrey Vagin <redacted> --- 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