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 --- |