drm: Add a simple generator of random permutations
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/ 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> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: http://patchwork.freedesktop.org/patch/msgid/20161222083641.2691-6-chris@chris-wilson.co.uk
This commit is contained in:

committed by
Daniel Vetter

parent
cf4a7207b1
commit
a33d42dd03
@@ -321,3 +321,7 @@ config DRM_SAVAGE
|
|||||||
chipset. If M is selected the module will be called savage.
|
chipset. If M is selected the module will be called savage.
|
||||||
|
|
||||||
endif # DRM_LEGACY
|
endif # DRM_LEGACY
|
||||||
|
|
||||||
|
config DRM_LIB_RANDOM
|
||||||
|
bool
|
||||||
|
default n
|
||||||
|
@@ -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_plane.o drm_color_mgmt.o drm_print.o \
|
||||||
drm_dumb_buffers.o drm_mode_config.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_COMPAT) += drm_ioc32.o
|
||||||
drm-$(CONFIG_DRM_GEM_CMA_HELPER) += drm_gem_cma_helper.o
|
drm-$(CONFIG_DRM_GEM_CMA_HELPER) += drm_gem_cma_helper.o
|
||||||
drm-$(CONFIG_PCI) += ati_pcigart.o
|
drm-$(CONFIG_PCI) += ati_pcigart.o
|
||||||
|
41
drivers/gpu/drm/lib/drm_random.c
Normal file
41
drivers/gpu/drm/lib/drm_random.c
Normal file
@@ -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);
|
25
drivers/gpu/drm/lib/drm_random.h
Normal file
25
drivers/gpu/drm/lib/drm_random.h
Normal file
@@ -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__ */
|
Reference in New Issue
Block a user