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