svn commit: r363112 - head/sys/kern
Mateusz Guzik
mjg at FreeBSD.org
Sat Jul 11 21:57:04 UTC 2020
Author: mjg
Date: Sat Jul 11 21:57:03 2020
New Revision: 363112
URL: https://svnweb.freebsd.org/changeset/base/363112
Log:
fd: stop looping in pwd_hold
We don't expect to fail acquiring the reference unless running into a corner
case. Just in case ensure forward progress by taking the lock.
Reviewed by: kib, markj
Differential Revision: https://reviews.freebsd.org/D25616
Modified:
head/sys/kern/kern_descrip.c
Modified: head/sys/kern/kern_descrip.c
==============================================================================
--- head/sys/kern/kern_descrip.c Sat Jul 11 20:56:57 2020 (r363111)
+++ head/sys/kern/kern_descrip.c Sat Jul 11 21:57:03 2020 (r363112)
@@ -3347,13 +3347,17 @@ pwd_hold(struct thread *td)
fdp = td->td_proc->p_fd;
smr_enter(pwd_smr);
- for (;;) {
- pwd = smr_entered_load(&fdp->fd_pwd, pwd_smr);
- MPASS(pwd != NULL);
- if (refcount_acquire_if_not_zero(&pwd->pwd_refcount))
- break;
+ pwd = smr_entered_load(&fdp->fd_pwd, pwd_smr);
+ MPASS(pwd != NULL);
+ if (__predict_true(refcount_acquire_if_not_zero(&pwd->pwd_refcount))) {
+ smr_exit(pwd_smr);
+ return (pwd);
}
smr_exit(pwd_smr);
+ FILEDESC_SLOCK(fdp);
+ pwd = pwd_hold_filedesc(fdp);
+ MPASS(pwd != NULL);
+ FILEDESC_SUNLOCK(fdp);
return (pwd);
}
More information about the svn-src-all
mailing list