Print this page
patch as-lock-macro-simplification
*** 1482,1502 ****
* from /dev/null. The mapping is from
* /dev/null if the mapping comes from
* segdev and the type is neither MAP_SHARED
* nor MAP_PRIVATE.
*/
! AS_LOCK_ENTER(as, &as->a_lock, RW_READER);
seg = as_findseg(as, myaddr, 0);
MOBJ_STAT_ADD(exec_addr_mapped);
if (seg && seg->s_ops == &segdev_ops &&
((SEGOP_GETTYPE(seg, myaddr) &
(MAP_SHARED | MAP_PRIVATE)) == 0) &&
myaddr >= seg->s_base &&
myaddr + mylen <=
seg->s_base + seg->s_size) {
MOBJ_STAT_ADD(exec_addr_devnull);
! AS_LOCK_EXIT(as, &as->a_lock);
(void) as_unmap(as, myaddr, mylen);
ret = as_map(as, myaddr, mylen, segvn_create,
&crargs);
mrp[i].mr_flags |= MR_RESV;
if (ret) {
--- 1482,1502 ----
* from /dev/null. The mapping is from
* /dev/null if the mapping comes from
* segdev and the type is neither MAP_SHARED
* nor MAP_PRIVATE.
*/
! AS_LOCK_ENTER(as, RW_READER);
seg = as_findseg(as, myaddr, 0);
MOBJ_STAT_ADD(exec_addr_mapped);
if (seg && seg->s_ops == &segdev_ops &&
((SEGOP_GETTYPE(seg, myaddr) &
(MAP_SHARED | MAP_PRIVATE)) == 0) &&
myaddr >= seg->s_base &&
myaddr + mylen <=
seg->s_base + seg->s_size) {
MOBJ_STAT_ADD(exec_addr_devnull);
! AS_LOCK_EXIT(as);
(void) as_unmap(as, myaddr, mylen);
ret = as_map(as, myaddr, mylen, segvn_create,
&crargs);
mrp[i].mr_flags |= MR_RESV;
if (ret) {
*** 1505,1515 ****
mmapobj_unmap_exec(mrp, i + 1,
start_addr);
return (ret);
}
} else {
! AS_LOCK_EXIT(as, &as->a_lock);
as_rangeunlock(as);
mmapobj_unmap_exec(mrp, i, start_addr);
MOBJ_STAT_ADD(exec_addr_in_use);
return (EADDRINUSE);
}
--- 1505,1515 ----
mmapobj_unmap_exec(mrp, i + 1,
start_addr);
return (ret);
}
} else {
! AS_LOCK_EXIT(as);
as_rangeunlock(as);
mmapobj_unmap_exec(mrp, i, start_addr);
MOBJ_STAT_ADD(exec_addr_in_use);
return (EADDRINUSE);
}