* [PATCH v5 1/3] lib: Add strongly typed 64bit int_sqrt
@ 2017-12-13 14:00 Crt Mori
2017-12-17 12:41 ` Jonathan Cameron
0 siblings, 1 reply; 2+ messages in thread
From: Crt Mori @ 2017-12-13 14:00 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Ingo Molnar, Andrew Morton, Kees Cook, Rusty Russell, Ian Abbott,
Larry Finger, Niklas Soderlund, Thomas Gleixner,
Krzysztof Kozlowski, Masahiro Yamada, linux-kernel, linux-iio,
Crt Mori
There is no option to perform 64bit integer sqrt on 32bit platform.
Added stronger typed int_sqrt64 enables the 64bit calculations to
be performed on 32bit platforms. Although int_sqrt() is a rough
approximation, the same algorithm is used in int_sqrt64() as good
enough on 32bit platform.
Signed-off-by: Crt Mori <cmo@melexis.com>
---
include/linux/kernel.h | 1 +
lib/int_sqrt.c | 26 ++++++++++++++++++++++++++
2 files changed, 27 insertions(+)
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 0ad4c3044cf9..09f53063f2c9 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -459,6 +459,7 @@ extern int kernel_text_address(unsigned long addr);
extern int func_ptr_is_kernel_text(void *ptr);
unsigned long int_sqrt(unsigned long);
+u64 int_sqrt64(u64 x);
extern void bust_spinlocks(int yes);
extern int oops_in_progress; /* If set, an oops, panic(), BUG() or die() is in progress */
diff --git a/lib/int_sqrt.c b/lib/int_sqrt.c
index 1ef4cc344977..de5836448ea3 100644
--- a/lib/int_sqrt.c
+++ b/lib/int_sqrt.c
@@ -36,3 +36,29 @@ unsigned long int_sqrt(unsigned long x)
return y;
}
EXPORT_SYMBOL(int_sqrt);
+
+/**
+ * int_sqrt64 - strongly typed int_sqrt function
+ * @x: 64bit integer of which to calculate the sqrt
+ */
+u64 int_sqrt64(u64 x)
+{
+ u64 b, m, y = 0;
+
+ if (x <= 1)
+ return x;
+
+ m = 1ULL << (64 - 2);
+ while (m != 0) {
+ b = y + m;
+ y >>= 1;
+
+ if (x >= b) {
+ x -= b;
+ y += m;
+ }
+ m >>= 2;
+ }
+ return y;
+}
+EXPORT_SYMBOL(int_sqrt64);
--
2.15.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v5 1/3] lib: Add strongly typed 64bit int_sqrt
2017-12-13 14:00 [PATCH v5 1/3] lib: Add strongly typed 64bit int_sqrt Crt Mori
@ 2017-12-17 12:41 ` Jonathan Cameron
0 siblings, 0 replies; 2+ messages in thread
From: Jonathan Cameron @ 2017-12-17 12:41 UTC (permalink / raw)
To: Crt Mori
Cc: Ingo Molnar, Andrew Morton, Kees Cook, Rusty Russell, Ian Abbott,
Larry Finger, Niklas Soderlund, Thomas Gleixner,
Krzysztof Kozlowski, Masahiro Yamada, linux-kernel, linux-iio
On Wed, 13 Dec 2017 15:00:39 +0100
Crt Mori <cmo@melexis.com> wrote:
> There is no option to perform 64bit integer sqrt on 32bit platform.
> Added stronger typed int_sqrt64 enables the 64bit calculations to
> be performed on 32bit platforms. Although int_sqrt() is a rough
> approximation, the same algorithm is used in int_sqrt64() as good
> enough on 32bit platform.
>
> Signed-off-by: Crt Mori <cmo@melexis.com>
It was my suggestion that we shoudn't really be doing this in an individual
driver. If people feel that it is not of general enough applicability then
let use know and we'll move it back into the driver code.
Thanks,
Jonathan
> ---
> include/linux/kernel.h | 1 +
> lib/int_sqrt.c | 26 ++++++++++++++++++++++++++
> 2 files changed, 27 insertions(+)
>
> diff --git a/include/linux/kernel.h b/include/linux/kernel.h
> index 0ad4c3044cf9..09f53063f2c9 100644
> --- a/include/linux/kernel.h
> +++ b/include/linux/kernel.h
> @@ -459,6 +459,7 @@ extern int kernel_text_address(unsigned long addr);
> extern int func_ptr_is_kernel_text(void *ptr);
>
> unsigned long int_sqrt(unsigned long);
> +u64 int_sqrt64(u64 x);
>
> extern void bust_spinlocks(int yes);
> extern int oops_in_progress; /* If set, an oops, panic(), BUG() or die() is in progress */
> diff --git a/lib/int_sqrt.c b/lib/int_sqrt.c
> index 1ef4cc344977..de5836448ea3 100644
> --- a/lib/int_sqrt.c
> +++ b/lib/int_sqrt.c
> @@ -36,3 +36,29 @@ unsigned long int_sqrt(unsigned long x)
> return y;
> }
> EXPORT_SYMBOL(int_sqrt);
> +
> +/**
> + * int_sqrt64 - strongly typed int_sqrt function
> + * @x: 64bit integer of which to calculate the sqrt
> + */
> +u64 int_sqrt64(u64 x)
> +{
> + u64 b, m, y = 0;
> +
> + if (x <= 1)
> + return x;
> +
> + m = 1ULL << (64 - 2);
> + while (m != 0) {
> + b = y + m;
> + y >>= 1;
> +
> + if (x >= b) {
> + x -= b;
> + y += m;
> + }
> + m >>= 2;
> + }
> + return y;
> +}
> +EXPORT_SYMBOL(int_sqrt64);
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-12-17 12:41 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-12-13 14:00 [PATCH v5 1/3] lib: Add strongly typed 64bit int_sqrt Crt Mori
2017-12-17 12:41 ` Jonathan Cameron
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox