Author: mav
Date: Mon Aug  7 14:34:05 2017
New Revision: 322169
URL: https://svnweb.freebsd.org/changeset/base/322169

Log:
  Fix hrtimer_active() in case of cancellation.
  
  While there, switch to FreeBSD internal callout active status.
  
  Reviewed by:  markj, hselasky
  Sponsored by: iXsystems, Inc.
  Differential Revision:        https://reviews.freebsd.org/D11900

Modified:
  head/sys/compat/linuxkpi/common/include/linux/hrtimer.h
  head/sys/compat/linuxkpi/common/src/linux_hrtimer.c

Modified: head/sys/compat/linuxkpi/common/include/linux/hrtimer.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/hrtimer.h     Mon Aug  7 
14:09:57 2017        (r322168)
+++ head/sys/compat/linuxkpi/common/include/linux/hrtimer.h     Mon Aug  7 
14:34:05 2017        (r322169)
@@ -48,7 +48,6 @@ struct hrtimer {
        enum hrtimer_restart (*function)(struct hrtimer *);
        struct mtx mtx;
        struct callout callout;
-       uint32_t flags;
 };
 
 #define        hrtimer_active(hrtimer) linux_hrtimer_active(hrtimer)

Modified: head/sys/compat/linuxkpi/common/src/linux_hrtimer.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_hrtimer.c Mon Aug  7 14:09:57 
2017        (r322168)
+++ head/sys/compat/linuxkpi/common/src/linux_hrtimer.c Mon Aug  7 14:34:05 
2017        (r322169)
@@ -37,9 +37,6 @@ __FBSDID("$FreeBSD$");
 
 #include <linux/hrtimer.h>
 
-/* hrtimer flags */
-#define        HRTIMER_ACTIVE          0x01
-
 static void
 hrtimer_call_handler(void *arg)
 {
@@ -49,7 +46,7 @@ hrtimer_call_handler(void *arg)
        hrtimer = arg;
        ret = hrtimer->function(hrtimer);
        MPASS(ret == HRTIMER_NORESTART);
-       hrtimer->flags &= ~HRTIMER_ACTIVE;
+       callout_deactivate(&hrtimer->callout);
 }
 
 bool
@@ -58,19 +55,20 @@ linux_hrtimer_active(struct hrtimer *hrtimer)
        bool ret;
 
        mtx_lock(&hrtimer->mtx);
-       ret = (hrtimer->flags & HRTIMER_ACTIVE) != 0;
+       ret = callout_active(&hrtimer->callout);
        mtx_unlock(&hrtimer->mtx);
        return (ret);
 }
 
+/*
+ * Cancel active hrtimer.
+ * Return 1 if timer was active and cancellation succeeded, or 0 otherwise.
+ */
 int
 linux_hrtimer_cancel(struct hrtimer *hrtimer)
 {
 
-       if (!hrtimer_active(hrtimer))
-               return (0);
-       (void)callout_drain(&hrtimer->callout);
-       return (1);
+       return (callout_drain(&hrtimer->callout) > 0);
 }
 
 void
@@ -78,7 +76,6 @@ linux_hrtimer_init(struct hrtimer *hrtimer)
 {
 
        hrtimer->function = NULL;
-       hrtimer->flags = 0;
        mtx_init(&hrtimer->mtx, "hrtimer", NULL, MTX_DEF | MTX_RECURSE);
        callout_init_mtx(&hrtimer->callout, &hrtimer->mtx, 0);
 }
@@ -103,6 +100,5 @@ linux_hrtimer_start_range_ns(struct hrtimer *hrtimer, 
        mtx_lock(&hrtimer->mtx);
        callout_reset_sbt(&hrtimer->callout, nstosbt(time.tv64), nstosbt(nsec),
            hrtimer_call_handler, hrtimer, 0);
-       hrtimer->flags |= HRTIMER_ACTIVE;
        mtx_unlock(&hrtimer->mtx);
 }
_______________________________________________
[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