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@xxxxxxxxxxxxxxxxxx> > Cc: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx> > Cc: David Herrmann <dh.herrmann@xxxxxxxxx> > Reviewed-by: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx> > --- > 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@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel