Deleted Added
full compact
vm_unix.c (77139) vm_unix.c (79224)
1/*
2 * Copyright (c) 1988 University of Utah.
3 * Copyright (c) 1991, 1993
4 * The Regents of the University of California. All rights reserved.
5 *
6 * This code is derived from software contributed to Berkeley by
7 * the Systems Programming Group of the University of Utah Computer
8 * Science Department.

--- 24 unchanged lines hidden (view full) ---

33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
37 *
38 * from: Utah $Hdr: vm_unix.c 1.1 89/11/07$
39 *
40 * @(#)vm_unix.c 8.1 (Berkeley) 6/11/93
1/*
2 * Copyright (c) 1988 University of Utah.
3 * Copyright (c) 1991, 1993
4 * The Regents of the University of California. All rights reserved.
5 *
6 * This code is derived from software contributed to Berkeley by
7 * the Systems Programming Group of the University of Utah Computer
8 * Science Department.

--- 24 unchanged lines hidden (view full) ---

33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
37 *
38 * from: Utah $Hdr: vm_unix.c 1.1 89/11/07$
39 *
40 * @(#)vm_unix.c 8.1 (Berkeley) 6/11/93
41 * $FreeBSD: head/sys/vm/vm_unix.c 77139 2001-05-24 18:04:29Z jhb $
41 * $FreeBSD: head/sys/vm/vm_unix.c 79224 2001-07-04 16:20:28Z dillon $
42 */
43
44/*
45 * Traditional sbrk/grow interface to VM
46 */
47#include "opt_bleed.h"
48
49#include <sys/param.h>

--- 19 unchanged lines hidden (view full) ---

69int
70obreak(p, uap)
71 struct proc *p;
72 struct obreak_args *uap;
73{
74 register struct vmspace *vm = p->p_vmspace;
75 vm_offset_t new, old, base;
76 int rv;
42 */
43
44/*
45 * Traditional sbrk/grow interface to VM
46 */
47#include "opt_bleed.h"
48
49#include <sys/param.h>

--- 19 unchanged lines hidden (view full) ---

69int
70obreak(p, uap)
71 struct proc *p;
72 struct obreak_args *uap;
73{
74 register struct vmspace *vm = p->p_vmspace;
75 vm_offset_t new, old, base;
76 int rv;
77 int error = 0;
77
78
79 mtx_lock(&Giant); /* syscall marked mp-safe but isn't */
80
78 base = round_page((vm_offset_t) vm->vm_daddr);
79 new = round_page((vm_offset_t)uap->nsize);
80 old = base + ctob(vm->vm_dsize);
81 if (new > base) {
82 /*
83 * We check resource limits here, but alow processes to
84 * reduce their usage, even if they remain over the limit.
85 */
86 if (new > old &&
81 base = round_page((vm_offset_t) vm->vm_daddr);
82 new = round_page((vm_offset_t)uap->nsize);
83 old = base + ctob(vm->vm_dsize);
84 if (new > base) {
85 /*
86 * We check resource limits here, but alow processes to
87 * reduce their usage, even if they remain over the limit.
88 */
89 if (new > old &&
87 (new - base) > (unsigned) p->p_rlimit[RLIMIT_DATA].rlim_cur)
88 return ENOMEM;
89 if (new >= VM_MAXUSER_ADDRESS)
90 return (ENOMEM);
90 (new - base) > (unsigned) p->p_rlimit[RLIMIT_DATA].rlim_cur) {
91 error = ENOMEM;
92 goto done;
93 }
94 if (new >= VM_MAXUSER_ADDRESS) {
95 error = ENOMEM;
96 goto done;
97 }
91 } else if (new < base) {
92 /*
93 * This is simply an invalid value. If someone wants to
94 * do fancy address space manipulations, mmap and munmap
95 * can do most of what the user would want.
96 */
98 } else if (new < base) {
99 /*
100 * This is simply an invalid value. If someone wants to
101 * do fancy address space manipulations, mmap and munmap
102 * can do most of what the user would want.
103 */
97 return EINVAL;
104 error = EINVAL;
105 goto done;
98 }
99
100 if (new > old) {
101 vm_size_t diff;
102
103 diff = new - old;
106 }
107
108 if (new > old) {
109 vm_size_t diff;
110
111 diff = new - old;
104#ifndef BLEED
105 mtx_lock(&Giant);
106#endif
107 mtx_lock(&vm_mtx);
108 rv = vm_map_find(&vm->vm_map, NULL, 0, &old, diff, FALSE,
109 VM_PROT_ALL, VM_PROT_ALL, 0);
110 if (rv != KERN_SUCCESS) {
112 rv = vm_map_find(&vm->vm_map, NULL, 0, &old, diff, FALSE,
113 VM_PROT_ALL, VM_PROT_ALL, 0);
114 if (rv != KERN_SUCCESS) {
111 mtx_unlock(&vm_mtx);
112 return (ENOMEM);
115 error = ENOMEM;
116 goto done;
113 }
114 vm->vm_dsize += btoc(diff);
117 }
118 vm->vm_dsize += btoc(diff);
115 mtx_unlock(&vm_mtx);
116#ifndef BLEED
117 mtx_unlock(&Giant);
118#endif
119 } else if (new < old) {
119 } else if (new < old) {
120 mtx_lock(&Giant);
121 mtx_lock(&vm_mtx);
122 rv = vm_map_remove(&vm->vm_map, new, old);
123 if (rv != KERN_SUCCESS) {
120 rv = vm_map_remove(&vm->vm_map, new, old);
121 if (rv != KERN_SUCCESS) {
124 mtx_unlock(&vm_mtx);
125 mtx_unlock(&Giant);
126 return (ENOMEM);
122 error = ENOMEM;
123 goto done;
127 }
128 vm->vm_dsize -= btoc(old - new);
124 }
125 vm->vm_dsize -= btoc(old - new);
129 mtx_unlock(&vm_mtx);
130 mtx_unlock(&Giant);
131 }
126 }
132 return (0);
127done:
128 mtx_unlock(&Giant);
129 return (error);
133}
134
135#ifndef _SYS_SYSPROTO_H_
136struct ovadvise_args {
137 int anom;
138};
139#endif
140
141/* ARGSUSED */
142int
143ovadvise(p, uap)
144 struct proc *p;
145 struct ovadvise_args *uap;
146{
130}
131
132#ifndef _SYS_SYSPROTO_H_
133struct ovadvise_args {
134 int anom;
135};
136#endif
137
138/* ARGSUSED */
139int
140ovadvise(p, uap)
141 struct proc *p;
142 struct ovadvise_args *uap;
143{
147
144 /* START_GIANT_OPTIONAL */
145 /* END_GIANT_OPTIONAL */
148 return (EINVAL);
149}
146 return (EINVAL);
147}