diff mbox series

[kvm-unit-tests,1/5] lib: Add pseudo random functions

Message ID 20231213124942.604109-2-nsg@linux.ibm.com (mailing list archive)
State New, archived
Headers show
Series s390x: STFLE nested interpretation | expand

Commit Message

Nina Schoetterl-Glausch Dec. 13, 2023, 12:49 p.m. UTC
Add functions for generating pseudo random 32 and 64 bit values.
The implementation is very simple and the randomness likely not
of high quality.

Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
---
 Makefile       |  1 +
 lib/libcflat.h |  7 +++++++
 lib/rand.c     | 19 +++++++++++++++++++
 3 files changed, 27 insertions(+)
 create mode 100644 lib/rand.c

Comments

Andrew Jones Dec. 13, 2023, 1:38 p.m. UTC | #1
On Wed, Dec 13, 2023 at 01:49:38PM +0100, Nina Schoetterl-Glausch wrote:
> Add functions for generating pseudo random 32 and 64 bit values.
> The implementation is very simple and the randomness likely not
> of high quality.
> 
> Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
> ---
>  Makefile       |  1 +
>  lib/libcflat.h |  7 +++++++
>  lib/rand.c     | 19 +++++++++++++++++++
>  3 files changed, 27 insertions(+)
>  create mode 100644 lib/rand.c
> 
> diff --git a/Makefile b/Makefile
> index 602910dd..7997e035 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -28,6 +28,7 @@ cflatobjs := \
>  	lib/printf.o \
>  	lib/string.o \
>  	lib/abort.o \
> +	lib/rand.o \
>  	lib/report.o \
>  	lib/stack.o
>  
> diff --git a/lib/libcflat.h b/lib/libcflat.h
> index 700f4352..ed947f98 100644
> --- a/lib/libcflat.h
> +++ b/lib/libcflat.h
> @@ -83,6 +83,13 @@ extern void abort(void) __attribute__((noreturn));
>  extern long atol(const char *ptr);
>  extern char *getenv(const char *name);
>  
> +typedef struct {
> +	uint32_t val;
> +} rand_state;
> +#define RAND_STATE_INIT(x) ((rand_state){ .val = (x) })
> +uint32_t rand32(rand_state *state);
> +uint64_t rand64(rand_state *state);
> +
>  extern int printf(const char *fmt, ...)
>  					__attribute__((format(printf, 1, 2)));
>  extern int snprintf(char *buf, int size, const char *fmt, ...)
> diff --git a/lib/rand.c b/lib/rand.c
> new file mode 100644
> index 00000000..658c4cbf
> --- /dev/null
> +++ b/lib/rand.c
> @@ -0,0 +1,19 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + * pseudo random functions
> + *
> + * Copyright IBM Corp. 2023
> + */
> +
> +#include "libcflat.h"
> +
> +uint32_t rand32(rand_state *state)
> +{
> +	state->val = 0x915f77f5 * state->val + 1;
> +	return state->val ^ (state->val >> 16);
> +}
> +
> +uint64_t rand64(rand_state *state)
> +{
> +	return (uint64_t)rand32(state) << 32 | rand32(state);
> +}
> -- 
> 2.41.0
>

Alex Bennée posted a prng patch a long time ago that never got merged.

https://www.spinics.net/lists/kvm-arm/msg50921.html

would it be better to merge that?

Thanks,
drew
Nina Schoetterl-Glausch Dec. 13, 2023, 5:43 p.m. UTC | #2
On Wed, 2023-12-13 at 14:38 +0100, Andrew Jones wrote:
> On Wed, Dec 13, 2023 at 01:49:38PM +0100, Nina Schoetterl-Glausch wrote:
> > Add functions for generating pseudo random 32 and 64 bit values.
> > The implementation is very simple and the randomness likely not
> > of high quality.

[...]

> Alex Bennée posted a prng patch a long time ago that never got merged.
> 
> https://www.spinics.net/lists/kvm-arm/msg50921.html
> 
> would it be better to merge that?

Well, it's hard to say what metric to apply here.
How good does the randomness need to be?
I chose a minimal interface that should be amendable to evolution.
That's why the state is hidden behind a typedef.
I think this would be good for Alex' patch, too, and there is nothing gained
by exposing the implementation by prefixing everything with isaac.
My patch is also simpler to review.
But I'm certainly not opposed to better algorithms.
> 
> Thanks,
> drew
Andrew Jones Dec. 13, 2023, 5:53 p.m. UTC | #3
On Wed, Dec 13, 2023 at 06:43:51PM +0100, Nina Schoetterl-Glausch wrote:
> On Wed, 2023-12-13 at 14:38 +0100, Andrew Jones wrote:
> > On Wed, Dec 13, 2023 at 01:49:38PM +0100, Nina Schoetterl-Glausch wrote:
> > > Add functions for generating pseudo random 32 and 64 bit values.
> > > The implementation is very simple and the randomness likely not
> > > of high quality.
> 
> [...]
> 
> > Alex Bennée posted a prng patch a long time ago that never got merged.
> > 
> > https://www.spinics.net/lists/kvm-arm/msg50921.html
> > 
> > would it be better to merge that?
> 
> Well, it's hard to say what metric to apply here.
> How good does the randomness need to be?

Better randomness would improve coverage for random sample set type tests
and possibly help stress more for stress tests.

> I chose a minimal interface that should be amendable to evolution.
> That's why the state is hidden behind a typedef.
> I think this would be good for Alex' patch, too, and there is nothing gained
> by exposing the implementation by prefixing everything with isaac.

I agree.

> My patch is also simpler to review.
> But I'm certainly not opposed to better algorithms.

Do you mind reposting Alex's patch, maintaining his authorship, but with
your interface changes?

Thanks,
drew
diff mbox series

Patch

diff --git a/Makefile b/Makefile
index 602910dd..7997e035 100644
--- a/Makefile
+++ b/Makefile
@@ -28,6 +28,7 @@  cflatobjs := \
 	lib/printf.o \
 	lib/string.o \
 	lib/abort.o \
+	lib/rand.o \
 	lib/report.o \
 	lib/stack.o
 
diff --git a/lib/libcflat.h b/lib/libcflat.h
index 700f4352..ed947f98 100644
--- a/lib/libcflat.h
+++ b/lib/libcflat.h
@@ -83,6 +83,13 @@  extern void abort(void) __attribute__((noreturn));
 extern long atol(const char *ptr);
 extern char *getenv(const char *name);
 
+typedef struct {
+	uint32_t val;
+} rand_state;
+#define RAND_STATE_INIT(x) ((rand_state){ .val = (x) })
+uint32_t rand32(rand_state *state);
+uint64_t rand64(rand_state *state);
+
 extern int printf(const char *fmt, ...)
 					__attribute__((format(printf, 1, 2)));
 extern int snprintf(char *buf, int size, const char *fmt, ...)
diff --git a/lib/rand.c b/lib/rand.c
new file mode 100644
index 00000000..658c4cbf
--- /dev/null
+++ b/lib/rand.c
@@ -0,0 +1,19 @@ 
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * pseudo random functions
+ *
+ * Copyright IBM Corp. 2023
+ */
+
+#include "libcflat.h"
+
+uint32_t rand32(rand_state *state)
+{
+	state->val = 0x915f77f5 * state->val + 1;
+	return state->val ^ (state->val >> 16);
+}
+
+uint64_t rand64(rand_state *state)
+{
+	return (uint64_t)rand32(state) << 32 | rand32(state);
+}