[PATCH 06/34] drm: Add a simple linear congruent generator PRNG

Joonas Lahtinen joonas.lahtinen at linux.intel.com
Tue Dec 13 10:44:10 UTC 2016


On ma, 2016-12-12 at 11:53 +0000, Chris Wilson wrote:
> For testing, we want a reproducible PRNG, a plain linear congruent
> generator is suitable for our very limited selftests.
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

<SNIP>

> +++ b/drivers/gpu/drm/lib/drm_rand.c
> @@ -0,0 +1,51 @@
> +#include <linux/kernel.h>
> +#include <linux/slab.h>
> +#include <linux/types.h>
> +
> +#include "drm_rand.h"
> +
> +u32 drm_lcg_random(u32 *state)
> +{
> +	u32 s = *state;
> +
> +#define rol(x, k) (((x) << (k)) | ((x) >> (32 - (k))))
> +	s = (s ^ rol(s, 5) ^ rol(s, 24)) + 0x37798849;
> +#undef rol
> +
> +	*state = s;
> +	return s;
> +}

Do state your source for checking purposes. Code is bound to be copied
and there's no reason to have it good.

> +EXPORT_SYMBOL(drm_lcg_random);
> +
> +int *drm_random_reorder(int *order, int count, u32 *state)
> +{
> +	int n;
> +
> +	for (n = count-1; n > 1; n--) {
> +		int r = drm_lcg_random(state) % (n + 1);
> +		if (r != n) {
> +			int tmp = order[n];
> +			order[n] = order[r];
> +			order[r] = tmp;
> +		}
> +	}
> +
> +	return order;
> +}

If you have two items... So definitely add big disclaimers of not being
random, or use some more proven algorithm :)

Regards, Joonas
-- 
Joonas Lahtinen
Open Source Technology Center
Intel Corporation


More information about the dri-devel mailing list