Author: imp
Date: Fri Jan 17 01:16:23 2020
New Revision: 356820
URL: https://svnweb.freebsd.org/changeset/base/356820

Log:
  We only want to send the speedup to the lower layers when there's a shortage.
  
  Only send a speedup when there's a shortage. While this is a little racy, lost
  races aren't a big deal for this function. If there's a shorage just popping 
up
  after we check these values, then we'll catch it next time. If there's a
  shortage that's just clearing up, we may do some work at the lower layers a
  little sooner than we otherwise would have. Sicne shortages are relatively 
rare
  events, both races are acceptable.
  
  Reviewed by: chs
  Differential Revision: https://reviews.freebsd.org/D23182

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

Modified: head/sys/ufs/ffs/ffs_softdep.c
==============================================================================
--- head/sys/ufs/ffs/ffs_softdep.c      Fri Jan 17 01:16:19 2020        
(r356819)
+++ head/sys/ufs/ffs/ffs_softdep.c      Fri Jan 17 01:16:23 2020        
(r356820)
@@ -13771,23 +13771,28 @@ check_clear_deps(mp)
        struct mount *mp;
 {
        struct ufsmount *ump;
+       bool suj_susp;
 
        /*
-        * Tell the lower layers that any TRIM or WRITE transactions
-        * that have been delayed for performance reasons should
-        * proceed to help alleviate the shortage faster.
+        * Tell the lower layers that any TRIM or WRITE transactions that have
+        * been delayed for performance reasons should proceed to help alleviate
+        * the shortage faster. The race between checking req_* and the softdep
+        * mutex (lk) is fine since this is an advisory operation that at most
+        * causes deferred work to be done sooner.
         */
        ump = VFSTOUFS(mp);
-       FREE_LOCK(ump);
-       softdep_send_speedup(ump, 0, BIO_SPEEDUP_TRIM | BIO_SPEEDUP_WRITE);
-       ACQUIRE_LOCK(ump);
+       suj_susp = MOUNTEDSUJ(mp) && ump->softdep_jblocks->jb_suspended;
+       if (req_clear_remove || req_clear_inodedeps || suj_susp) {
+               FREE_LOCK(ump);
+               softdep_send_speedup(ump, 0, BIO_SPEEDUP_TRIM | 
BIO_SPEEDUP_WRITE);
+               ACQUIRE_LOCK(ump);
+       }
 
-
        /*
         * If we are suspended, it may be because of our using
         * too many inodedeps, so help clear them out.
         */
-       if (MOUNTEDSUJ(mp) && VFSTOUFS(mp)->softdep_jblocks->jb_suspended)
+       if (suj_susp)
                clear_inodedeps(mp);
 
        /*
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to