svn commit: r322169 - in head/sys/compat/linuxkpi/common: include/linux src
Alexander Motin
mav at FreeBSD.org
Mon Aug 7 14:34:07 UTC 2017
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);
}
More information about the svn-src-all
mailing list