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));
}
/*