Deleted Added
full compact
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 ---