Print this page
patch fix-bad-code
patch as-lock-macro-simplification

*** 5607,5617 **** struct as *as = pp->p_as; vnode_t *vp; int allow = 1; ASSERT(pp->p_as != &kas); ! AS_LOCK_ENTER(as, &as->a_lock, RW_READER); for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) { /* * Cannot enter zone with shared anon memory which * reserves swap. See comment above. --- 5607,5617 ---- struct as *as = pp->p_as; vnode_t *vp; int allow = 1; ASSERT(pp->p_as != &kas); ! AS_LOCK_ENTER(as, RW_READER); for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) { /* * Cannot enter zone with shared anon memory which * reserves swap. See comment above.
*** 5630,5640 **** if (!vn_can_change_zones(vp)) { /* bail on first match */ allow = 0; break; } } ! AS_LOCK_EXIT(as, &as->a_lock); return (allow); } /* * Count swap reserved by curproc's address space --- 5630,5640 ---- if (!vn_can_change_zones(vp)) { /* bail on first match */ allow = 0; break; } } ! AS_LOCK_EXIT(as); return (allow); } /* * Count swap reserved by curproc's address space
*** 5646,5656 **** struct seg *seg; struct as *as = pp->p_as; size_t swap = 0; ASSERT(pp->p_as != &kas); ! ASSERT(AS_WRITE_HELD(as, &as->a_lock)); for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) swap += seg_swresv(seg); return (swap); } --- 5646,5656 ---- struct seg *seg; struct as *as = pp->p_as; size_t swap = 0; ASSERT(pp->p_as != &kas); ! ASSERT(AS_WRITE_HELD(as)); for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) swap += seg_swresv(seg); return (swap); }
*** 5851,5861 **** * reservation from the global zone to the non global zone because * asynchronous faults on the processes' address space can lock * memory and reserve swap via MCL_FUTURE and MAP_NORESERVE * segments respectively. */ ! AS_LOCK_ENTER(pp->as, &pp->p_as->a_lock, RW_WRITER); swap = as_swresv(); mutex_enter(&pp->p_lock); zone_proj0 = zone->zone_zsched->p_task->tk_proj; /* verify that we do not exceed and task or lwp limits */ mutex_enter(&zone->zone_nlwps_lock); --- 5851,5861 ---- * reservation from the global zone to the non global zone because * asynchronous faults on the processes' address space can lock * memory and reserve swap via MCL_FUTURE and MAP_NORESERVE * segments respectively. */ ! AS_LOCK_ENTER(pp->p_as, RW_WRITER); swap = as_swresv(); mutex_enter(&pp->p_lock); zone_proj0 = zone->zone_zsched->p_task->tk_proj; /* verify that we do not exceed and task or lwp limits */ mutex_enter(&zone->zone_nlwps_lock);
*** 5898,5908 **** mutex_exit(&(pp->p_task->tk_proj->kpj_data.kpd_crypto_lock)); pp->p_flag |= SZONETOP; pp->p_zone = zone; mutex_exit(&pp->p_lock); ! AS_LOCK_EXIT(pp->p_as, &pp->p_as->a_lock); /* * Joining the zone cannot fail from now on. * * This means that a lot of the following code can be commonized and --- 5898,5908 ---- mutex_exit(&(pp->p_task->tk_proj->kpj_data.kpd_crypto_lock)); pp->p_flag |= SZONETOP; pp->p_zone = zone; mutex_exit(&pp->p_lock); ! AS_LOCK_EXIT(pp->p_as); /* * Joining the zone cannot fail from now on. * * This means that a lot of the following code can be commonized and