Author: markj
Date: Mon Jun 26 16:28:46 2017
New Revision: 320364
URL: https://svnweb.freebsd.org/changeset/base/320364

Log:
  Implement parts of the hrtimer API in the LinuxKPI.
  
  Reviewed by:  hselasky
  MFC after:    1 week
  Differential Revision:        https://reviews.freebsd.org/D11359

Added:
  head/sys/compat/linuxkpi/common/include/linux/hrtimer.h   (contents, props 
changed)
  head/sys/compat/linuxkpi/common/src/linux_hrtimer.c   (contents, props 
changed)
Modified:
  head/sys/conf/files
  head/sys/modules/linuxkpi/Makefile

Added: head/sys/compat/linuxkpi/common/include/linux/hrtimer.h
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/compat/linuxkpi/common/include/linux/hrtimer.h     Mon Jun 26 
16:28:46 2017        (r320364)
@@ -0,0 +1,79 @@
+/*-
+ * Copyright (c) 2017 Mark Johnston <ma...@freebsd.org>
+ * 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 <sys/_callout.h>
+#include <sys/_mutex.h>
+
+#include <linux/ktime.h>
+#include <linux/timer.h>
+
+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_ */

Added: head/sys/compat/linuxkpi/common/src/linux_hrtimer.c
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/compat/linuxkpi/common/src/linux_hrtimer.c Mon Jun 26 16:28:46 
2017        (r320364)
@@ -0,0 +1,108 @@
+/*-
+ * Copyright (c) 2017 Mark Johnston <ma...@freebsd.org>
+ * 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 <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/time.h>
+
+#include <machine/cpu.h>
+
+#include <linux/hrtimer.h>
+
+/* 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;
+}
+
+bool
+linux_hrtimer_active(struct hrtimer *hrtimer)
+{
+       bool ret;
+
+       mtx_lock(&hrtimer->mtx);
+       ret = (hrtimer->flags & HRTIMER_ACTIVE) != 0;
+       mtx_unlock(&hrtimer->mtx);
+       return (ret);
+}
+
+int
+linux_hrtimer_cancel(struct hrtimer *hrtimer)
+{
+
+       if (!hrtimer_active(hrtimer))
+               return (0);
+       (void)callout_drain(&hrtimer->callout);
+       return (1);
+}
+
+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, time.tv64 * SBT_1NS,
+           nsec * SBT_1NS, hrtimer_call_handler, hrtimer, 0);
+       hrtimer->flags |= HRTIMER_ACTIVE;
+       mtx_unlock(&hrtimer->mtx);
+}

Modified: head/sys/conf/files
==============================================================================
--- head/sys/conf/files Mon Jun 26 16:08:28 2017        (r320363)
+++ head/sys/conf/files Mon Jun 26 16:28:46 2017        (r320364)
@@ -4269,6 +4269,8 @@ compat/linuxkpi/common/src/linux_compat.c optional com
        compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_current.c     optional compat_linuxkpi \
        compile-with "${LINUXKPI_C}"
+compat/linuxkpi/common/src/linux_hrtimer.c     optional compat_linuxkpi \
+       compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_kthread.c     optional compat_linuxkpi \
        compile-with "${LINUXKPI_C}"
 compat/linuxkpi/common/src/linux_lock.c                optional 
compat_linuxkpi \

Modified: head/sys/modules/linuxkpi/Makefile
==============================================================================
--- head/sys/modules/linuxkpi/Makefile  Mon Jun 26 16:08:28 2017        
(r320363)
+++ head/sys/modules/linuxkpi/Makefile  Mon Jun 26 16:28:46 2017        
(r320364)
@@ -5,6 +5,7 @@ KMOD=   linuxkpi
 SRCS=  linux_kmod.c \
        linux_compat.c \
        linux_current.c \
+       linux_hrtimer.c \
        linux_kthread.c \
        linux_lock.c \
        linux_page.c \
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to