Deleted Added
full compact
sysv_shm.c (77461) sysv_shm.c (79224)
1/* $FreeBSD: head/sys/kern/sysv_shm.c 77461 2001-05-30 03:28:59Z dd $ */
1/* $FreeBSD: head/sys/kern/sysv_shm.c 79224 2001-07-04 16:20:28Z dillon $ */
2/* $NetBSD: sysv_shm.c,v 1.23 1994/07/04 23:25:12 glass Exp $ */
3
4/*
5 * Copyright (c) 1994 Adam Glass and Charles Hannum. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:

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

182
183static void
184shm_deallocate_segment(shmseg)
185 struct shmid_ds *shmseg;
186{
187 struct shm_handle *shm_handle;
188 size_t size;
189
2/* $NetBSD: sysv_shm.c,v 1.23 1994/07/04 23:25:12 glass Exp $ */
3
4/*
5 * Copyright (c) 1994 Adam Glass and Charles Hannum. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:

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

182
183static void
184shm_deallocate_segment(shmseg)
185 struct shmid_ds *shmseg;
186{
187 struct shm_handle *shm_handle;
188 size_t size;
189
190 mtx_assert(&vm_mtx, MA_OWNED); /* For vm_object_deallocate. */
190 GIANT_REQUIRED;
191
191 shm_handle = shmseg->shm_internal;
192 vm_object_deallocate(shm_handle->shm_object);
193 free((caddr_t)shm_handle, M_SHM);
194 shmseg->shm_internal = NULL;
195 size = round_page(shmseg->shm_segsz);
196 shm_committed -= btoc(size);
197 shm_nused--;
198 shmseg->shm_perm.mode = SHMSEG_FREE;
199}
200
201static int
202shm_delete_mapping(p, shmmap_s)
203 struct proc *p;
204 struct shmmap_state *shmmap_s;
205{
206 struct shmid_ds *shmseg;
207 int segnum, result;
208 size_t size;
209
192 shm_handle = shmseg->shm_internal;
193 vm_object_deallocate(shm_handle->shm_object);
194 free((caddr_t)shm_handle, M_SHM);
195 shmseg->shm_internal = NULL;
196 size = round_page(shmseg->shm_segsz);
197 shm_committed -= btoc(size);
198 shm_nused--;
199 shmseg->shm_perm.mode = SHMSEG_FREE;
200}
201
202static int
203shm_delete_mapping(p, shmmap_s)
204 struct proc *p;
205 struct shmmap_state *shmmap_s;
206{
207 struct shmid_ds *shmseg;
208 int segnum, result;
209 size_t size;
210
210 /* For vm_map_remove and shm_deallocate_segment. */
211 mtx_assert(&vm_mtx, MA_OWNED);
211 GIANT_REQUIRED;
212
213 segnum = IPCID_TO_IX(shmmap_s->shmid);
214 shmseg = &shmsegs[segnum];
215 size = round_page(shmseg->shm_segsz);
216 result = vm_map_remove(&p->p_vmspace->vm_map, shmmap_s->va,
217 shmmap_s->va + size);
218 if (result != KERN_SUCCESS)
219 return EINVAL;

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

249 if (shmmap_s == NULL)
250 return EINVAL;
251 for (i = 0; i < shminfo.shmseg; i++, shmmap_s++)
252 if (shmmap_s->shmid != -1 &&
253 shmmap_s->va == (vm_offset_t)uap->shmaddr)
254 break;
255 if (i == shminfo.shmseg)
256 return EINVAL;
212
213 segnum = IPCID_TO_IX(shmmap_s->shmid);
214 shmseg = &shmsegs[segnum];
215 size = round_page(shmseg->shm_segsz);
216 result = vm_map_remove(&p->p_vmspace->vm_map, shmmap_s->va,
217 shmmap_s->va + size);
218 if (result != KERN_SUCCESS)
219 return EINVAL;

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

249 if (shmmap_s == NULL)
250 return EINVAL;
251 for (i = 0; i < shminfo.shmseg; i++, shmmap_s++)
252 if (shmmap_s->shmid != -1 &&
253 shmmap_s->va == (vm_offset_t)uap->shmaddr)
254 break;
255 if (i == shminfo.shmseg)
256 return EINVAL;
257 mtx_lock(&vm_mtx);
258 error = shm_delete_mapping(p, shmmap_s);
257 error = shm_delete_mapping(p, shmmap_s);
259 mtx_unlock(&vm_mtx);
260 return error;
261}
262
263#ifndef _SYS_SYSPROTO_H_
264struct shmat_args {
265 int shmid;
266 void *shmaddr;
267 int shmflg;

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

277 struct shmid_ds *shmseg;
278 struct shmmap_state *shmmap_s = NULL;
279 struct shm_handle *shm_handle;
280 vm_offset_t attach_va;
281 vm_prot_t prot;
282 vm_size_t size;
283 int rv;
284
258 return error;
259}
260
261#ifndef _SYS_SYSPROTO_H_
262struct shmat_args {
263 int shmid;
264 void *shmaddr;
265 int shmflg;

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

275 struct shmid_ds *shmseg;
276 struct shmmap_state *shmmap_s = NULL;
277 struct shm_handle *shm_handle;
278 vm_offset_t attach_va;
279 vm_prot_t prot;
280 vm_size_t size;
281 int rv;
282
283 GIANT_REQUIRED;
284
285 if (!jail_sysvipc_allowed && jailed(p->p_ucred))
286 return (ENOSYS);
287
288 shmmap_s = (struct shmmap_state *)p->p_vmspace->vm_shm;
289 if (shmmap_s == NULL) {
290 size = shminfo.shmseg * sizeof(struct shmmap_state);
291 shmmap_s = malloc(size, M_SHM, M_WAITOK);
292 for (i = 0; i < shminfo.shmseg; i++)

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

329 * This is just a hint to vm_map_find() about where to
330 * put it.
331 */
332 attach_va = round_page((vm_offset_t)p->p_vmspace->vm_taddr
333 + MAXTSIZ + MAXDSIZ);
334 }
335
336 shm_handle = shmseg->shm_internal;
285 if (!jail_sysvipc_allowed && jailed(p->p_ucred))
286 return (ENOSYS);
287
288 shmmap_s = (struct shmmap_state *)p->p_vmspace->vm_shm;
289 if (shmmap_s == NULL) {
290 size = shminfo.shmseg * sizeof(struct shmmap_state);
291 shmmap_s = malloc(size, M_SHM, M_WAITOK);
292 for (i = 0; i < shminfo.shmseg; i++)

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

329 * This is just a hint to vm_map_find() about where to
330 * put it.
331 */
332 attach_va = round_page((vm_offset_t)p->p_vmspace->vm_taddr
333 + MAXTSIZ + MAXDSIZ);
334 }
335
336 shm_handle = shmseg->shm_internal;
337 mtx_lock(&vm_mtx);
338 vm_object_reference(shm_handle->shm_object);
339 rv = vm_map_find(&p->p_vmspace->vm_map, shm_handle->shm_object,
340 0, &attach_va, size, (flags & MAP_FIXED)?0:1, prot, prot, 0);
341 if (rv != KERN_SUCCESS) {
337 vm_object_reference(shm_handle->shm_object);
338 rv = vm_map_find(&p->p_vmspace->vm_map, shm_handle->shm_object,
339 0, &attach_va, size, (flags & MAP_FIXED)?0:1, prot, prot, 0);
340 if (rv != KERN_SUCCESS) {
342 mtx_unlock(&vm_mtx);
343 return ENOMEM;
344 }
345 vm_map_inherit(&p->p_vmspace->vm_map,
346 attach_va, attach_va + size, VM_INHERIT_SHARE);
341 return ENOMEM;
342 }
343 vm_map_inherit(&p->p_vmspace->vm_map,
344 attach_va, attach_va + size, VM_INHERIT_SHARE);
347 mtx_unlock(&vm_mtx);
348
349 shmmap_s->va = attach_va;
350 shmmap_s->shmid = uap->shmid;
351 shmseg->shm_lpid = p->p_pid;
352 shmseg->shm_atime = time_second;
353 shmseg->shm_nattch++;
354 p->p_retval[0] = attach_va;
355 return 0;

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

429shmctl(p, uap)
430 struct proc *p;
431 struct shmctl_args *uap;
432{
433 int error;
434 struct shmid_ds inbuf;
435 struct shmid_ds *shmseg;
436
345
346 shmmap_s->va = attach_va;
347 shmmap_s->shmid = uap->shmid;
348 shmseg->shm_lpid = p->p_pid;
349 shmseg->shm_atime = time_second;
350 shmseg->shm_nattch++;
351 p->p_retval[0] = attach_va;
352 return 0;

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

426shmctl(p, uap)
427 struct proc *p;
428 struct shmctl_args *uap;
429{
430 int error;
431 struct shmid_ds inbuf;
432 struct shmid_ds *shmseg;
433
434 GIANT_REQUIRED;
435
437 if (!jail_sysvipc_allowed && jailed(p->p_ucred))
438 return (ENOSYS);
439
440 shmseg = shm_find_segment_by_shmid(uap->shmid);
441 if (shmseg == NULL)
442 return EINVAL;
443 switch (uap->cmd) {
444 case IPC_STAT:

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

465 break;
466 case IPC_RMID:
467 error = ipcperm(p, &shmseg->shm_perm, IPC_M);
468 if (error)
469 return error;
470 shmseg->shm_perm.key = IPC_PRIVATE;
471 shmseg->shm_perm.mode |= SHMSEG_REMOVED;
472 if (shmseg->shm_nattch <= 0) {
436 if (!jail_sysvipc_allowed && jailed(p->p_ucred))
437 return (ENOSYS);
438
439 shmseg = shm_find_segment_by_shmid(uap->shmid);
440 if (shmseg == NULL)
441 return EINVAL;
442 switch (uap->cmd) {
443 case IPC_STAT:

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

464 break;
465 case IPC_RMID:
466 error = ipcperm(p, &shmseg->shm_perm, IPC_M);
467 if (error)
468 return error;
469 shmseg->shm_perm.key = IPC_PRIVATE;
470 shmseg->shm_perm.mode |= SHMSEG_REMOVED;
471 if (shmseg->shm_nattch <= 0) {
473 mtx_lock(&vm_mtx);
474 shm_deallocate_segment(shmseg);
472 shm_deallocate_segment(shmseg);
475 mtx_unlock(&vm_mtx);
476 shm_last_free = IPCID_TO_IX(uap->shmid);
477 }
478 break;
479#if 0
480 case SHM_LOCK:
481 case SHM_UNLOCK:
482#endif
483 default:

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

534 struct shmget_args *uap;
535 int mode;
536{
537 int i, segnum, shmid, size;
538 struct ucred *cred = p->p_ucred;
539 struct shmid_ds *shmseg;
540 struct shm_handle *shm_handle;
541
473 shm_last_free = IPCID_TO_IX(uap->shmid);
474 }
475 break;
476#if 0
477 case SHM_LOCK:
478 case SHM_UNLOCK:
479#endif
480 default:

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

531 struct shmget_args *uap;
532 int mode;
533{
534 int i, segnum, shmid, size;
535 struct ucred *cred = p->p_ucred;
536 struct shmid_ds *shmseg;
537 struct shm_handle *shm_handle;
538
539 GIANT_REQUIRED;
540
542 if (uap->size < shminfo.shmmin || uap->size > shminfo.shmmax)
543 return EINVAL;
544 if (shm_nused >= shminfo.shmmni) /* Any shmids left? */
545 return ENOSPC;
546 size = round_page(uap->size);
547 if (shm_committed + btoc(size) > shminfo.shmall)
548 return ENOMEM;
549 if (shm_last_free < 0) {

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

569 shm_handle = (struct shm_handle *)
570 malloc(sizeof(struct shm_handle), M_SHM, M_WAITOK);
571 shmid = IXSEQ_TO_IPCID(segnum, shmseg->shm_perm);
572
573 /*
574 * We make sure that we have allocated a pager before we need
575 * to.
576 */
541 if (uap->size < shminfo.shmmin || uap->size > shminfo.shmmax)
542 return EINVAL;
543 if (shm_nused >= shminfo.shmmni) /* Any shmids left? */
544 return ENOSPC;
545 size = round_page(uap->size);
546 if (shm_committed + btoc(size) > shminfo.shmall)
547 return ENOMEM;
548 if (shm_last_free < 0) {

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

568 shm_handle = (struct shm_handle *)
569 malloc(sizeof(struct shm_handle), M_SHM, M_WAITOK);
570 shmid = IXSEQ_TO_IPCID(segnum, shmseg->shm_perm);
571
572 /*
573 * We make sure that we have allocated a pager before we need
574 * to.
575 */
577 mtx_lock(&vm_mtx);
578 if (shm_use_phys) {
579 shm_handle->shm_object =
580 vm_pager_allocate(OBJT_PHYS, 0, size, VM_PROT_DEFAULT, 0);
581 } else {
582 shm_handle->shm_object =
583 vm_pager_allocate(OBJT_SWAP, 0, size, VM_PROT_DEFAULT, 0);
584 }
585 vm_object_clear_flag(shm_handle->shm_object, OBJ_ONEMAPPING);
586 vm_object_set_flag(shm_handle->shm_object, OBJ_NOSPLIT);
576 if (shm_use_phys) {
577 shm_handle->shm_object =
578 vm_pager_allocate(OBJT_PHYS, 0, size, VM_PROT_DEFAULT, 0);
579 } else {
580 shm_handle->shm_object =
581 vm_pager_allocate(OBJT_SWAP, 0, size, VM_PROT_DEFAULT, 0);
582 }
583 vm_object_clear_flag(shm_handle->shm_object, OBJ_ONEMAPPING);
584 vm_object_set_flag(shm_handle->shm_object, OBJ_NOSPLIT);
587 mtx_unlock(&vm_mtx);
588
589 shmseg->shm_internal = shm_handle;
590 shmseg->shm_perm.cuid = shmseg->shm_perm.uid = cred->cr_uid;
591 shmseg->shm_perm.cgid = shmseg->shm_perm.gid = cred->cr_gid;
592 shmseg->shm_perm.mode = (shmseg->shm_perm.mode & SHMSEG_WANTED) |
593 (mode & ACCESSPERMS) | SHMSEG_ALLOCATED;
594 shmseg->shm_segsz = uap->size;
595 shmseg->shm_cpid = p->p_pid;

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

675
676static void
677shmexit_myhook(p)
678 struct proc *p;
679{
680 struct shmmap_state *shmmap_s;
681 int i;
682
585
586 shmseg->shm_internal = shm_handle;
587 shmseg->shm_perm.cuid = shmseg->shm_perm.uid = cred->cr_uid;
588 shmseg->shm_perm.cgid = shmseg->shm_perm.gid = cred->cr_gid;
589 shmseg->shm_perm.mode = (shmseg->shm_perm.mode & SHMSEG_WANTED) |
590 (mode & ACCESSPERMS) | SHMSEG_ALLOCATED;
591 shmseg->shm_segsz = uap->size;
592 shmseg->shm_cpid = p->p_pid;

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

672
673static void
674shmexit_myhook(p)
675 struct proc *p;
676{
677 struct shmmap_state *shmmap_s;
678 int i;
679
683 mtx_assert(&vm_mtx, MA_OWNED); /* For shm_delete_mapping. */
680 GIANT_REQUIRED;
681
684 shmmap_s = (struct shmmap_state *)p->p_vmspace->vm_shm;
685 for (i = 0; i < shminfo.shmseg; i++, shmmap_s++)
686 if (shmmap_s->shmid != -1)
687 shm_delete_mapping(p, shmmap_s);
688 free((caddr_t)p->p_vmspace->vm_shm, M_SHM);
689 p->p_vmspace->vm_shm = NULL;
690}
691

--- 99 unchanged lines hidden ---
682 shmmap_s = (struct shmmap_state *)p->p_vmspace->vm_shm;
683 for (i = 0; i < shminfo.shmseg; i++, shmmap_s++)
684 if (shmmap_s->shmid != -1)
685 shm_delete_mapping(p, shmmap_s);
686 free((caddr_t)p->p_vmspace->vm_shm, M_SHM);
687 p->p_vmspace->vm_shm = NULL;
688}
689

--- 99 unchanged lines hidden ---