Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 26 Jun 2017 16:28:46 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r320364 - in head/sys: compat/linuxkpi/common/include/linux compat/linuxkpi/common/src conf modules/linuxkpi
Message-ID:  <201706261628.v5QGSkts092970@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 <markj@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 <markj@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 \



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201706261628.v5QGSkts092970>