Re: mysterious /proc/<pid>/maps breakage with static binaries in2.6.10-mm2

From: Andrew Morton
Date: Fri Jan 07 2005 - 13:12:57 EST


Jeremy Fitzhardinge <jeremy@xxxxxxxx> wrote:
>
> In 2.6.10-mm2, if I look at the maps of a process execve'd from a static
> executable, /proc/<pid>/maps looks wrong.

The first versions of speedup-proc-pid-maps was dodgy. Does this fix?


--- 25/fs/proc/task_mmu.c~speedup-proc-pid-maps-fix 2005-01-07 10:03:04.313758952 -0800
+++ 25-akpm/fs/proc/task_mmu.c 2005-01-07 10:03:04.317758344 -0800
@@ -133,6 +133,15 @@ static void *m_start(struct seq_file *m,
tail_map = get_gate_vma(task);
down_read(&mm->mmap_sem);

+ /*
+ * First map is special, since we remember last_addr
+ * rather than current_addr to hit with mmap_cache most of the time.
+ */
+ if (!l) {
+ map = mm->mmap;
+ goto out;
+ }
+
/* Start with last addr hint */
map = find_vma(mm, last_addr);
if (map) {
@@ -140,7 +149,7 @@ static void *m_start(struct seq_file *m,
goto out;
}

- /* Check the map index is within the range */
+ /* Check the map index is within the range, and do linear scan */
if ((unsigned long)l < mm->map_count) {
map = mm->mmap;
while (l-- && map)
@@ -179,16 +188,16 @@ static void *m_next(struct seq_file *m,
{
struct task_struct *task = m->private;
struct vm_area_struct *map = v;
+ struct vm_area_struct *tail_map = get_gate_vma(task);
+
(*pos)++;
if (map && map->vm_next) {
- m->version = map->vm_next->vm_start;
+ m->version = (map != tail_map)? map->vm_start: -1UL;
return map->vm_next;
}
m_stop(m, v);
m->version = -1UL;
- if (map != get_gate_vma(task))
- return get_gate_vma(task);
- return NULL;
+ return (map != tail_map)? tail_map: NULL;
}

struct seq_operations proc_pid_maps_op = {
_

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/