From owner-p4-projects@FreeBSD.ORG Sun Jun 25 02:29:08 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 866B316A4A6; Sun, 25 Jun 2006 02:29:08 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id C57D016A492 for ; Sun, 25 Jun 2006 02:29:07 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 82D1843D68 for ; Sun, 25 Jun 2006 02:29:07 +0000 (GMT) (envelope-from jhb@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k5P2T7Oo055105 for ; Sun, 25 Jun 2006 02:29:07 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k5P2T7co055102 for perforce@freebsd.org; Sun, 25 Jun 2006 02:29:07 GMT (envelope-from jhb@freebsd.org) Date: Sun, 25 Jun 2006 02:29:07 GMT Message-Id: <200606250229.k5P2T7co055102@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Cc: Subject: PERFORCE change 99963 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 25 Jun 2006 02:29:08 -0000 http://perforce.freebsd.org/chv.cgi?CH=99963 Change 99963 by jhb@jhb_mutex on 2006/06/25 02:28:11 Sync svr4_sys_break() with obreak() some and mark MPSAFE: - Just read the process limits once up front and cache them. - Use vm_map_max() rather than VM_MAXUSER_ADDRESS. - Add vm_map locking. Affected files ... .. //depot/projects/smpng/sys/compat/svr4/svr4_misc.c#45 edit .. //depot/projects/smpng/sys/compat/svr4/syscalls.master#11 edit Differences ... ==== //depot/projects/smpng/sys/compat/svr4/svr4_misc.c#45 (text+ko) ==== @@ -795,27 +795,36 @@ struct proc *p = td->td_proc; struct vmspace *vm = p->p_vmspace; vm_offset_t new, old, base, ns; - int rv; + rlim_t datalim, vmemlim; + int error, rv; + + PROC_LOCK(p); + datalim = lim_cur(p, RLIMIT_DATA); + vmemlim = lim_cur(p, RLIMIT_VMEM); + PROC_UNLOCK(p); base = round_page((vm_offset_t) vm->vm_daddr); ns = (vm_offset_t)uap->nsize; new = round_page(ns); + error = 0; + vm_map_lock(&vm->vm_map); if (new > base) { - PROC_LOCK(p); - if ((new - base) > (unsigned)lim_cur(p, RLIMIT_DATA)) { - PROC_UNLOCK(p); - return ENOMEM; + if ((new - base) > (unsigned)datalim) { + error = ENOMEM; + goto done; + } + if (new > vm_map_max(&vm->vm_map)) { + error = ENOMEM; + goto done; } - PROC_UNLOCK(p); - if (new >= VM_MAXUSER_ADDRESS) - return (ENOMEM); } else if (new < base) { /* * This is simply an invalid value. If someone wants to * do fancy address space manipulations, mmap and munmap * can do most of what the user would want. */ - return EINVAL; + error = EINVAL; + goto done; } old = base + ctob(vm->vm_dsize); @@ -823,27 +832,29 @@ if (new > old) { vm_size_t diff; diff = new - old; - PROC_LOCK(p); - if (vm->vm_map.size + diff > lim_cur(p, RLIMIT_VMEM)) { - PROC_UNLOCK(p); - return(ENOMEM); + if (vm->vm_map.size + diff > vmemlim) { + error = ENOMEM; + goto done; } - PROC_UNLOCK(p); rv = vm_map_find(&vm->vm_map, NULL, 0, &old, diff, FALSE, VM_PROT_ALL, VM_PROT_ALL, 0); if (rv != KERN_SUCCESS) { - return (ENOMEM); + error = ENOMEM; + goto done; } vm->vm_dsize += btoc(diff); } else if (new < old) { rv = vm_map_remove(&vm->vm_map, new, old); if (rv != KERN_SUCCESS) { - return (ENOMEM); + error = ENOMEM; + goto done; } vm->vm_dsize -= btoc(old - new); } +done: + vm_map_unlock(&vm->vm_map); - return (0); + return (error); } static __inline clock_t ==== //depot/projects/smpng/sys/compat/svr4/syscalls.master#11 (text+ko) ==== @@ -57,7 +57,7 @@ 14 AUE_NULL MSTD { int svr4_sys_mknod(char* path, int mode, int dev); } 15 AUE_NULL MNOPROTO { int chmod(char *path, int mode); } 16 AUE_NULL MNOPROTO { int chown(char *path, uid_t uid, gid_t gid); } -17 AUE_NULL STD { int svr4_sys_break(caddr_t nsize); } +17 AUE_NULL MSTD { int svr4_sys_break(caddr_t nsize); } 18 AUE_NULL MSTD { int svr4_sys_stat(char* path, \ struct svr4_stat* ub); } 19 AUE_NULL MNOPROTO { int lseek(int filedes, off_t *offset, \