summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleksandr Suvorov <oleksandr.suvorov@toradex.com>2020-04-08 16:20:51 +0300
committerOleksandr Suvorov <oleksandr.suvorov@toradex.com>2020-04-09 18:55:05 +0300
commit2ecd4dcc7d5aad1bfcad77a5c6b25ede7b1fc683 (patch)
treeacc355bc973c564adace8f8cd671ae0ae26cc11b
parentffa0566db4112477eff1203e81942a72864b6c25 (diff)
compat: make backports-4.18 compatible with kernel < 3.19
backports-4.18.c uses ktime_divns() function. As ktime_divns() is not exported in kernel < 3.19, this symbol will not be resolved on compat.ko loading. This fixes the linking issue [1]. [1] ------------------------------- WARNING: "ktime_divns" [compat/compat.ko] undefined! ------------------------------- Related-to: ELB-2388 Signed-off-by: Oleksandr Suvorov <oleksandr.suvorov@toradex.com>
-rw-r--r--compat/backport-4.18.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/compat/backport-4.18.c b/compat/backport-4.18.c
index c47fabe..40551c7 100644
--- a/compat/backport-4.18.c
+++ b/compat/backport-4.18.c
@@ -1,11 +1,47 @@
/*
* Copyright (C) 2018 Intel Corporation
+ * Copyright (c) 2020 Toradex
*/
#include <linux/hrtimer.h>
+/*
+ * Before the commit 8b618628b2b the ktime_divns was non-exported function.
+ * Add the simple implementation of ktime_divns() to use in
+ * ktime_get_boottime_seconds().
+ */
+#if LINUX_VERSION_IS_LESS(3,19,0)
+
+#include <linux/ktime.h>
+
+#if BITS_PER_LONG < 64
+/*
+ * Divide a ktime value by a nanosecond value
+ */
+u64 ktime_divns(const ktime_t kt, s64 div)
+{
+ int sft = 0;
+ s64 dclc;
+ u64 tmp;
+
+ dclc = ktime_to_ns(kt);
+ tmp = dclc < 0 ? -dclc : dclc;
+
+ /* Make sure the divisor is less than 2^32: */
+ while (div >> 32) {
+ sft++;
+ div >>= 1;
+ }
+ tmp >>= sft;
+ do_div(tmp, (unsigned long) div);
+ return dclc < 0 ? -tmp : tmp;
+}
+#endif /* BITS_PER_LONG >= 64 */
+#endif /* < 3.19 */
+
time64_t ktime_get_boottime_seconds(void)
{
return ktime_divns(ktime_get_boottime(), NSEC_PER_SEC);
}
EXPORT_SYMBOL_GPL(ktime_get_boottime_seconds);
+