Author: mjg
Date: Tue Aug  4 23:09:15 2020
New Revision: 363875
URL: https://svnweb.freebsd.org/changeset/base/363875

Log:
  ufs: only pass LK_ADAPTIVE if LK_NODDLKTREAT is set
  
  This restores the pre-adaptive spinning state for SU which livelocks
  otherwise. Note this is a bug in SU.
  
  Reported by:  pho

Modified:
  head/sys/ufs/ffs/ffs_vnops.c

Modified: head/sys/ufs/ffs/ffs_vnops.c
==============================================================================
--- head/sys/ufs/ffs/ffs_vnops.c        Tue Aug  4 23:07:42 2020        
(r363874)
+++ head/sys/ufs/ffs/ffs_vnops.c        Tue Aug  4 23:09:15 2020        
(r363875)
@@ -445,7 +445,13 @@ ffs_lock(ap)
        struct lock *lkp;
        int result;
 
-       ap->a_flags |= LK_ADAPTIVE;
+       /*
+        * Adaptive spinning mixed with SU leads to trouble. use a giant hammer
+        * and only use it when LK_NODDLKTREAT is set. Currently this means it
+        * is only used during path lookup.
+        */
+       if ((ap->a_flags & LK_NODDLKTREAT) != 0)
+               ap->a_flags |= LK_ADAPTIVE;
        switch (ap->a_flags & LK_TYPE_MASK) {
        case LK_SHARED:
        case LK_UPGRADE:
@@ -483,7 +489,11 @@ ffs_lock(ap)
        }
        return (result);
 #else
-       ap->a_flags |= LK_ADAPTIVE;
+       /*
+        * See above for an explanation.
+        */
+       if ((ap->a_flags & LK_NODDLKTREAT) != 0)
+               ap->a_flags |= LK_ADAPTIVE;
        return (VOP_LOCK1_APV(&ufs_vnodeops, ap));
 #endif
 }
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to