sysv_shm.c (189283) | sysv_shm.c (189398) |
---|---|
1/* $NetBSD: sysv_shm.c,v 1.23 1994/07/04 23:25:12 glass Exp $ */ 2/*- 3 * Copyright (c) 1994 Adam Glass and Charles Hannum. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 46 unchanged lines hidden (view full) --- 55 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 56 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 57 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 58 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 59 * SUCH DAMAGE. 60 */ 61 62#include <sys/cdefs.h> | 1/* $NetBSD: sysv_shm.c,v 1.23 1994/07/04 23:25:12 glass Exp $ */ 2/*- 3 * Copyright (c) 1994 Adam Glass and Charles Hannum. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 46 unchanged lines hidden (view full) --- 55 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 56 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 57 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 58 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 59 * SUCH DAMAGE. 60 */ 61 62#include <sys/cdefs.h> |
63__FBSDID("$FreeBSD: head/sys/kern/sysv_shm.c 189283 2009-03-02 18:53:30Z kib $"); | 63__FBSDID("$FreeBSD: head/sys/kern/sysv_shm.c 189398 2009-03-05 11:45:42Z kib $"); |
64 65#include "opt_compat.h" 66#include "opt_sysvipc.h" 67#include "opt_mac.h" 68 69#include <sys/param.h> 70#include <sys/systm.h> 71#include <sys/kernel.h> --- 45 unchanged lines hidden (view full) --- 117#endif 118 119#define SHMSEG_FREE 0x0200 120#define SHMSEG_REMOVED 0x0400 121#define SHMSEG_ALLOCATED 0x0800 122#define SHMSEG_WANTED 0x1000 123 124static int shm_last_free, shm_nused, shmalloced; | 64 65#include "opt_compat.h" 66#include "opt_sysvipc.h" 67#include "opt_mac.h" 68 69#include <sys/param.h> 70#include <sys/systm.h> 71#include <sys/kernel.h> --- 45 unchanged lines hidden (view full) --- 117#endif 118 119#define SHMSEG_FREE 0x0200 120#define SHMSEG_REMOVED 0x0400 121#define SHMSEG_ALLOCATED 0x0800 122#define SHMSEG_WANTED 0x1000 123 124static int shm_last_free, shm_nused, shmalloced; |
125size_t shm_committed; | 125vm_size_t shm_committed; |
126static struct shmid_kernel *shmsegs; 127 128struct shmmap_state { 129 vm_offset_t va; 130 int shmid; 131}; 132 133static void shm_deallocate_segment(struct shmid_kernel *); --- 106 unchanged lines hidden (view full) --- 240 return (NULL); 241 return (shmseg); 242} 243 244static void 245shm_deallocate_segment(shmseg) 246 struct shmid_kernel *shmseg; 247{ | 126static struct shmid_kernel *shmsegs; 127 128struct shmmap_state { 129 vm_offset_t va; 130 int shmid; 131}; 132 133static void shm_deallocate_segment(struct shmid_kernel *); --- 106 unchanged lines hidden (view full) --- 240 return (NULL); 241 return (shmseg); 242} 243 244static void 245shm_deallocate_segment(shmseg) 246 struct shmid_kernel *shmseg; 247{ |
248 size_t size; | 248 vm_size_t size; |
249 250 GIANT_REQUIRED; 251 252 vm_object_deallocate(shmseg->u.shm_internal); 253 shmseg->u.shm_internal = NULL; 254 size = round_page(shmseg->shm_bsegsz); 255 shm_committed -= btoc(size); 256 shm_nused--; 257 shmseg->u.shm_perm.mode = SHMSEG_FREE; 258#ifdef MAC 259 mac_sysvshm_cleanup(shmseg); 260#endif 261} 262 263static int 264shm_delete_mapping(struct vmspace *vm, struct shmmap_state *shmmap_s) 265{ 266 struct shmid_kernel *shmseg; 267 int segnum, result; | 249 250 GIANT_REQUIRED; 251 252 vm_object_deallocate(shmseg->u.shm_internal); 253 shmseg->u.shm_internal = NULL; 254 size = round_page(shmseg->shm_bsegsz); 255 shm_committed -= btoc(size); 256 shm_nused--; 257 shmseg->u.shm_perm.mode = SHMSEG_FREE; 258#ifdef MAC 259 mac_sysvshm_cleanup(shmseg); 260#endif 261} 262 263static int 264shm_delete_mapping(struct vmspace *vm, struct shmmap_state *shmmap_s) 265{ 266 struct shmid_kernel *shmseg; 267 int segnum, result; |
268 size_t size; | 268 vm_size_t size; |
269 270 GIANT_REQUIRED; 271 272 segnum = IPCID_TO_IX(shmmap_s->shmid); 273 shmseg = &shmsegs[segnum]; 274 size = round_page(shmseg->shm_bsegsz); 275 result = vm_map_remove(&vm->vm_map, shmmap_s->va, shmmap_s->va + size); 276 if (result != KERN_SUCCESS) --- 80 unchanged lines hidden (view full) --- 357 int rv; 358 int error = 0; 359 360 if (!jail_sysvipc_allowed && jailed(td->td_ucred)) 361 return (ENOSYS); 362 mtx_lock(&Giant); 363 shmmap_s = p->p_vmspace->vm_shm; 364 if (shmmap_s == NULL) { | 269 270 GIANT_REQUIRED; 271 272 segnum = IPCID_TO_IX(shmmap_s->shmid); 273 shmseg = &shmsegs[segnum]; 274 size = round_page(shmseg->shm_bsegsz); 275 result = vm_map_remove(&vm->vm_map, shmmap_s->va, shmmap_s->va + size); 276 if (result != KERN_SUCCESS) --- 80 unchanged lines hidden (view full) --- 357 int rv; 358 int error = 0; 359 360 if (!jail_sysvipc_allowed && jailed(td->td_ucred)) 361 return (ENOSYS); 362 mtx_lock(&Giant); 363 shmmap_s = p->p_vmspace->vm_shm; 364 if (shmmap_s == NULL) { |
365 size = shminfo.shmseg * sizeof(struct shmmap_state); 366 shmmap_s = malloc(size, M_SHM, M_WAITOK); | 365 shmmap_s = malloc(shminfo.shmseg * sizeof(struct shmmap_state), 366 M_SHM, M_WAITOK); |
367 for (i = 0; i < shminfo.shmseg; i++) 368 shmmap_s[i].shmid = -1; 369 p->p_vmspace->vm_shm = shmmap_s; 370 } 371 shmseg = shm_find_segment_by_shmid(shmid); 372 if (shmseg == NULL) { 373 error = EINVAL; 374 goto done2; --- 342 unchanged lines hidden (view full) --- 717 } 718 if ((uap->shmflg & (IPC_CREAT | IPC_EXCL)) == (IPC_CREAT | IPC_EXCL)) 719 return (EEXIST); 720#ifdef MAC 721 error = mac_sysvshm_check_shmget(td->td_ucred, shmseg, uap->shmflg); 722 if (error != 0) 723 return (error); 724#endif | 367 for (i = 0; i < shminfo.shmseg; i++) 368 shmmap_s[i].shmid = -1; 369 p->p_vmspace->vm_shm = shmmap_s; 370 } 371 shmseg = shm_find_segment_by_shmid(shmid); 372 if (shmseg == NULL) { 373 error = EINVAL; 374 goto done2; --- 342 unchanged lines hidden (view full) --- 717 } 718 if ((uap->shmflg & (IPC_CREAT | IPC_EXCL)) == (IPC_CREAT | IPC_EXCL)) 719 return (EEXIST); 720#ifdef MAC 721 error = mac_sysvshm_check_shmget(td->td_ucred, shmseg, uap->shmflg); 722 if (error != 0) 723 return (error); 724#endif |
725 if (uap->size && uap->size > shmseg->shm_bsegsz) | 725 if (uap->size != 0 && uap->size > shmseg->shm_bsegsz) |
726 return (EINVAL); 727 td->td_retval[0] = IXSEQ_TO_IPCID(segnum, shmseg->u.shm_perm); 728 return (0); 729} 730 731static int 732shmget_allocate_segment(td, uap, mode) 733 struct thread *td; --- 304 unchanged lines hidden --- | 726 return (EINVAL); 727 td->td_retval[0] = IXSEQ_TO_IPCID(segnum, shmseg->u.shm_perm); 728 return (0); 729} 730 731static int 732shmget_allocate_segment(td, uap, mode) 733 struct thread *td; --- 304 unchanged lines hidden --- |