| 268 | } |
| 269 | |
| 270 | static int |
| 271 | shm_delete_mapping(struct vmspace *vm, struct shmmap_state *shmmap_s) |
| 272 | { |
| 273 | struct shmid_kernel *shmseg; |
| 274 | int segnum, result; |
| 275 | vm_size_t size; |
| 276 | |
| 277 | SYSVSHM_ASSERT_LOCKED(); |
| 278 | segnum = IPCID_TO_IX(shmmap_s->shmid); |
| 279 | KASSERT(segnum >= 0 && segnum < shmalloced, |
| 280 | ("segnum %d shmalloced %d", segnum, shmalloced)); |
| 281 | |
| 282 | shmseg = &shmsegs[segnum]; |
| 283 | size = round_page(shmseg->u.shm_segsz); |
| 284 | result = vm_map_remove(&vm->vm_map, shmmap_s->va, shmmap_s->va + size); |
| 285 | if (result != KERN_SUCCESS) |
| 286 | return (EINVAL); |
| 287 | shmmap_s->shmid = -1; |
| 288 | shmseg->u.shm_dtime = time_second; |
| 289 | if (--shmseg->u.shm_nattch == 0 && |
| 290 | (shmseg->u.shm_perm.mode & SHMSEG_REMOVED)) { |
| 291 | shm_deallocate_segment(shmseg); |
| 292 | shm_last_free = segnum; |
| 293 | } |
| 294 | return (0); |
| 295 | } |
| 296 | |
| 297 | static void |
| 298 | shm_remove(struct shmid_kernel *shmseg, int segnum) |
no test coverage detected