From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org,
Greg KH <greg@kroah.com>
Cc: Justin Forbes <jmforbes@linuxtx.org>,
Zwane Mwaikambo <zwane@arm.linux.org.uk>,
"Theodore Ts'o" <tytso@mit.edu>,
Randy Dunlap <rdunlap@xenotime.net>,
Dave Jones <davej@redhat.com>,
Chuck Wolber <chuckw@quantumlinux.com>,
Chris Wedgwood <reviews@ml.cw.f00f.org>,
Michael Krufky <mkrufky@linuxtv.org>,
Chuck Ebbert <cebbert@redhat.com>,
Domenico Andreoli <cavokz@gmail.com>, Willy Tarreau <w@1wt.eu>,
Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
Jake Edge <jake@lwn.net>, Eugene Teo <eteo@redhat.com>,
torvalds@linux-foundation.org, akpm@linux-foundation.org,
alan@lxorguk.ukuu.org.uk, Matt Mackall <mpm@selenic.com>,
Joe Korty <joe.korty@ccur.com>,
Alexey Dobriyan <adobriyan@gmail.com>
Subject: [patch 24/27] proc: fix vma display mismatch between /proc/pid/{maps,smaps}
Date: Thu, 23 Oct 2008 21:35:16 -0700 [thread overview]
Message-ID: <20081024043516.GY30828@kroah.com> (raw)
In-Reply-To: <20081024043303.GA30828@kroah.com>
[-- Attachment #1: proc-fix-vma-display-mismatch-between-proc-pid-maps-smaps.patch --]
[-- Type: text/plain, Size: 4172 bytes --]
2.6.27-stable review patch. If anyone has any objections, please let us
know.
------------------
From: Joe Korty <joe.korty@ccur.com>
[ backport of 7c88db0cb589df980acfb2f73c3595a0653004ec to 2.7.27.3 by Joe
Korty <joe.korty@ccur.com ]
proc: fix vma display mismatch between /proc/pid/{maps,smaps}
Commit 4752c369789250eafcd7813e11c8fb689235b0d2 aka
"maps4: simplify interdependence of maps and smaps" broke /proc/pid/smaps,
causing it to display some vmas twice and other vmas not at all. For example:
grep .- /proc/1/smaps >/tmp/smaps; diff /proc/1/maps /tmp/smaps
1 25d24
2 < 7fd7e23aa000-7fd7e23ac000 rw-p 7fd7e23aa000 00:00 0
3 28a28
4 > ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
The bug has something to do with setting m->version before all the
seq_printf's have been performed. show_map was doing this correctly,
but show_smap was doing this in the middle of its seq_printf sequence.
This patch arranges things so that the setting of m->version in show_smap
is also done at the end of its seq_printf sequence.
Testing: in addition to the above grep test, for each process I summed
up the 'Rss' fields of /proc/pid/smaps and compared that to the 'VmRSS'
field of /proc/pid/status. All matched except for Xorg (which has a
/dev/mem mapping which Rss accounts for but VmRSS does not). This result
gives us some confidence that neither /proc/pid/maps nor /proc/pid/smaps
are any longer skipping or double-counting vmas.
Signed-off-by: Joe Korty <joe.korty@ccur.com>
Cc: Matt Mackall <mpm@selenic.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
---
fs/proc/task_mmu.c | 34 ++++++++++++++++++++++------------
1 file changed, 22 insertions(+), 12 deletions(-)
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -198,11 +198,8 @@ static int do_maps_open(struct inode *in
return ret;
}
-static int show_map(struct seq_file *m, void *v)
+static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
{
- struct proc_maps_private *priv = m->private;
- struct task_struct *task = priv->task;
- struct vm_area_struct *vma = v;
struct mm_struct *mm = vma->vm_mm;
struct file *file = vma->vm_file;
int flags = vma->vm_flags;
@@ -210,9 +207,6 @@ static int show_map(struct seq_file *m,
dev_t dev = 0;
int len;
- if (maps_protect && !ptrace_may_access(task, PTRACE_MODE_READ))
- return -EACCES;
-
if (file) {
struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
dev = inode->i_sb->s_dev;
@@ -257,6 +251,18 @@ static int show_map(struct seq_file *m,
}
}
seq_putc(m, '\n');
+}
+
+static int show_map(struct seq_file *m, void *v)
+{
+ struct vm_area_struct *vma = v;
+ struct proc_maps_private *priv = m->private;
+ struct task_struct *task = priv->task;
+
+ if (maps_protect && !ptrace_may_access(task, PTRACE_MODE_READ))
+ return -EACCES;
+
+ show_map_vma(m, vma);
if (m->count < m->size) /* vma is copied successfully */
m->version = (vma != get_gate_vma(task))? vma->vm_start: 0;
@@ -367,23 +373,25 @@ static int smaps_pte_range(pmd_t *pmd, u
static int show_smap(struct seq_file *m, void *v)
{
+ struct proc_maps_private *priv = m->private;
+ struct task_struct *task = priv->task;
struct vm_area_struct *vma = v;
struct mem_size_stats mss;
- int ret;
struct mm_walk smaps_walk = {
.pmd_entry = smaps_pte_range,
.mm = vma->vm_mm,
.private = &mss,
};
+ if (maps_protect && !ptrace_may_access(task, PTRACE_MODE_READ))
+ return -EACCES;
+
memset(&mss, 0, sizeof mss);
mss.vma = vma;
if (vma->vm_mm && !is_vm_hugetlb_page(vma))
walk_page_range(vma->vm_start, vma->vm_end, &smaps_walk);
- ret = show_map(m, v);
- if (ret)
- return ret;
+ show_map_vma(m, vma);
seq_printf(m,
"Size: %8lu kB\n"
@@ -405,7 +413,9 @@ static int show_smap(struct seq_file *m,
mss.referenced >> 10,
mss.swap >> 10);
- return ret;
+ if (m->count < m->size) /* vma is copied successfully */
+ m->version = (vma != get_gate_vma(task)) ? vma->vm_start : 0;
+ return 0;
}
static const struct seq_operations proc_pid_smaps_op = {
--
next prev parent reply other threads:[~2008-10-24 4:46 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20081024042023.054190751@mini.kroah.org>
2008-10-24 4:33 ` [patch 00/27] 2.6.27.4-stable review Greg KH
2008-10-24 4:33 ` [patch 01/27] gpiolib: fix oops in gpio_get_value_cansleep() Greg KH
2008-10-24 4:33 ` [patch 02/27] edac cell: fix incorrect edac_mode Greg KH
2008-10-24 4:33 ` [patch 03/27] x86 ACPI: fix breakage of resume on 64-bit UP systems with SMP kernel Greg KH
2008-10-24 4:33 ` [patch 04/27] sched: fix the wrong mask_len Greg KH
2008-10-24 4:33 ` [patch 05/27] USB: cdc-wdm: make module autoload work Greg KH
2008-10-24 4:33 ` [patch 06/27] USB: dont rebind drivers after failed resume or reset Greg KH
2008-10-24 4:33 ` [patch 07/27] USB: fix memory leak in cdc-acm Greg KH
2008-10-24 4:34 ` [patch 08/27] USB: Speedtouch: add pre_reset and post_reset routines Greg KH
2008-10-24 4:34 ` [patch 09/27] dm kcopyd: avoid queue shuffle Greg KH
2008-10-24 4:34 ` [patch 10/27] dm snapshot: fix primary_pe race Greg KH
2008-10-24 4:34 ` [patch 11/27] dm exception store: refactor zero_area Greg KH
2008-10-24 5:36 ` Greg KH
2008-10-25 1:40 ` Mikulas Patocka
2008-10-25 20:28 ` Greg KH
2008-10-24 4:34 ` [patch 12/27] dm exception store: fix misordered writes Greg KH
2008-10-24 4:34 ` [patch 13/27] amd_iommu: fix nasty bug that caused ILLEGAL_DEVICE_TABLE_ENTRY errors Greg KH
2008-10-24 4:34 ` [patch 14/27] CIFS: fix saving of resume key before CIFSFindNext Greg KH
2008-10-24 4:34 ` [patch 15/27] ext: Avoid printk floods in the face of directory corruption (CVE-2008-3528) Greg KH
2008-10-24 4:34 ` [patch 16/27] netfilter: xt_iprange: fix range inversion match Greg KH
2008-10-24 4:34 ` [patch 17/27] netfilter: snmp nat leaks memory in case of failure Greg KH
2008-10-24 4:34 ` Greg KH
2008-10-24 4:34 ` [patch 18/27] netfilter: restore lost ifdef guarding defrag exception Greg KH
2008-10-24 4:34 ` [patch 19/27] anon_vma_prepare: properly lock even newly allocated entries Greg KH
2008-10-24 4:34 ` [patch 20/27] hvc_console: Fix free_irq in spinlocked section Greg KH
2008-10-24 4:35 ` [patch 21/27] ACPI Suspend: Enable ACPI during resume if SCI_EN is not set Greg KH
2008-10-24 4:35 ` [patch 22/27] ACPI suspend: Blacklist HP xw4600 Workstation for old code ordering Greg KH
2008-10-24 4:35 ` [patch 23/27] ACPI suspend: Always use the 32-bit waking vector Greg KH
2008-10-24 4:35 ` Greg KH [this message]
2008-10-24 4:35 ` [patch 25/27] SCSI: scsi_dh: add Dell product information into rdac device handler Greg KH
2008-10-24 4:35 ` [patch 26/27] PCI hotplug: cpqphp: fix kernel NULL pointer dereference Greg KH
2008-10-24 4:35 ` [patch 27/27] ath5k: fix suspend-related oops on rmmod Greg KH
2008-10-24 20:36 ` Elias Oltmanns
2008-10-24 21:10 ` Bob Copeland
2008-10-24 21:28 ` Greg KH
2008-10-24 5:41 ` [patch 00/27] 2.6.27.4-stable review Greg KH
2008-10-24 21:38 ` [stable] " Greg KH
2008-10-24 21:40 ` [patch 28/27] V4L/DVB (9300): pvrusb2: Fix deadlock problem Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20081024043516.GY30828@kroah.com \
--to=gregkh@suse.de \
--cc=adobriyan@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=cavokz@gmail.com \
--cc=cebbert@redhat.com \
--cc=chuckw@quantumlinux.com \
--cc=davej@redhat.com \
--cc=eteo@redhat.com \
--cc=greg@kroah.com \
--cc=jake@lwn.net \
--cc=jmforbes@linuxtx.org \
--cc=joe.korty@ccur.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mkrufky@linuxtv.org \
--cc=mpm@selenic.com \
--cc=rbranco@la.checkpoint.com \
--cc=rdunlap@xenotime.net \
--cc=reviews@ml.cw.f00f.org \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=tytso@mit.edu \
--cc=w@1wt.eu \
--cc=zwane@arm.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.