[Intel-gfx] [PATCH 06/46] drm/i915: Add some selftests for sg_table manipulation

Chris Wilson chris at chris-wilson.co.uk
Fri Feb 10 10:43:22 UTC 2017


On Fri, Feb 10, 2017 at 10:24:41AM +0000, Tvrtko Ursulin wrote:
> >+static int igt_sg_alloc(void *ignored)
> >+{
> >+	IGT_TIMEOUT(end_time);
> >+	const unsigned long max_order = 20; /* approximating a 4GiB object */
> >+	struct rnd_state prng;
> >+	unsigned long prime;
> >+
> >+	for_each_prime_number(prime, max_order) {
> >+		unsigned long size = BIT(prime);
> >+		int offset;
> >+
> >+		for (offset = -1; offset <= 1; offset++) {
> >+			unsigned long sz = size + offset;
> >+			const npages_fn_t *npages;
> >+			struct pfn_table pt;
> >+			int err;
> >+
> >+			for (npages = npages_funcs; *npages; npages++) {
> >+				prandom_seed_state(&prng,
> >+						   i915_selftest.random_seed);
> >+				if (!alloc_table(&pt, sz, sz, *npages, &prng))
> >+					return 0; /* out of memory, give up */
> 
> We need to define at least some amount of testing which must pass
> otherwise it is just too weak in my opinion.
> 
> 	return prime < TBD ? -Esomething : 0;
> 
> ?

Following our last discussion, it does a minimum of one prime [2].

static int igt_sg_alloc(void *ignored)
{
        IGT_TIMEOUT(end_time);
        const unsigned long max_order = 20; /* approximating a 4GiB object */
        struct rnd_state prng;
        unsigned long prime;
        int alloc_error = -ENOMEM;

        for_each_prime_number(prime, max_order) {
                unsigned long size = BIT(prime);
                int offset;

                for (offset = -1; offset <= 1; offset++) {
                        unsigned long sz = size + offset;
                        const npages_fn_t *npages;
                        struct pfn_table pt;
                        int err;

                        for (npages = npages_funcs; *npages; npages++) {
                                prandom_seed_state(&prng,
                                                   i915_selftest.random_seed);
                                if (!alloc_table(&pt, sz, sz, *npages, &prng))
                                        return alloc_error;

                                prandom_seed_state(&prng,
                                                   i915_selftest.random_seed);
                                err = expect_pfn_sgtable(&pt, *npages, &prng,
                                                         "sg_alloc_table",
                                                         end_time);
                                sg_free_table(&pt.st);
                                if (err)
                                        return err;
                        }
                }

                alloc_error = 0;
        }

        return 0;
}

Something like

/* Make sure we test at least one continuation before accepting oom */
if (size > MAX_SG_PER_PAGE) /* can't remember what the define is! */
	alloc_error = 0;

?

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the Intel-gfx mailing list