Print this page
patch as-lock-macro-simplification
*** 200,214 ****
/*
* Locate segment containing address of interest.
*/
page = (caddr_t)(uintptr_t)((uintptr_t)addr & PAGEMASK);
retrycnt = 0;
! AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
retry:
if ((seg = as_segat(as, page)) == NULL ||
!page_valid(seg, page)) {
! AS_LOCK_EXIT(as, &as->a_lock);
return (ENXIO);
}
SEGOP_GETPROT(seg, page, 0, &prot);
protchanged = 0;
--- 200,214 ----
/*
* Locate segment containing address of interest.
*/
page = (caddr_t)(uintptr_t)((uintptr_t)addr & PAGEMASK);
retrycnt = 0;
! AS_LOCK_ENTER(as, RW_WRITER);
retry:
if ((seg = as_segat(as, page)) == NULL ||
!page_valid(seg, page)) {
! AS_LOCK_EXIT(as);
return (ENXIO);
}
SEGOP_GETPROT(seg, page, 0, &prot);
protchanged = 0;
*** 222,232 ****
retrycnt++;
goto retry;
}
if (err != 0) {
! AS_LOCK_EXIT(as, &as->a_lock);
return (ENXIO);
}
}
/*
--- 222,232 ----
retrycnt++;
goto retry;
}
if (err != 0) {
! AS_LOCK_EXIT(as);
return (ENXIO);
}
}
/*
*** 245,255 ****
rw = S_READ;
if (SEGOP_FAULT(as->a_hat, seg, page, PAGESIZE, F_SOFTLOCK, rw)) {
if (protchanged)
(void) SEGOP_SETPROT(seg, page, PAGESIZE, prot);
! AS_LOCK_EXIT(as, &as->a_lock);
return (ENXIO);
}
CPU_STATS_ADD_K(vm, softlock, 1);
/*
--- 245,255 ----
rw = S_READ;
if (SEGOP_FAULT(as->a_hat, seg, page, PAGESIZE, F_SOFTLOCK, rw)) {
if (protchanged)
(void) SEGOP_SETPROT(seg, page, PAGESIZE, prot);
! AS_LOCK_EXIT(as);
return (ENXIO);
}
CPU_STATS_ADD_K(vm, softlock, 1);
/*
*** 306,316 ****
(void) SEGOP_FAULT(as->a_hat, seg, page, PAGESIZE, F_SOFTUNLOCK, rw);
if (protchanged)
(void) SEGOP_SETPROT(seg, page, PAGESIZE, prot);
! AS_LOCK_EXIT(as, &as->a_lock);
return (error);
}
int
--- 306,316 ----
(void) SEGOP_FAULT(as->a_hat, seg, page, PAGESIZE, F_SOFTUNLOCK, rw);
if (protchanged)
(void) SEGOP_SETPROT(seg, page, PAGESIZE, prot);
! AS_LOCK_EXIT(as);
return (error);
}
int