Author: hselasky
Date: Mon Sep 21 18:21:59 2020
New Revision: 365962
URL: https://svnweb.freebsd.org/changeset/base/365962

Log:
  MFC r365237:
  Micro optimise _callout_stop_safe() by removing dead code.
  
  The CS_DRAIN flag cannot be set at the same time like the async-drain function
  pointer is set. These are orthogonal features. Assert this at the beginning
  of the function.
  
  Before:
          if (flags & CS_DRAIN) {
                  /* FALLTHROUGH */
          } else if (xxx) {
                  return yyy;
          }
          if (drain) {
                  zzz = drain;
          }
  After:
          if (flags & CS_DRAIN) {
                  /* FALLTHROUGH */
          } else if (xxx) {
                  return yyy;
          } else {
                  if (drain) {
                          zzz = drain;
                  }
          }
  
  Reviewed by:  markj@
  Tested by:    callout_test
  Differential Revision:        https://reviews.freebsd.org/D26285
  Sponsored by: Mellanox Technologies // NVIDIA Networking

Modified:
  stable/12/sys/kern/kern_timeout.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/kern/kern_timeout.c
==============================================================================
--- stable/12/sys/kern/kern_timeout.c   Mon Sep 21 18:19:48 2020        
(r365961)
+++ stable/12/sys/kern/kern_timeout.c   Mon Sep 21 18:21:59 2020        
(r365962)
@@ -1188,6 +1188,9 @@ _callout_stop_safe(struct callout *c, int flags, callo
                WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, c->c_lock,
                    "calling %s", __func__);
 
+       KASSERT((flags & CS_DRAIN) == 0 || drain == NULL,
+           ("Cannot set drain callback and CS_DRAIN flag at the same time"));
+
        /*
         * Some old subsystems don't hold Giant while running a callout_stop(),
         * so just discard this check for the moment.
@@ -1383,11 +1386,12 @@ again:
                        }
                        CC_UNLOCK(cc);
                        return ((flags & CS_EXECUTING) != 0);
-               }
-               CTR3(KTR_CALLOUT, "failed to stop %p func %p arg %p",
-                   c, c->c_func, c->c_arg);
-               if (drain) {
-                       cc_exec_drain(cc, direct) = drain;
+               } else {
+                       CTR3(KTR_CALLOUT, "failed to stop %p func %p arg %p",
+                           c, c->c_func, c->c_arg);
+                       if (drain) {
+                               cc_exec_drain(cc, direct) = drain;
+                       }
                }
                KASSERT(!sq_locked, ("sleepqueue chain still locked"));
                cancelled = ((flags & CS_EXECUTING) != 0);
_______________________________________________
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