On Thu, Dec 22, 2016 at 08:36:08AM +0000, Chris Wilson wrote:
When testing, we want a random but yet reproducible order in which to process elements. Here we create an array which is a random (using the Tausworthe PRNG) permutation of the order in which to execute.
Note these are simple helpers intended to be merged upstream in lib/
Is that happening? I mean including some kernel-doc and all that fun? -Daniel
v2: Tidier code by David Herrmann v3: Add reminder that this code is intended to be temporary, with at least the bulk of the prandom changes going to lib/
Signed-off-by: Chris Wilson chris@chris-wilson.co.uk Cc: Joonas Lahtinen joonas.lahtinen@linux.intel.com Cc: David Herrmann dh.herrmann@gmail.com Reviewed-by: Joonas Lahtinen joonas.lahtinen@linux.intel.com
drivers/gpu/drm/Kconfig | 4 ++++ drivers/gpu/drm/Makefile | 1 + drivers/gpu/drm/lib/drm_random.c | 41 ++++++++++++++++++++++++++++++++++++++++ drivers/gpu/drm/lib/drm_random.h | 25 ++++++++++++++++++++++++ 4 files changed, 71 insertions(+) create mode 100644 drivers/gpu/drm/lib/drm_random.c create mode 100644 drivers/gpu/drm/lib/drm_random.h
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig index ebfe8404c25f..45a1c7468e88 100644 --- a/drivers/gpu/drm/Kconfig +++ b/drivers/gpu/drm/Kconfig @@ -321,3 +321,7 @@ config DRM_SAVAGE chipset. If M is selected the module will be called savage.
endif # DRM_LEGACY
+config DRM_LIB_RANDOM
- bool
- default n
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile index b9ae4280de9d..6bb416360ae4 100644 --- a/drivers/gpu/drm/Makefile +++ b/drivers/gpu/drm/Makefile @@ -18,6 +18,7 @@ drm-y := drm_auth.o drm_bufs.o drm_cache.o \ drm_plane.o drm_color_mgmt.o drm_print.o \ drm_dumb_buffers.o drm_mode_config.o
+drm-$(CONFIG_DRM_LIB_RANDOM) += lib/drm_random.o drm-$(CONFIG_COMPAT) += drm_ioc32.o drm-$(CONFIG_DRM_GEM_CMA_HELPER) += drm_gem_cma_helper.o drm-$(CONFIG_PCI) += ati_pcigart.o diff --git a/drivers/gpu/drm/lib/drm_random.c b/drivers/gpu/drm/lib/drm_random.c new file mode 100644 index 000000000000..7b12a68c3b54 --- /dev/null +++ b/drivers/gpu/drm/lib/drm_random.c @@ -0,0 +1,41 @@ +#include <linux/bitops.h> +#include <linux/kernel.h> +#include <linux/random.h> +#include <linux/slab.h> +#include <linux/types.h>
+#include "drm_random.h"
+static inline u32 drm_prandom_u32_max_state(u32 ep_ro, struct rnd_state *state) +{
- return upper_32_bits((u64)prandom_u32_state(state) * ep_ro);
+}
+void drm_random_reorder(unsigned int *order, unsigned int count,
struct rnd_state *state)
+{
- unsigned int i, j;
- for (i = 0; i < count; ++i) {
BUILD_BUG_ON(sizeof(unsigned int) > sizeof(u32));
j = drm_prandom_u32_max_state(count, state);
swap(order[i], order[j]);
- }
+} +EXPORT_SYMBOL(drm_random_reorder);
+unsigned int *drm_random_order(unsigned int count, struct rnd_state *state) +{
- unsigned int *order, i;
- order = kmalloc_array(count, sizeof(*order), GFP_TEMPORARY);
- if (!order)
return order;
- for (i = 0; i < count; i++)
order[i] = i;
- drm_random_reorder(order, count, state);
- return order;
+} +EXPORT_SYMBOL(drm_random_order); diff --git a/drivers/gpu/drm/lib/drm_random.h b/drivers/gpu/drm/lib/drm_random.h new file mode 100644 index 000000000000..a78644bea7f9 --- /dev/null +++ b/drivers/gpu/drm/lib/drm_random.h @@ -0,0 +1,25 @@ +#ifndef __DRM_RANDOM_H__ +#define __DRM_RANDOM_H__
+/* This is a temporary home for a couple of utility functions that should
- be transposed to lib/ at the earliest convenience.
- */
+#include <linux/random.h>
+#define DRM_RND_STATE_INITIALIZER(seed__) ({ \
- struct rnd_state state__; \
- prandom_seed_state(&state__, (seed__)); \
- state__; \
+})
+#define DRM_RND_STATE(name__, seed__) \
- struct rnd_state name__ = DRM_RND_STATE_INITIALIZER(seed__)
+unsigned int *drm_random_order(unsigned int count,
struct rnd_state *state);
+void drm_random_reorder(unsigned int *order,
unsigned int count,
struct rnd_state *state);
+#endif /* !__DRM_RANDOM_H__ */
2.11.0
dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel