From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate.crashing.org ([63.228.1.57]:60375 "EHLO gate.crashing.org") by vger.kernel.org with ESMTP id S932086AbWB1Ift (ORCPT ); Tue, 28 Feb 2006 03:35:49 -0500 Received: from localhost.localdomain (localhost [127.0.0.1]) by gate.crashing.org (8.12.8/8.12.8) with ESMTP id k1S8Q4WG029314 for ; Tue, 28 Feb 2006 02:26:05 -0600 Subject: [Fwd: [PATCH] Add mm->task_size and fix powerpc vdso] From: Benjamin Herrenschmidt Content-Type: text/plain Date: Tue, 28 Feb 2006 19:35:46 +1100 Message-Id: <1141115747.3767.53.camel@localhost.localdomain> Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Sender: linux-arch-owner@vger.kernel.org To: Linux Arch list List-ID: Forgot this list on the CC ... Comments welcome, the idea is to finally track if an mm is 32 or 64 bits (knowing that I have an urgent need to get that fixed in 2.6.16 due to a problem with the powerpc vdso). Please, arch maintainer, comment if the approach I use for setting mm->task_size is valid for you. Ben. -------- Forwarded Message -------- From: Benjamin Herrenschmidt To: Andrew Morton Cc: linux-mm@kvack.org, hugh@veritas.com, paulus@samba.org, nickpiggin@yahoo.com.au, David S. Miller Subject: [PATCH] Add mm->task_size and fix powerpc vdso Date: Tue, 28 Feb 2006 17:27:20 +1100 This patch adds mm->task_size to keep track of the task size of a given mm and uses that to fix the powerpc vdso so that it uses the mm task size to decide what pages to fault in instead of the current thread flags (which broke when ptracing). Signed-off-by: Benjamin Herrenschmidt Index: linux-work/arch/powerpc/kernel/vdso.c =================================================================== --- linux-work.orig/arch/powerpc/kernel/vdso.c 2005-11-29 10:56:02.000000000 +1100 +++ linux-work/arch/powerpc/kernel/vdso.c 2006-02-28 17:07:18.000000000 +1100 @@ -182,8 +182,8 @@ static struct page * vdso_vma_nopage(str unsigned long offset = address - vma->vm_start; struct page *pg; #ifdef CONFIG_PPC64 - void *vbase = test_thread_flag(TIF_32BIT) ? - vdso32_kbase : vdso64_kbase; + void *vbase = (vma->vm_mm->task_size > TASK_SIZE_USER32) ? + vdso64_kbase : vdso32_kbase; #else void *vbase = vdso32_kbase; #endif Index: linux-work/fs/exec.c =================================================================== --- linux-work.orig/fs/exec.c 2006-02-17 14:38:43.000000000 +1100 +++ linux-work/fs/exec.c 2006-02-28 17:05:50.000000000 +1100 @@ -885,6 +885,12 @@ int flush_old_exec(struct linux_binprm * current->flags &= ~PF_RANDOMIZE; flush_thread(); + /* Set the new mm task size. We have to do that late because it may + * depend on TIF_32BIT which is only updated in flush_thread() on + * some architectures like powerpc + */ + current->mm->task_size = TASK_SIZE; + if (bprm->e_uid != current->euid || bprm->e_gid != current->egid || file_permission(bprm->file, MAY_READ) || (bprm->interp_flags & BINPRM_FLAGS_ENFORCE_NONDUMP)) { Index: linux-work/include/linux/sched.h =================================================================== --- linux-work.orig/include/linux/sched.h 2006-02-17 14:38:43.000000000 +1100 +++ linux-work/include/linux/sched.h 2006-02-28 17:03:52.000000000 +1100 @@ -299,6 +299,7 @@ struct mm_struct { unsigned long pgoff, unsigned long flags); void (*unmap_area) (struct mm_struct *mm, unsigned long addr); unsigned long mmap_base; /* base of mmap area */ + unsigned long task_size; /* size of task vm space */ unsigned long cached_hole_size; /* if non-zero, the largest hole below free_area_cache */ unsigned long free_area_cache; /* first hole of size cached_hole_size or larger */ pgd_t * pgd; -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org