Use PBDRY flag for msleep(9) in NFS and NLM when sleeping thread owns
kernel resources that block other threads, like vnode locks. The SIGSTOP sent to such thread (process, rather) shall not stop it until thread releases the resources. Tested by: pho Reviewed by: jhb Approved by: re (kensmith)
This commit is contained in:
parent
f33a947b56
commit
b35687df13
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=195703
@ -1254,7 +1254,7 @@ nfs_getcacheblk(struct vnode *vp, daddr_t bn, int size, struct thread *td)
|
||||
sigset_t oldset;
|
||||
|
||||
nfs_set_sigmask(td, &oldset);
|
||||
bp = getblk(vp, bn, size, PCATCH, 0, 0);
|
||||
bp = getblk(vp, bn, size, NFS_PCATCH, 0, 0);
|
||||
nfs_restore_sigmask(td, &oldset);
|
||||
while (bp == NULL) {
|
||||
if (nfs_sigintr(nmp, td))
|
||||
@ -1291,7 +1291,7 @@ nfs_vinvalbuf(struct vnode *vp, int flags, struct thread *td, int intrflg)
|
||||
if ((nmp->nm_flag & NFSMNT_INT) == 0)
|
||||
intrflg = 0;
|
||||
if (intrflg) {
|
||||
slpflag = PCATCH;
|
||||
slpflag = NFS_PCATCH;
|
||||
slptimeo = 2 * hz;
|
||||
} else {
|
||||
slpflag = 0;
|
||||
@ -1370,7 +1370,7 @@ nfs_asyncio(struct nfsmount *nmp, struct buf *bp, struct ucred *cred, struct thr
|
||||
}
|
||||
again:
|
||||
if (nmp->nm_flag & NFSMNT_INT)
|
||||
slpflag = PCATCH;
|
||||
slpflag = NFS_PCATCH;
|
||||
gotiod = FALSE;
|
||||
|
||||
/*
|
||||
@ -1439,7 +1439,7 @@ nfs_asyncio(struct nfsmount *nmp, struct buf *bp, struct ucred *cred, struct thr
|
||||
mtx_unlock(&nfs_iod_mtx);
|
||||
return (error2);
|
||||
}
|
||||
if (slpflag == PCATCH) {
|
||||
if (slpflag == NFS_PCATCH) {
|
||||
slpflag = 0;
|
||||
slptimeo = 2 * hz;
|
||||
}
|
||||
|
@ -2934,7 +2934,7 @@ nfs_flush(struct vnode *vp, int waitfor, int commit)
|
||||
int bvecsize = 0, bveccount;
|
||||
|
||||
if (nmp->nm_flag & NFSMNT_INT)
|
||||
slpflag = PCATCH;
|
||||
slpflag = NFS_PCATCH;
|
||||
if (!commit)
|
||||
passone = 0;
|
||||
bo = &vp->v_bufobj;
|
||||
@ -3132,7 +3132,7 @@ nfs_flush(struct vnode *vp, int waitfor, int commit)
|
||||
error = EINTR;
|
||||
goto done;
|
||||
}
|
||||
if (slpflag == PCATCH) {
|
||||
if (slpflag & PCATCH) {
|
||||
slpflag = 0;
|
||||
slptimeo = 2 * hz;
|
||||
}
|
||||
@ -3170,7 +3170,7 @@ nfs_flush(struct vnode *vp, int waitfor, int commit)
|
||||
error = nfs_sigintr(nmp, td);
|
||||
if (error)
|
||||
goto done;
|
||||
if (slpflag == PCATCH) {
|
||||
if (slpflag & PCATCH) {
|
||||
slpflag = 0;
|
||||
slptimeo = 2 * hz;
|
||||
}
|
||||
|
@ -107,6 +107,8 @@ struct nfsmount {
|
||||
#define NFS_TPRINTF_DELAY 30
|
||||
#endif
|
||||
|
||||
#define NFS_PCATCH (PCATCH | PBDRY)
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -264,7 +264,8 @@ clnt_reconnect_call(
|
||||
stat = clnt_reconnect_connect(cl);
|
||||
if (stat == RPC_SYSTEMERROR) {
|
||||
error = tsleep(&fake_wchan,
|
||||
rc->rc_intr ? PCATCH : 0, "rpccon", hz);
|
||||
rc->rc_intr ? PCATCH | PBDRY : 0, "rpccon",
|
||||
hz);
|
||||
if (error == EINTR || error == ERESTART)
|
||||
return (RPC_INTR);
|
||||
tries++;
|
||||
|
@ -196,7 +196,7 @@ clnt_vc_create(
|
||||
while ((so->so_state & SS_ISCONNECTING)
|
||||
&& so->so_error == 0) {
|
||||
error = msleep(&so->so_timeo, SOCK_MTX(so),
|
||||
PSOCK | PCATCH, "connec", 0);
|
||||
PSOCK | PCATCH | PBDRY, "connec", 0);
|
||||
if (error) {
|
||||
if (error == EINTR || error == ERESTART)
|
||||
interrupted = 1;
|
||||
@ -477,6 +477,7 @@ clnt_vc_call(
|
||||
errp->re_errno = error;
|
||||
switch (error) {
|
||||
case EINTR:
|
||||
case ERESTART:
|
||||
stat = RPC_INTR;
|
||||
break;
|
||||
case EWOULDBLOCK:
|
||||
@ -709,7 +710,7 @@ clnt_vc_control(CLIENT *cl, u_int request, void *info)
|
||||
|
||||
case CLSET_INTERRUPTIBLE:
|
||||
if (*(int *) info)
|
||||
ct->ct_waitflag = PCATCH;
|
||||
ct->ct_waitflag = PCATCH | PBDRY;
|
||||
else
|
||||
ct->ct_waitflag = 0;
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user