[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20201001205141.8885-4-erez.geva.ext@siemens.com>
Date: Thu, 1 Oct 2020 22:51:37 +0200
From: Erez Geva <erez.geva.ext@...mens.com>
To: linux-kernel@...r.kernel.org, netdev@...r.kernel.org,
Cong Wang <xiyou.wangcong@...il.com>,
"David S . Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>,
Jamal Hadi Salim <jhs@...atatu.com>,
Jiri Pirko <jiri@...nulli.us>, Andrei Vagin <avagin@...il.com>,
Dmitry Safonov <0x7f454c46@...il.com>,
"Eric W . Biederman" <ebiederm@...ssion.com>,
Ingo Molnar <mingo@...nel.org>,
John Stultz <john.stultz@...aro.org>,
Michal Kubecek <mkubecek@...e.cz>,
Oleg Nesterov <oleg@...hat.com>,
Peter Zijlstra <peterz@...radead.org>,
Richard Cochran <richardcochran@...il.com>,
Stephen Boyd <sboyd@...nel.org>,
Thomas Gleixner <tglx@...utronix.de>,
Vladis Dronov <vdronov@...hat.com>,
Sebastian Andrzej Siewior <bigeasy@...utronix.de>,
Frederic Weisbecker <frederic@...nel.org>,
Eric Dumazet <edumazet@...gle.com>
Cc: Jesus Sanchez-Palencia <jesus.sanchez-palencia@...el.com>,
Vinicius Costa Gomes <vinicius.gomes@...el.com>,
Vedang Patel <vedang.patel@...el.com>,
Simon Sudler <simon.sudler@...mens.com>,
Andreas Meisinger <andreas.meisinger@...mens.com>,
Andreas Bucher <andreas.bucher@...mens.com>,
Henning Schild <henning.schild@...mens.com>,
Jan Kiszka <jan.kiszka@...mens.com>,
Andreas Zirkler <andreas.zirkler@...mens.com>,
Ermin Sakic <ermin.sakic@...mens.com>,
An Ninh Nguyen <anninh.nguyen@...mens.com>,
Michael Saenger <michael.saenger@...mens.com>,
Bernd Maehringer <bernd.maehringer@...mens.com>,
Gisela Greinert <gisela.greinert@...mens.com>,
Erez Geva <erez.geva.ext@...mens.com>,
Erez Geva <ErezGeva2@...il.com>
Subject: [PATCH 3/7] Functions to fetch POSIX dynamic clock object
Add kernel functions to fetch a pointer to a POSIX dynamic clock
using a user file description dynamic clock ID.
Signed-off-by: Erez Geva <erez.geva.ext@...mens.com>
---
include/linux/posix-clock.h | 39 +++++++++++++++++++
kernel/time/posix-clock.c | 76 +++++++++++++++++++++++++++++++++++++
2 files changed, 115 insertions(+)
diff --git a/include/linux/posix-clock.h b/include/linux/posix-clock.h
index 468328b1e1dd..e90bd90d3a01 100644
--- a/include/linux/posix-clock.h
+++ b/include/linux/posix-clock.h
@@ -116,4 +116,43 @@ int posix_clock_register(struct posix_clock *clk, struct device *dev);
*/
void posix_clock_unregister(struct posix_clock *clk);
+/**
+ * posix_clock_get_clock() - get reference to a posix clock
+ * @id: A user clockid that uses a posix clock
+ *
+ * Used by kernel code to get a reference to a posix clock.
+ * Increase the reference count, ensure the referece is not removed.
+ */
+struct posix_clock *posix_clock_get_clock(clockid_t id);
+
+/**
+ * posix_clock_put_clock() - release a reference to a posix clock
+ * @clk: The reference to a posix clock to release
+ *
+ * Release a reference to a posix clock.
+ * Reduce the reference count.
+ */
+int posix_clock_put_clock(struct posix_clock *clk);
+
+/**
+ * posix_clock_gettime() - get time from posix clock
+ * @clk: A reference to a posix clock
+ * @ts: pointer to a time structure used to store the time from the posix clock
+ *
+ * Retrieve the time from a posix clock.
+ * In case the clock device was removed, the function return error.
+ */
+int posix_clock_gettime(struct posix_clock *clk, struct timespec64 *ts);
+
+/**
+ * posix_clock_adjtime() - get tune parameters from posix clock
+ * @clk: A reference to a posix clock
+ * @tx: pointer to a kernel timex structure used to store
+ * the tune parameters from the posix clock
+ *
+ * Retrieve the tune parameters from a posix clock.
+ * In case the clock device was removed, the function return error.
+ */
+int posix_clock_adjtime(struct posix_clock *clk, struct __kernel_timex *tx);
+
#endif
diff --git a/kernel/time/posix-clock.c b/kernel/time/posix-clock.c
index 77c0c2370b6d..1e205eea6ebd 100644
--- a/kernel/time/posix-clock.c
+++ b/kernel/time/posix-clock.c
@@ -315,3 +315,79 @@ const struct k_clock clock_posix_dynamic = {
.clock_get_timespec = pc_clock_gettime,
.clock_adj = pc_clock_adjtime,
};
+
+struct posix_clock *posix_clock_get_clock(clockid_t id)
+{
+ int err;
+ struct posix_clock_desc cd;
+
+ /* Verify we use posix clock ID */
+ if (!is_clockid_fd_clock(id))
+ return ERR_PTR(-EINVAL);
+
+ err = get_clock_desc(id, &cd);
+ if (err)
+ return ERR_PTR(err);
+
+ get_device(cd.clk->dev);
+
+ put_clock_desc(&cd);
+
+ return cd.clk;
+}
+EXPORT_SYMBOL_GPL(posix_clock_get_clock);
+
+int posix_clock_put_clock(struct posix_clock *clk)
+{
+ if (IS_ERR_OR_NULL(clk))
+ return -EINVAL;
+ put_device(clk->dev);
+ return 0;
+}
+EXPORT_SYMBOL_GPL(posix_clock_put_clock);
+
+int posix_clock_gettime(struct posix_clock *clk, struct timespec64 *ts)
+{
+ int err;
+
+ if (IS_ERR_OR_NULL(clk))
+ return -EINVAL;
+
+ down_read(&clk->rwsem);
+
+ if (clk->zombie)
+ err = -ENODEV;
+ else if (clk->ops.clock_gettime)
+ err = clk->ops.clock_gettime(clk, ts);
+ else
+ err = -EOPNOTSUPP;
+
+ up_read(&clk->rwsem);
+ return err;
+}
+EXPORT_SYMBOL_GPL(posix_clock_gettime);
+
+int posix_clock_adjtime(struct posix_clock *clk, struct __kernel_timex *tx)
+{
+ int err;
+
+ /* Allow read only */
+ if (tx->modes != 0)
+ return -EINVAL;
+
+ if (IS_ERR_OR_NULL(clk))
+ return -EINVAL;
+
+ down_read(&clk->rwsem);
+
+ if (clk->zombie)
+ err = -ENODEV;
+ else if (clk->ops.clock_adjtime)
+ err = clk->ops.clock_adjtime(clk, tx);
+ else
+ err = -EOPNOTSUPP;
+
+ up_read(&clk->rwsem);
+ return err;
+}
+EXPORT_SYMBOL_GPL(posix_clock_adjtime);
--
2.20.1
Powered by blists - more mailing lists