Index: head/sys/compat/linuxkpi/common/include/linux/hrtimer.h =================================================================== --- head/sys/compat/linuxkpi/common/include/linux/hrtimer.h (revision 322168) +++ head/sys/compat/linuxkpi/common/include/linux/hrtimer.h (revision 322169) @@ -1,79 +1,78 @@ /*- * Copyright (c) 2017 Mark Johnston * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice unmodified, this list of conditions, and the following * disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD$ */ #ifndef _LINUX_HRTIMER_H_ #define _LINUX_HRTIMER_H_ #include #include #include #include enum hrtimer_mode { HRTIMER_MODE_REL, }; enum hrtimer_restart { HRTIMER_RESTART, HRTIMER_NORESTART, }; 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) #define hrtimer_cancel(hrtimer) linux_hrtimer_cancel(hrtimer) #define hrtimer_init(hrtimer, clock, mode) do { \ CTASSERT((clock) == CLOCK_MONOTONIC); \ CTASSERT((mode) == HRTIMER_MODE_REL); \ linux_hrtimer_init(hrtimer); \ } while (0) #define hrtimer_set_expires(hrtimer, time) \ linux_hrtimer_set_expires(hrtimer, time) #define hrtimer_start(hrtimer, time, mode) do { \ CTASSERT((mode) == HRTIMER_MODE_REL); \ linux_hrtimer_start(hrtimer, time); \ } while (0) #define hrtimer_start_range_ns(hrtimer, time, prec, mode) do { \ CTASSERT((mode) == HRTIMER_MODE_REL); \ linux_hrtimer_start_range_ns(hrtimer, time, prec); \ } while (0) bool linux_hrtimer_active(struct hrtimer *); int linux_hrtimer_cancel(struct hrtimer *); void linux_hrtimer_init(struct hrtimer *); void linux_hrtimer_set_expires(struct hrtimer *, ktime_t); void linux_hrtimer_start(struct hrtimer *, ktime_t); void linux_hrtimer_start_range_ns(struct hrtimer *, ktime_t, int64_t); #endif /* _LINUX_HRTIMER_H_ */ Index: head/sys/compat/linuxkpi/common/src/linux_hrtimer.c =================================================================== --- head/sys/compat/linuxkpi/common/src/linux_hrtimer.c (revision 322168) +++ head/sys/compat/linuxkpi/common/src/linux_hrtimer.c (revision 322169) @@ -1,108 +1,104 @@ /*- * Copyright (c) 2017 Mark Johnston * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice unmodified, this list of conditions, and the following * disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include __FBSDID("$FreeBSD$"); #include #include #include #include #include #include #include -/* hrtimer flags */ -#define HRTIMER_ACTIVE 0x01 - static void hrtimer_call_handler(void *arg) { struct hrtimer *hrtimer; enum hrtimer_restart ret; hrtimer = arg; ret = hrtimer->function(hrtimer); MPASS(ret == HRTIMER_NORESTART); - hrtimer->flags &= ~HRTIMER_ACTIVE; + callout_deactivate(&hrtimer->callout); } bool 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 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); } void linux_hrtimer_set_expires(struct hrtimer *hrtimer __unused, ktime_t time __unused) { } void linux_hrtimer_start(struct hrtimer *hrtimer, ktime_t time) { linux_hrtimer_start_range_ns(hrtimer, time, 0); } void linux_hrtimer_start_range_ns(struct hrtimer *hrtimer, ktime_t time, int64_t nsec) { 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); }