Move TDF_DEADLKTREAT into td_pflags (and rename it accordingly) to avoid
having to acquire sched_lock when manipulating it in lockmgr(), uiomove(), and uiomove_fromphys(). Reviewed by: jhb
This commit is contained in:
parent
d97e0534fa
commit
fa2a4d0595
@ -71,10 +71,8 @@ uiomove_fromphys(vm_page_t ma[], vm_offset_t offset, int n, struct uio *uio)
|
||||
KASSERT(uio->uio_segflg != UIO_USERSPACE || uio->uio_td == curthread,
|
||||
("uiomove_fromphys proc"));
|
||||
if (td != NULL) {
|
||||
mtx_lock_spin(&sched_lock);
|
||||
save = td->td_flags & TDF_DEADLKTREAT;
|
||||
td->td_flags |= TDF_DEADLKTREAT;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
save = td->td_pflags & TDP_DEADLKTREAT;
|
||||
td->td_pflags |= TDP_DEADLKTREAT;
|
||||
}
|
||||
while (n > 0 && uio->uio_resid) {
|
||||
iov = uio->uio_iov;
|
||||
@ -119,10 +117,7 @@ uiomove_fromphys(vm_page_t ma[], vm_offset_t offset, int n, struct uio *uio)
|
||||
n -= cnt;
|
||||
}
|
||||
out:
|
||||
if (td != NULL && save == 0) {
|
||||
mtx_lock_spin(&sched_lock);
|
||||
td->td_flags &= ~TDF_DEADLKTREAT;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
}
|
||||
if (td != NULL && save == 0)
|
||||
td->td_pflags &= ~TDP_DEADLKTREAT;
|
||||
return (error);
|
||||
}
|
||||
|
@ -71,10 +71,8 @@ uiomove_fromphys(vm_page_t ma[], vm_offset_t offset, int n, struct uio *uio)
|
||||
KASSERT(uio->uio_segflg != UIO_USERSPACE || uio->uio_td == curthread,
|
||||
("uiomove_fromphys proc"));
|
||||
if (td != NULL) {
|
||||
mtx_lock_spin(&sched_lock);
|
||||
save = td->td_flags & TDF_DEADLKTREAT;
|
||||
td->td_flags |= TDF_DEADLKTREAT;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
save = td->td_pflags & TDP_DEADLKTREAT;
|
||||
td->td_pflags |= TDP_DEADLKTREAT;
|
||||
}
|
||||
while (n > 0 && uio->uio_resid) {
|
||||
iov = uio->uio_iov;
|
||||
@ -118,10 +116,7 @@ uiomove_fromphys(vm_page_t ma[], vm_offset_t offset, int n, struct uio *uio)
|
||||
n -= cnt;
|
||||
}
|
||||
out:
|
||||
if (td != NULL && save == 0) {
|
||||
mtx_lock_spin(&sched_lock);
|
||||
td->td_flags &= ~TDF_DEADLKTREAT;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
}
|
||||
if (td != NULL && save == 0)
|
||||
td->td_pflags &= ~TDP_DEADLKTREAT;
|
||||
return (error);
|
||||
}
|
||||
|
@ -75,10 +75,8 @@ uiomove_fromphys(vm_page_t ma[], vm_offset_t offset, int n, struct uio *uio)
|
||||
KASSERT(uio->uio_segflg != UIO_USERSPACE || uio->uio_td == curthread,
|
||||
("uiomove_fromphys proc"));
|
||||
if (td != NULL) {
|
||||
mtx_lock_spin(&sched_lock);
|
||||
save = td->td_flags & TDF_DEADLKTREAT;
|
||||
td->td_flags |= TDF_DEADLKTREAT;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
save = td->td_pflags & TDP_DEADLKTREAT;
|
||||
td->td_pflags |= TDP_DEADLKTREAT;
|
||||
}
|
||||
while (n > 0 && uio->uio_resid) {
|
||||
iov = uio->uio_iov;
|
||||
@ -122,10 +120,7 @@ uiomove_fromphys(vm_page_t ma[], vm_offset_t offset, int n, struct uio *uio)
|
||||
n -= cnt;
|
||||
}
|
||||
out:
|
||||
if (td != NULL && save == 0) {
|
||||
mtx_lock_spin(&sched_lock);
|
||||
td->td_flags &= ~TDF_DEADLKTREAT;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
}
|
||||
if (td != NULL && save == 0)
|
||||
td->td_pflags &= ~TDP_DEADLKTREAT;
|
||||
return (error);
|
||||
}
|
||||
|
@ -71,10 +71,8 @@ uiomove_fromphys(vm_page_t ma[], vm_offset_t offset, int n, struct uio *uio)
|
||||
KASSERT(uio->uio_segflg != UIO_USERSPACE || uio->uio_td == curthread,
|
||||
("uiomove_fromphys proc"));
|
||||
if (td != NULL) {
|
||||
mtx_lock_spin(&sched_lock);
|
||||
save = td->td_flags & TDF_DEADLKTREAT;
|
||||
td->td_flags |= TDF_DEADLKTREAT;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
save = td->td_pflags & TDP_DEADLKTREAT;
|
||||
td->td_pflags |= TDP_DEADLKTREAT;
|
||||
}
|
||||
while (n > 0 && uio->uio_resid) {
|
||||
iov = uio->uio_iov;
|
||||
@ -119,10 +117,7 @@ uiomove_fromphys(vm_page_t ma[], vm_offset_t offset, int n, struct uio *uio)
|
||||
n -= cnt;
|
||||
}
|
||||
out:
|
||||
if (td != NULL && save == 0) {
|
||||
mtx_lock_spin(&sched_lock);
|
||||
td->td_flags &= ~TDF_DEADLKTREAT;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
}
|
||||
if (td != NULL && save == 0)
|
||||
td->td_pflags &= ~TDP_DEADLKTREAT;
|
||||
return (error);
|
||||
}
|
||||
|
@ -71,10 +71,8 @@ uiomove_fromphys(vm_page_t ma[], vm_offset_t offset, int n, struct uio *uio)
|
||||
KASSERT(uio->uio_segflg != UIO_USERSPACE || uio->uio_td == curthread,
|
||||
("uiomove_fromphys proc"));
|
||||
if (td != NULL) {
|
||||
mtx_lock_spin(&sched_lock);
|
||||
save = td->td_flags & TDF_DEADLKTREAT;
|
||||
td->td_flags |= TDF_DEADLKTREAT;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
save = td->td_pflags & TDP_DEADLKTREAT;
|
||||
td->td_pflags |= TDP_DEADLKTREAT;
|
||||
}
|
||||
while (n > 0 && uio->uio_resid) {
|
||||
iov = uio->uio_iov;
|
||||
@ -119,10 +117,7 @@ uiomove_fromphys(vm_page_t ma[], vm_offset_t offset, int n, struct uio *uio)
|
||||
n -= cnt;
|
||||
}
|
||||
out:
|
||||
if (td != NULL && save == 0) {
|
||||
mtx_lock_spin(&sched_lock);
|
||||
td->td_flags &= ~TDF_DEADLKTREAT;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
}
|
||||
if (td != NULL && save == 0)
|
||||
td->td_pflags &= ~TDP_DEADLKTREAT;
|
||||
return (error);
|
||||
}
|
||||
|
@ -251,16 +251,14 @@ debuglockmgr(lkp, flags, interlkp, td, name, file, line)
|
||||
* while there is an exclusive lock holder or while an
|
||||
* exclusive lock request or upgrade request is in progress.
|
||||
*
|
||||
* However, if TDF_DEADLKTREAT is set, we override exclusive
|
||||
* However, if TDP_DEADLKTREAT is set, we override exclusive
|
||||
* lock requests or upgrade requests ( but not the exclusive
|
||||
* lock itself ).
|
||||
*/
|
||||
if (lkp->lk_lockholder != thr) {
|
||||
lockflags = LK_HAVE_EXCL;
|
||||
mtx_lock_spin(&sched_lock);
|
||||
if (td != NULL && !(td->td_flags & TDF_DEADLKTREAT))
|
||||
if (td != NULL && !(td->td_pflags & TDP_DEADLKTREAT))
|
||||
lockflags |= LK_WANT_EXCL | LK_WANT_UPGRADE;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
error = acquire(&lkp, extflags, lockflags);
|
||||
if (error)
|
||||
break;
|
||||
|
@ -140,10 +140,8 @@ uiomove(void *cp, int n, struct uio *uio)
|
||||
("uiomove proc"));
|
||||
|
||||
if (td) {
|
||||
mtx_lock_spin(&sched_lock);
|
||||
save = td->td_flags & TDF_DEADLKTREAT;
|
||||
td->td_flags |= TDF_DEADLKTREAT;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
save = td->td_pflags & TDP_DEADLKTREAT;
|
||||
td->td_pflags |= TDP_DEADLKTREAT;
|
||||
}
|
||||
|
||||
while (n > 0 && uio->uio_resid) {
|
||||
@ -187,11 +185,8 @@ uiomove(void *cp, int n, struct uio *uio)
|
||||
n -= cnt;
|
||||
}
|
||||
out:
|
||||
if (td && save == 0) {
|
||||
mtx_lock_spin(&sched_lock);
|
||||
td->td_flags &= ~TDF_DEADLKTREAT;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
}
|
||||
if (td && save == 0)
|
||||
td->td_pflags &= ~TDP_DEADLKTREAT;
|
||||
return (error);
|
||||
}
|
||||
|
||||
|
@ -71,10 +71,8 @@ uiomove_fromphys(vm_page_t ma[], vm_offset_t offset, int n, struct uio *uio)
|
||||
KASSERT(uio->uio_segflg != UIO_USERSPACE || uio->uio_td == curthread,
|
||||
("uiomove_fromphys proc"));
|
||||
if (td != NULL) {
|
||||
mtx_lock_spin(&sched_lock);
|
||||
save = td->td_flags & TDF_DEADLKTREAT;
|
||||
td->td_flags |= TDF_DEADLKTREAT;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
save = td->td_pflags & TDP_DEADLKTREAT;
|
||||
td->td_pflags |= TDP_DEADLKTREAT;
|
||||
}
|
||||
while (n > 0 && uio->uio_resid) {
|
||||
iov = uio->uio_iov;
|
||||
@ -118,10 +116,7 @@ uiomove_fromphys(vm_page_t ma[], vm_offset_t offset, int n, struct uio *uio)
|
||||
n -= cnt;
|
||||
}
|
||||
out:
|
||||
if (td != NULL && save == 0) {
|
||||
mtx_lock_spin(&sched_lock);
|
||||
td->td_flags &= ~TDF_DEADLKTREAT;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
}
|
||||
if (td != NULL && save == 0)
|
||||
td->td_pflags &= ~TDP_DEADLKTREAT;
|
||||
return (error);
|
||||
}
|
||||
|
@ -71,10 +71,8 @@ uiomove_fromphys(vm_page_t ma[], vm_offset_t offset, int n, struct uio *uio)
|
||||
KASSERT(uio->uio_segflg != UIO_USERSPACE || uio->uio_td == curthread,
|
||||
("uiomove_fromphys proc"));
|
||||
if (td != NULL) {
|
||||
mtx_lock_spin(&sched_lock);
|
||||
save = td->td_flags & TDF_DEADLKTREAT;
|
||||
td->td_flags |= TDF_DEADLKTREAT;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
save = td->td_pflags & TDP_DEADLKTREAT;
|
||||
td->td_pflags |= TDP_DEADLKTREAT;
|
||||
}
|
||||
while (n > 0 && uio->uio_resid) {
|
||||
iov = uio->uio_iov;
|
||||
@ -118,10 +116,7 @@ uiomove_fromphys(vm_page_t ma[], vm_offset_t offset, int n, struct uio *uio)
|
||||
n -= cnt;
|
||||
}
|
||||
out:
|
||||
if (td != NULL && save == 0) {
|
||||
mtx_lock_spin(&sched_lock);
|
||||
td->td_flags &= ~TDF_DEADLKTREAT;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
}
|
||||
if (td != NULL && save == 0)
|
||||
td->td_pflags &= ~TDP_DEADLKTREAT;
|
||||
return (error);
|
||||
}
|
||||
|
@ -77,10 +77,8 @@ uiomove_fromphys(vm_page_t ma[], vm_offset_t offset, int n, struct uio *uio)
|
||||
KASSERT(uio->uio_segflg != UIO_USERSPACE || uio->uio_td == curthread,
|
||||
("uiomove_fromphys proc"));
|
||||
if (td != NULL) {
|
||||
mtx_lock_spin(&sched_lock);
|
||||
save = td->td_flags & TDF_DEADLKTREAT;
|
||||
td->td_flags |= TDF_DEADLKTREAT;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
save = td->td_pflags & TDP_DEADLKTREAT;
|
||||
td->td_pflags |= TDP_DEADLKTREAT;
|
||||
}
|
||||
while (n > 0 && uio->uio_resid) {
|
||||
iov = uio->uio_iov;
|
||||
@ -133,10 +131,7 @@ uiomove_fromphys(vm_page_t ma[], vm_offset_t offset, int n, struct uio *uio)
|
||||
n -= cnt;
|
||||
}
|
||||
out:
|
||||
if (td != NULL && save == 0) {
|
||||
mtx_lock_spin(&sched_lock);
|
||||
td->td_flags &= ~TDF_DEADLKTREAT;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
}
|
||||
if (td != NULL && save == 0)
|
||||
td->td_pflags &= ~TDP_DEADLKTREAT;
|
||||
return (error);
|
||||
}
|
||||
|
@ -355,7 +355,6 @@ struct thread {
|
||||
#define TDF_NEEDSIGCHK 0x020000 /* Thread may need signal delivery. */
|
||||
#define TDF_UMTXWAKEUP 0x080000 /* Libthr thread must not sleep on a umtx. */
|
||||
#define TDF_THRWAKEUP 0x100000 /* Libthr thread must not suspend itself. */
|
||||
#define TDF_DEADLKTREAT 0x800000 /* Lock aquisition - deadlock treatment. */
|
||||
|
||||
/* "Private" flags kept in td_pflags: */
|
||||
#define TDP_OLDMASK 0x0001 /* Need to restore mask after suspend. */
|
||||
@ -364,6 +363,7 @@ struct thread {
|
||||
#define TDP_UPCALLING 0x0008 /* This thread is doing an upcall. */
|
||||
#define TDP_COWINPROGRESS 0x0010 /* Snapshot copy-on-write in progress. */
|
||||
#define TDP_ALTSTACK 0x0020 /* Have alternate signal stack. */
|
||||
#define TDP_DEADLKTREAT 0x0040 /* Lock aquisition - deadlock treatment. */
|
||||
#define TDP_SA 0x0080 /* A scheduler activation based thread. */
|
||||
|
||||
#define TDI_SUSPENDED 0x0001 /* On suspension queue. */
|
||||
|
@ -436,8 +436,8 @@ ffs_rawread(struct vnode *vp,
|
||||
uio->uio_iovcnt == 1 &&
|
||||
uio->uio_segflg == UIO_USERSPACE &&
|
||||
uio->uio_resid == uio->uio_iov->iov_len &&
|
||||
(((uio->uio_td != NULL) ? uio->uio_td : curthread)->td_flags &
|
||||
TDF_DEADLKTREAT) == 0) {
|
||||
(((uio->uio_td != NULL) ? uio->uio_td : curthread)->td_pflags &
|
||||
TDP_DEADLKTREAT) == 0) {
|
||||
int secsize; /* Media sector size */
|
||||
off_t filebytes; /* Bytes left of file */
|
||||
int blockbytes; /* Bytes left of file in full blocks */
|
||||
|
Loading…
x
Reference in New Issue
Block a user