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);
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to