All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Use MM_VM_SIZE in exit_mmap
@ 2005-01-25 14:22 Anton Blanchard
  2005-01-25 16:46 ` Chris Wedgwood
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: Anton Blanchard @ 2005-01-25 14:22 UTC (permalink / raw)
  To: akpm, nickpiggin; +Cc: linux-kernel, spyro


Hi,

The 4 level pagetable code changed the exit_mmap code to rely on
TASK_SIZE. On some architectures (eg ppc64 and ia64), this is a per task
property and bad things can happen in certain circumstances when using
it.

It is possible for one task to end up "owning" an mm from another - we
have seen this with the procfs code when process 1 accesses
/proc/pid/cmdline of process 2 while it is exiting.  Process 2 exits
but does not tear its mm down. Later on process 1 finishes with the proc
file and the mm gets torn down at this point.

Now if process 1 was 32bit and process 2 was 64bit then we end up using
a bad value for TASK_SIZE in exit_mmap. We only tear down part of the
address space and leave half initialised pagetables and entries in the
MMU etc.

MM_VM_SIZE() was created for this purpose (and is used in the next line
for tlb_finish_mmu), so use it. I moved the PGD round up of TASK_SIZE
into the default MM_VM_SIZE.

As an aside, all architectures except one define FIRST_USER_PGD_NR as 0:

include/asm-arm26/pgtable.h:#define FIRST_USER_PGD_NR       1

It would be nice to get rid of one more magic constant and just clear
from 0 ... MM_VM_SIZE(). That would make it consistent with the
tlb_flush_mmu call below it too.

Signed-off-by: Anton Blanchard <anton@samba.org>

===== include/linux/mm.h 1.212 vs edited =====
--- 1.212/include/linux/mm.h	2005-01-16 07:21:13 +11:00
+++ edited/include/linux/mm.h	2005-01-26 01:20:12 +11:00
@@ -38,7 +38,7 @@
 #include <asm/atomic.h>
 
 #ifndef MM_VM_SIZE
-#define MM_VM_SIZE(mm)	TASK_SIZE
+#define MM_VM_SIZE(mm)	((TASK_SIZE + PGDIR_SIZE - 1) & PGDIR_MASK)
 #endif
 
 #define nth_page(page,n) pfn_to_page(page_to_pfn((page)) + (n))
===== mm/mmap.c 1.161 vs edited =====
--- 1.161/mm/mmap.c	2005-01-13 03:26:28 +11:00
+++ edited/mm/mmap.c	2005-01-26 01:18:51 +11:00
@@ -1995,8 +1995,7 @@
 					~0UL, &nr_accounted, NULL);
 	vm_unacct_memory(nr_accounted);
 	BUG_ON(mm->map_count);	/* This is just debugging */
-	clear_page_range(tlb, FIRST_USER_PGD_NR * PGDIR_SIZE,
-			(TASK_SIZE + PGDIR_SIZE - 1) & PGDIR_MASK);
+	clear_page_range(tlb, FIRST_USER_PGD_NR * PGDIR_SIZE, MM_VM_SIZE(mm));
 	
 	tlb_finish_mmu(tlb, 0, MM_VM_SIZE(mm));
 

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2005-01-27 21:03 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-01-25 14:22 [PATCH] Use MM_VM_SIZE in exit_mmap Anton Blanchard
2005-01-25 16:46 ` Chris Wedgwood
2005-01-25 16:57   ` Anton Blanchard
2005-01-25 17:13     ` Chris Wedgwood
2005-01-27 20:46     ` [PATCH RFC] Change (some) TASK_SIZE to task_vtop(current) Chris Wedgwood
2005-01-25 23:02 ` [PATCH] Use MM_VM_SIZE in exit_mmap Ian Molton
2005-01-25 23:39   ` Russell King
2005-01-26  0:01     ` Anton Blanchard
2005-01-26  0:17 ` Nick Piggin
2005-01-26  6:44 ` Andi Kleen
2005-01-26  7:39   ` William Lee Irwin III

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.