From 0049f8b27b056b2a674fb838e13cd6e86f2a48e1 Mon Sep 17 00:00:00 2001 From: Alan Cox <alc@FreeBSD.org> Date: Fri, 9 Jul 2004 05:28:38 +0000 Subject: [PATCH] Eliminate struct shm_handle. It is an unnecessary level of indirection to a vm_object. --- sys/kern/sysv_shm.c | 36 ++++++++++++------------------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c index 64867812744a..14309420cd56 100644 --- a/sys/kern/sysv_shm.c +++ b/sys/kern/sysv_shm.c @@ -87,11 +87,6 @@ static sy_call_t *shmcalls[] = { static int shm_last_free, shm_nused, shm_committed, shmalloced; static struct shmid_ds *shmsegs; -struct shm_handle { - /* vm_offset_t kva; */ - vm_object_t shm_object; -}; - struct shmmap_state { vm_offset_t va; int shmid; @@ -206,14 +201,11 @@ static void shm_deallocate_segment(shmseg) struct shmid_ds *shmseg; { - struct shm_handle *shm_handle; size_t size; GIANT_REQUIRED; - shm_handle = shmseg->shm_internal; - vm_object_deallocate(shm_handle->shm_object); - free(shm_handle, M_SHM); + vm_object_deallocate(shmseg->shm_internal); shmseg->shm_internal = NULL; size = round_page(shmseg->shm_segsz); shm_committed -= btoc(size); @@ -311,7 +303,6 @@ kern_shmat(td, shmid, shmaddr, shmflg) int i, flags; struct shmid_ds *shmseg; struct shmmap_state *shmmap_s = NULL; - struct shm_handle *shm_handle; vm_offset_t attach_va; vm_prot_t prot; vm_size_t size; @@ -377,12 +368,11 @@ kern_shmat(td, shmid, shmaddr, shmflg) PROC_UNLOCK(p); } - shm_handle = shmseg->shm_internal; - vm_object_reference(shm_handle->shm_object); - rv = vm_map_find(&p->p_vmspace->vm_map, shm_handle->shm_object, + vm_object_reference(shmseg->shm_internal); + rv = vm_map_find(&p->p_vmspace->vm_map, shmseg->shm_internal, 0, &attach_va, size, (flags & MAP_FIXED)?0:1, prot, prot, 0); if (rv != KERN_SUCCESS) { - vm_object_deallocate(shm_handle->shm_object); + vm_object_deallocate(shmseg->shm_internal); error = ENOMEM; goto done2; } @@ -674,7 +664,7 @@ shmget_allocate_segment(td, uap, mode) int i, segnum, shmid, size; struct ucred *cred = td->td_ucred; struct shmid_ds *shmseg; - struct shm_handle *shm_handle; + vm_object_t shm_object; GIANT_REQUIRED; @@ -705,8 +695,6 @@ shmget_allocate_segment(td, uap, mode) shmseg->shm_perm.mode = SHMSEG_ALLOCATED | SHMSEG_REMOVED; shmseg->shm_perm.key = uap->key; shmseg->shm_perm.seq = (shmseg->shm_perm.seq + 1) & 0x7fff; - shm_handle = (struct shm_handle *) - malloc(sizeof(struct shm_handle), M_SHM, M_WAITOK); shmid = IXSEQ_TO_IPCID(segnum, shmseg->shm_perm); /* @@ -714,18 +702,18 @@ shmget_allocate_segment(td, uap, mode) * to. */ if (shm_use_phys) { - shm_handle->shm_object = + shm_object = vm_pager_allocate(OBJT_PHYS, 0, size, VM_PROT_DEFAULT, 0); } else { - shm_handle->shm_object = + shm_object = vm_pager_allocate(OBJT_SWAP, 0, size, VM_PROT_DEFAULT, 0); } - VM_OBJECT_LOCK(shm_handle->shm_object); - vm_object_clear_flag(shm_handle->shm_object, OBJ_ONEMAPPING); - vm_object_set_flag(shm_handle->shm_object, OBJ_NOSPLIT); - VM_OBJECT_UNLOCK(shm_handle->shm_object); + VM_OBJECT_LOCK(shm_object); + vm_object_clear_flag(shm_object, OBJ_ONEMAPPING); + vm_object_set_flag(shm_object, OBJ_NOSPLIT); + VM_OBJECT_UNLOCK(shm_object); - shmseg->shm_internal = shm_handle; + shmseg->shm_internal = shm_object; shmseg->shm_perm.cuid = shmseg->shm_perm.uid = cred->cr_uid; shmseg->shm_perm.cgid = shmseg->shm_perm.gid = cred->cr_gid; shmseg->shm_perm.mode = (shmseg->shm_perm.mode & SHMSEG_WANTED) |