47934cef8f
the syscall arguments and does the suser() permission check, and kern_mlock(), which does the resource limit checking and calls vm_map_wire(). Split munlock() in a similar way. Enable the RLIMIT_MEMLOCK checking code in kern_mlock(). Replace calls to vslock() and vsunlock() in the sysctl code with calls to kern_mlock() and kern_munlock() so that the sysctl code will obey the wired memory limits. Nuke the vslock() and vsunlock() implementations, which are no longer used. Add a member to struct sysctl_req to track the amount of memory that is wired to handle the request. Modify sysctl_wire_old_buffer() to return an error if its call to kern_mlock() fails. Only wire the minimum of the length specified in the sysctl request and the length specified in its argument list. It is recommended that sysctl handlers that use sysctl_wire_old_buffer() should specify reasonable estimates for the amount of data they want to return so that only the minimum amount of memory is wired no matter what length has been specified by the request. Modify the callers of sysctl_wire_old_buffer() to look for the error return. Modify sysctl_old_user to obey the wired buffer length and clean up its implementation. Reviewed by: bms
104 lines
4.5 KiB
C
104 lines
4.5 KiB
C
/*-
|
|
* Copyright (c) 1992, 1993
|
|
* The Regents of the University of California. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
* must display the following acknowledgement:
|
|
* This product includes software developed by the University of
|
|
* California, Berkeley and its contributors.
|
|
* 4. Neither the name of the University nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*
|
|
* @(#)vm_extern.h 8.2 (Berkeley) 1/12/94
|
|
* $FreeBSD$
|
|
*/
|
|
|
|
#ifndef _VM_EXTERN_H_
|
|
#define _VM_EXTERN_H_
|
|
|
|
struct buf;
|
|
struct proc;
|
|
struct vmspace;
|
|
struct vmtotal;
|
|
struct mount;
|
|
struct vnode;
|
|
|
|
#ifdef _KERNEL
|
|
|
|
#ifdef TYPEDEF_FOR_UAP
|
|
int getpagesize(struct thread *, void *, int *);
|
|
int madvise(struct thread *, void *, int *);
|
|
int mincore(struct thread *, void *, int *);
|
|
int mprotect(struct thread *, void *, int *);
|
|
int msync(struct thread *, void *, int *);
|
|
int munmap(struct thread *, void *, int *);
|
|
int obreak(struct thread *, void *, int *);
|
|
int sbrk(struct thread *, void *, int *);
|
|
int sstk(struct thread *, void *, int *);
|
|
int swapon(struct thread *, void *, int *);
|
|
#endif /* TYPEDEF_FOR_UAP */
|
|
|
|
int kern_mlock(struct thread *, vm_offset_t, vm_size_t);
|
|
int kern_munlock(struct thread *, vm_offset_t, vm_size_t);
|
|
int kernacc(void *, int, int);
|
|
vm_offset_t kmem_alloc(vm_map_t, vm_size_t);
|
|
vm_offset_t kmem_alloc_nofault(vm_map_t, vm_size_t);
|
|
vm_offset_t kmem_alloc_pageable(vm_map_t, vm_size_t);
|
|
vm_offset_t kmem_alloc_wait(vm_map_t, vm_size_t);
|
|
void kmem_free(vm_map_t, vm_offset_t, vm_size_t);
|
|
void kmem_free_wakeup(vm_map_t, vm_offset_t, vm_size_t);
|
|
void kmem_init(vm_offset_t, vm_offset_t);
|
|
vm_offset_t kmem_malloc(vm_map_t, vm_size_t, boolean_t);
|
|
vm_map_t kmem_suballoc(vm_map_t, vm_offset_t *, vm_offset_t *, vm_size_t);
|
|
void swapout_procs(int);
|
|
int useracc(void *, int, int);
|
|
int vm_fault(vm_map_t, vm_offset_t, vm_prot_t, int);
|
|
void vm_fault_copy_entry(vm_map_t, vm_map_t, vm_map_entry_t, vm_map_entry_t);
|
|
void vm_fault_unwire(vm_map_t, vm_offset_t, vm_offset_t);
|
|
int vm_fault_wire(vm_map_t, vm_offset_t, vm_offset_t, boolean_t);
|
|
void vm_forkproc(struct thread *, struct proc *, struct thread *, int);
|
|
void vm_waitproc(struct proc *);
|
|
int vm_mmap(vm_map_t, vm_offset_t *, vm_size_t, vm_prot_t, vm_prot_t, int, void *, vm_ooffset_t);
|
|
void vm_set_page_size(void);
|
|
struct vmspace *vmspace_alloc(vm_offset_t, vm_offset_t);
|
|
struct vmspace *vmspace_fork(struct vmspace *);
|
|
void vmspace_exec(struct proc *, vm_offset_t, vm_offset_t);
|
|
void vmspace_unshare(struct proc *);
|
|
void vmspace_free(struct vmspace *);
|
|
void vmspace_exitfree(struct proc *);
|
|
void vnode_pager_setsize(struct vnode *, vm_ooffset_t);
|
|
void vm_object_print(/* db_expr_t */ long, boolean_t, /* db_expr_t */ long,
|
|
char *);
|
|
int vm_fault_quick(caddr_t v, int prot);
|
|
void vm_proc_new(struct proc *p);
|
|
void vm_proc_dispose(struct proc *p);
|
|
void vm_thread_dispose(struct thread *td);
|
|
void vm_thread_dispose_altkstack(struct thread *td);
|
|
void vm_thread_new(struct thread *td, int pages);
|
|
void vm_thread_new_altkstack(struct thread *td, int pages);
|
|
void vm_thread_swapin(struct thread *td);
|
|
void vm_thread_swapout(struct thread *td);
|
|
#endif /* _KERNEL */
|
|
#endif /* !_VM_EXTERN_H_ */
|