Print this page
patch fixes
6345 remove xhat support

*** 22,33 **** /* * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ - #pragma ident "%Z%%M% %I% %E% SMI" - #include <sys/types.h> #include <sys/t_lock.h> #include <sys/param.h> #include <sys/cred.h> #include <sys/debug.h> --- 22,31 ----
*** 180,204 **** return (0); /* * as->a_wpage can only be changed while the process is totally stopped. * Don't grab p_lock here. Holding p_lock while grabbing the address ! * space lock leads to deadlocks with the clock thread. Note that if an ! * as_fault() is servicing a fault to a watched page on behalf of an ! * XHAT provider, watchpoint will be temporarily cleared (and wp_prot ! * will be set to wp_oprot). Since this is done while holding as writer ! * lock, we need to grab as lock (reader lock is good enough). * * p_maplock prevents simultaneous execution of this function. Under * normal circumstances, holdwatch() will stop all other threads, so the * lock isn't really needed. But there may be multiple threads within * stop() when SWATCHOK is set, so we need to handle multiple threads * at once. See holdwatch() for the details of this dance. */ mutex_enter(&p->p_maplock); - AS_LOCK_ENTER(as, &as->a_lock, RW_READER); tpw.wp_vaddr = (caddr_t)((uintptr_t)addr & (uintptr_t)PAGEMASK); if ((pwp = avl_find(&as->a_wpage, &tpw, &where)) == NULL) pwp = avl_nearest(&as->a_wpage, where, AVL_AFTER); --- 178,197 ---- return (0); /* * as->a_wpage can only be changed while the process is totally stopped. * Don't grab p_lock here. Holding p_lock while grabbing the address ! * space lock leads to deadlocks with the clock thread. * * p_maplock prevents simultaneous execution of this function. Under * normal circumstances, holdwatch() will stop all other threads, so the * lock isn't really needed. But there may be multiple threads within * stop() when SWATCHOK is set, so we need to handle multiple threads * at once. See holdwatch() for the details of this dance. */ mutex_enter(&p->p_maplock); tpw.wp_vaddr = (caddr_t)((uintptr_t)addr & (uintptr_t)PAGEMASK); if ((pwp = avl_find(&as->a_wpage, &tpw, &where)) == NULL) pwp = avl_nearest(&as->a_wpage, where, AVL_AFTER);
*** 229,254 **** /* * Before mapping the page in, ensure that * all other lwps are held in the kernel. */ if (p->p_mapcnt == 0) { - /* - * Release as lock while in holdwatch() - * in case other threads need to grab it. - */ - AS_LOCK_EXIT(as, &as->a_lock); mutex_exit(&p->p_maplock); if (holdwatch() != 0) { /* * We stopped in holdwatch(). * Start all over again because the * watched page list may have changed. */ goto startover; } mutex_enter(&p->p_maplock); - AS_LOCK_ENTER(as, &as->a_lock, RW_READER); } p->p_mapcnt++; } addr = pwp->wp_vaddr; --- 222,241 ----
*** 304,314 **** if (pwp->wp_oprot != 0) { /* if page exists */ struct seg *seg; uint_t oprot; int err, retrycnt = 0; - AS_LOCK_EXIT(as, &as->a_lock); AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER); retry: seg = as_segat(as, addr); ASSERT(seg != NULL); SEGOP_GETPROT(seg, addr, 0, &oprot); --- 291,300 ----
*** 319,330 **** retrycnt++; goto retry; } } AS_LOCK_EXIT(as, &as->a_lock); ! } else ! AS_LOCK_EXIT(as, &as->a_lock); /* * When all pages are mapped back to their normal state, * continue the other lwps. */ --- 305,315 ---- retrycnt++; goto retry; } } AS_LOCK_EXIT(as, &as->a_lock); ! } /* * When all pages are mapped back to their normal state, * continue the other lwps. */
*** 337,351 **** continuelwps(p); mutex_exit(&p->p_lock); mutex_enter(&p->p_maplock); } } - - AS_LOCK_ENTER(as, &as->a_lock, RW_READER); } - AS_LOCK_EXIT(as, &as->a_lock); mutex_exit(&p->p_maplock); return (rv); } --- 322,333 ----
*** 434,444 **** AS_LOCK_EXIT(as, &as->a_lock); } - /* Must be called with as lock held */ int pr_is_watchpage_as(caddr_t addr, enum seg_rw rw, struct as *as) { register struct watched_page *pwp; struct watched_page tpw; --- 416,425 ----
*** 497,517 **** */ int pr_is_watchpage(caddr_t addr, enum seg_rw rw) { struct as *as = curproc->p_as; - int rv; if ((as == &kas) || avl_numnodes(&as->a_wpage) == 0) return (0); ! /* Grab the lock because of XHAT (see comment in pr_mappage()) */ ! AS_LOCK_ENTER(as, &as->a_lock, RW_READER); ! rv = pr_is_watchpage_as(addr, rw, as); ! AS_LOCK_EXIT(as, &as->a_lock); ! ! return (rv); } /* --- 478,492 ---- */ int pr_is_watchpage(caddr_t addr, enum seg_rw rw) { struct as *as = curproc->p_as; if ((as == &kas) || avl_numnodes(&as->a_wpage) == 0) return (0); ! return (pr_is_watchpage_as(addr, rw, as)); } /*