Quoting Matthew Auld (2020-10-21 10:49:57) > We are incorrectly limiting the max allocation size as per the mm > max_order, which is effectively the largest power-of-two that we can fit > in the region size. However, it's normal to setup the region or > allocator with a non-power-of-two size(for example 3G), which we should > already handle correctly, except it seems for the early too-big-check. > > Fixes: b908be543e44 ("drm/i915: support creating LMEM objects") > Signed-off-by: Matthew Auld <matthew.auld@xxxxxxxxx> > Cc: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > Cc: CQ Tang <cq.tang@xxxxxxxxx> > --- > drivers/gpu/drm/i915/intel_memory_region.c | 2 +- > .../drm/i915/selftests/intel_memory_region.c | 50 +++++++++++++++++++ > drivers/gpu/drm/i915/selftests/mock_region.c | 2 +- > 3 files changed, 52 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_memory_region.c b/drivers/gpu/drm/i915/intel_memory_region.c > index 6b5e9d88646d..180e1078ef7c 100644 > --- a/drivers/gpu/drm/i915/intel_memory_region.c > +++ b/drivers/gpu/drm/i915/intel_memory_region.c > @@ -87,7 +87,7 @@ __intel_memory_region_get_pages_buddy(struct intel_memory_region *mem, > min_order = ilog2(size) - ilog2(mem->mm.chunk_size); > } > > - if (size > BIT(mem->mm.max_order) * mem->mm.chunk_size) > + if (size > mem->mm.size) > return -E2BIG; > > n_pages = size >> ilog2(mem->mm.chunk_size); > diff --git a/drivers/gpu/drm/i915/selftests/intel_memory_region.c b/drivers/gpu/drm/i915/selftests/intel_memory_region.c > index 334b0648e253..34d6de916b3e 100644 > --- a/drivers/gpu/drm/i915/selftests/intel_memory_region.c > +++ b/drivers/gpu/drm/i915/selftests/intel_memory_region.c > @@ -261,6 +261,55 @@ static int igt_mock_contiguous(void *arg) > return err; > } > > +static int igt_mock_splintered_region(void *arg) > +{ > + struct intel_memory_region *mem = arg; > + struct drm_i915_private *i915 = mem->i915; > + struct drm_i915_gem_object *obj; > + unsigned int expected_order; > + LIST_HEAD(objects); > + u64 size; > + int err = 0; > + > + /* > + * Sanity check we can still allocate everything even if the > + * mm.max_order != mm.size. i.e our starting address space size is not a > + * power-of-two. > + */ > + > + size = (SZ_4G - 1) & PAGE_MASK; > + mem = mock_region_create(i915, 0, size, PAGE_SIZE, 0); > + if (IS_ERR(mem)) > + return PTR_ERR(mem); > + > + if (mem->mm.size != size) { > + pr_err("%s size mismatch(%llu != %llu)\n", > + __func__, mem->mm.size, size); > + err = -EINVAL; > + goto out_put; > + } > + > + expected_order = get_order(rounddown_pow_of_two(size)); > + if (mem->mm.max_order != expected_order) { > + pr_err("%s order mismatch(%u != %u)\n", > + __func__, mem->mm.max_order, expected_order); > + err = -EINVAL; > + goto out_put; > + } > + > + obj = igt_object_create(mem, &objects, size, 0); > + if (IS_ERR(obj)) { > + err = PTR_ERR(obj); > + goto out_close; > + } A second pass to see if we correctly reject an attempt to allocate a contiguous object larger than max chunk size (but still within mem_size)? +1 for splintered! -Chris _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx