[Intel-gfx] [PATCH 04/22] drm/i915/region: support continuous allocations

Chris Wilson chris at chris-wilson.co.uk
Fri Sep 27 18:35:42 UTC 2019


Quoting Matthew Auld (2019-09-27 18:33:51)
>  struct drm_i915_gem_object *
> diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
> index 4e1805aaeb99..f9fbf2865782 100644
> --- a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
> +++ b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
> @@ -471,7 +471,8 @@ static int igt_mock_memory_region_huge_pages(void *arg)
>                 unsigned int page_size = BIT(bit);
>                 resource_size_t phys;
>  
> -               obj = i915_gem_object_create_region(mem, page_size, 0);
> +               obj = i915_gem_object_create_region(mem, page_size,
> +                                                   I915_BO_ALLOC_CONTIGUOUS);

Seems a good opportunity to test both?

>                 if (IS_ERR(obj)) {
>                         err = PTR_ERR(obj);
>                         goto out_destroy_device;
> diff --git a/drivers/gpu/drm/i915/intel_memory_region.c b/drivers/gpu/drm/i915/intel_memory_region.c
> index e48d5c37c4df..7a66872d9eac 100644
> --- a/drivers/gpu/drm/i915/intel_memory_region.c
> +++ b/drivers/gpu/drm/i915/intel_memory_region.c
> @@ -47,8 +47,8 @@ __intel_memory_region_get_pages_buddy(struct intel_memory_region *mem,
>                                       unsigned int flags,
>                                       struct list_head *blocks)
>  {
> -       unsigned long n_pages = size >> ilog2(mem->mm.chunk_size);
>         unsigned int min_order = 0;
> +       unsigned long n_pages;
>  
>         GEM_BUG_ON(!IS_ALIGNED(size, mem->mm.chunk_size));
>         GEM_BUG_ON(!list_empty(blocks));
> @@ -58,6 +58,13 @@ __intel_memory_region_get_pages_buddy(struct intel_memory_region *mem,
>                             ilog2(mem->mm.chunk_size);
>         }
>  
> +       if (flags & I915_ALLOC_CONTIGUOUS) {
> +               size = roundup_pow_of_two(size);
> +               min_order = ilog2(size) - ilog2(mem->mm.chunk_size);
> +       }
> +
> +       n_pages = size >> ilog2(mem->mm.chunk_size);
> +
>         mutex_lock(&mem->mm_lock);
>  
>         do {
> @@ -104,7 +111,9 @@ __intel_memory_region_get_block_buddy(struct intel_memory_region *mem,
>         int ret;
>  
>         INIT_LIST_HEAD(&blocks);
> -       ret = __intel_memory_region_get_pages_buddy(mem, size, 0, &blocks);
> +       ret = __intel_memory_region_get_pages_buddy(mem, size,
> +                                                   I915_ALLOC_CONTIGUOUS,
> +                                                   &blocks);

This chunk looks odd. Quick explanation why we don't pass flags here?

>         if (ret)
>                 return ERR_PTR(ret);


More information about the Intel-gfx mailing list