All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Christian König" <christian.koenig@amd.com>
To: "Thomas Hellström" <thomas.hellstrom@linux.intel.com>,
	dri-devel@lists.freedesktop.org
Cc: Dave Airlie <airlied@redhat.com>,
	Madhav Chauhan <madhav.chauhan@amd.com>,
	Huang Rui <ray.huang@amd.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	"Matthew Wilcox (Oracle)" <willy@infradead.org>,
	Miaohe Lin <linmiaohe@huawei.com>,
	David Hildenbrand <david@redhat.com>,
	Johannes Weiner <hannes@cmpxchg.org>,
	Peter Xu <peterx@redhat.com>, NeilBrown <neilb@suse.de>,
	Daniel Vetter <daniel.vetter@ffwll.ch>,
	Dave Hansen <dave.hansen@intel.com>,
	Matthew Auld <matthew.auld@intel.com>,
	linux-graphics-maintainer@vmware.com, linux-mm@kvack.org,
	intel-gfx@lists.freedesktop.org
Subject: Re: [RFC PATCH 02/16] drm/ttm/pool: Fix ttm_pool_alloc error path
Date: Wed, 15 Feb 2023 19:26:23 +0100	[thread overview]
Message-ID: <63d9b7a9-1d03-c434-df77-055969c42517@amd.com> (raw)
In-Reply-To: <85166ca49f556c9faef7a0d76cb1e826c0014ce6.camel@linux.intel.com>

Am 15.02.23 um 19:02 schrieb Thomas Hellström:
> On Wed, 2023-02-15 at 18:31 +0100, Christian König wrote:
>> Am 15.02.23 um 17:13 schrieb Thomas Hellström:
>>> When hitting an error, the error path forgot to unmap dma mappings
>>> and
>> I don't see where this happens?
>  From what I can tell, ttm_pool_page_allocated() maps the page for dma,
> If we later hit an error, ttm_pool_free_page() will leak the mapping.

Ah, I see. Good point.

>
>>> could call set_pages_wb() on already uncached pages.
>> Yeah, but what's the problem?
> Umm, at least if you try to set WC on an already WC'd page, the
> set_pages_ code will spam dmesg with warnings.
> Not sure if set_pages_wb() on WB pages does the same, nor if it
> issues unnecessary global cache / tlb flushes or whether that will
> change in the future.
> The point of avoiding the set_pages_wb() when already WB is you don't
> have to check, and you don't have to care.

Please just open code the error handling then. That helper function 
looks horrible complicated to me.

Alternatively we could have a free function for a range of pages.

Regards,
Christian.


>
> That said, the __ttm_pool_free() is used also in upcoming patches.
>
> /Thomas
>
>
>> Regards,
>> Christian.
>>
>>> Fix this by introducing a common __ttm_pool_free() function that
>>> does the right thing.
>>>
>>> Fixes: d099fc8f540a ("drm/ttm: new TT backend allocation pool v3")
>>> Cc: Christian König <christian.koenig@amd.com>
>>> Cc: Dave Airlie <airlied@redhat.com>
>>> Cc: Madhav Chauhan <madhav.chauhan@amd.com>
>>> Cc: Christian Koenig <christian.koenig@amd.com>
>>> Cc: Huang Rui <ray.huang@amd.com>
>>> Cc: dri-devel@lists.freedesktop.org
>>> Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
>>> ---
>>>    drivers/gpu/drm/ttm/ttm_pool.c | 74 +++++++++++++++++++++--------
>>> -----
>>>    1 file changed, 45 insertions(+), 29 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/ttm/ttm_pool.c
>>> b/drivers/gpu/drm/ttm/ttm_pool.c
>>> index aa116a7bbae3..1cc7591a9542 100644
>>> --- a/drivers/gpu/drm/ttm/ttm_pool.c
>>> +++ b/drivers/gpu/drm/ttm/ttm_pool.c
>>> @@ -367,6 +367,39 @@ static int ttm_pool_page_allocated(struct
>>> ttm_pool *pool, unsigned int order,
>>>          return 0;
>>>    }
>>>    
>>> +static void __ttm_pool_free(struct ttm_pool *pool, struct ttm_tt
>>> *tt,
>>> +                           struct page **caching_divide,
>>> +                           enum ttm_caching initial_caching,
>>> +                           enum ttm_caching subseq_caching,
>>> +                           pgoff_t num_pages)
>>> +{
>>> +       enum ttm_caching caching = subseq_caching;
>>> +       struct page **pages = tt->pages;
>>> +       unsigned int order;
>>> +       pgoff_t i, nr;
>>> +
>>> +       if (pool && caching_divide)
>>> +               caching = initial_caching;
>>> +
>>> +       for (i = 0; i < num_pages; i += nr, pages += nr) {
>>> +               struct ttm_pool_type *pt = NULL;
>>> +
>>> +               if (unlikely(caching_divide == pages))
>>> +                       caching = subseq_caching;
>>> +
>>> +               order = ttm_pool_page_order(pool, *pages);
>>> +               nr = (1UL << order);
>>> +               if (tt->dma_address)
>>> +                       ttm_pool_unmap(pool, tt->dma_address[i],
>>> nr);
>>> +
>>> +               pt = ttm_pool_select_type(pool, caching, order);
>>> +               if (pt)
>>> +                       ttm_pool_type_give(pt, *pages);
>>> +               else
>>> +                       ttm_pool_free_page(pool, caching, order,
>>> *pages);
>>> +       }
>>> +}
>>> +
>>>    /**
>>>     * ttm_pool_alloc - Fill a ttm_tt object
>>>     *
>>> @@ -386,8 +419,9 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>> struct ttm_tt *tt,
>>>          dma_addr_t *dma_addr = tt->dma_address;
>>>          struct page **caching = tt->pages;
>>>          struct page **pages = tt->pages;
>>> +       enum ttm_caching page_caching;
>>>          gfp_t gfp_flags = GFP_USER;
>>> -       unsigned int i, order;
>>> +       unsigned int order;
>>>          struct page *p;
>>>          int r;
>>>    
>>> @@ -410,6 +444,7 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>> struct ttm_tt *tt,
>>>               order = min_t(unsigned int, order, __fls(num_pages)))
>>> {
>>>                  struct ttm_pool_type *pt;
>>>    
>>> +               page_caching = tt->caching;
>>>                  pt = ttm_pool_select_type(pool, tt->caching,
>>> order);
>>>                  p = pt ? ttm_pool_type_take(pt) : NULL;
>>>                  if (p) {
>>> @@ -418,6 +453,7 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>> struct ttm_tt *tt,
>>>                          if (r)
>>>                                  goto error_free_page;
>>>    
>>> +                       caching = pages;
>>>                          do {
>>>                                  r = ttm_pool_page_allocated(pool,
>>> order, p,
>>>                                                             
>>> &dma_addr,
>>> @@ -426,14 +462,15 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>> struct ttm_tt *tt,
>>>                                  if (r)
>>>                                          goto error_free_page;
>>>    
>>> +                               caching = pages;
>>>                                  if (num_pages < (1 << order))
>>>                                          break;
>>>    
>>>                                  p = ttm_pool_type_take(pt);
>>>                          } while (p);
>>> -                       caching = pages;
>>>                  }
>>>    
>>> +               page_caching = ttm_cached;
>>>                  while (num_pages >= (1 << order) &&
>>>                         (p = ttm_pool_alloc_page(pool, gfp_flags,
>>> order))) {
>>>    
>>> @@ -442,6 +479,7 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>> struct ttm_tt *tt,
>>>                                                             tt-
>>>> caching);
>>>                                  if (r)
>>>                                          goto error_free_page;
>>> +                               caching = pages;
>>>                          }
>>>                          r = ttm_pool_page_allocated(pool, order, p,
>>> &dma_addr,
>>>                                                      &num_pages,
>>> &pages);
>>> @@ -468,15 +506,12 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>> struct ttm_tt *tt,
>>>          return 0;
>>>    
>>>    error_free_page:
>>> -       ttm_pool_free_page(pool, tt->caching, order, p);
>>> +       ttm_pool_free_page(pool, page_caching, order, p);
>>>    
>>>    error_free_all:
>>>          num_pages = tt->num_pages - num_pages;
>>> -       for (i = 0; i < num_pages; ) {
>>> -               order = ttm_pool_page_order(pool, tt->pages[i]);
>>> -               ttm_pool_free_page(pool, tt->caching, order, tt-
>>>> pages[i]);
>>> -               i += 1 << order;
>>> -       }
>>> +       __ttm_pool_free(pool, tt, caching, tt->caching, ttm_cached,
>>> +                       num_pages);
>>>    
>>>          return r;
>>>    }
>>> @@ -492,27 +527,8 @@ EXPORT_SYMBOL(ttm_pool_alloc);
>>>     */
>>>    void ttm_pool_free(struct ttm_pool *pool, struct ttm_tt *tt)
>>>    {
>>> -       unsigned int i;
>>> -
>>> -       for (i = 0; i < tt->num_pages; ) {
>>> -               struct page *p = tt->pages[i];
>>> -               unsigned int order, num_pages;
>>> -               struct ttm_pool_type *pt;
>>> -
>>> -               order = ttm_pool_page_order(pool, p);
>>> -               num_pages = 1ULL << order;
>>> -               if (tt->dma_address)
>>> -                       ttm_pool_unmap(pool, tt->dma_address[i],
>>> num_pages);
>>> -
>>> -               pt = ttm_pool_select_type(pool, tt->caching,
>>> order);
>>> -               if (pt)
>>> -                       ttm_pool_type_give(pt, tt->pages[i]);
>>> -               else
>>> -                       ttm_pool_free_page(pool, tt->caching,
>>> order,
>>> -                                          tt->pages[i]);
>>> -
>>> -               i += num_pages;
>>> -       }
>>> +       __ttm_pool_free(pool, tt, NULL, tt->caching, tt->caching,
>>> +                       tt->num_pages);
>>>    
>>>          while (atomic_long_read(&allocated_pages) > page_pool_size)
>>>                  ttm_pool_shrink();



WARNING: multiple messages have this Message-ID (diff)
From: "Christian König" <christian.koenig@amd.com>
To: "Thomas Hellström" <thomas.hellstrom@linux.intel.com>,
	dri-devel@lists.freedesktop.org
Cc: Miaohe Lin <linmiaohe@huawei.com>,
	David Hildenbrand <david@redhat.com>, NeilBrown <neilb@suse.de>,
	Daniel Vetter <daniel.vetter@ffwll.ch>,
	intel-gfx@lists.freedesktop.org,
	"Matthew Wilcox \(Oracle\)" <willy@infradead.org>,
	linux-mm@kvack.org, Dave Hansen <dave.hansen@intel.com>,
	Huang Rui <ray.huang@amd.com>,
	linux-graphics-maintainer@vmware.com,
	Peter Xu <peterx@redhat.com>,
	Johannes Weiner <hannes@cmpxchg.org>,
	Madhav Chauhan <madhav.chauhan@amd.com>,
	Dave Airlie <airlied@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Matthew Auld <matthew.auld@intel.com>
Subject: Re: [RFC PATCH 02/16] drm/ttm/pool: Fix ttm_pool_alloc error path
Date: Wed, 15 Feb 2023 19:26:23 +0100	[thread overview]
Message-ID: <63d9b7a9-1d03-c434-df77-055969c42517@amd.com> (raw)
In-Reply-To: <85166ca49f556c9faef7a0d76cb1e826c0014ce6.camel@linux.intel.com>

Am 15.02.23 um 19:02 schrieb Thomas Hellström:
> On Wed, 2023-02-15 at 18:31 +0100, Christian König wrote:
>> Am 15.02.23 um 17:13 schrieb Thomas Hellström:
>>> When hitting an error, the error path forgot to unmap dma mappings
>>> and
>> I don't see where this happens?
>  From what I can tell, ttm_pool_page_allocated() maps the page for dma,
> If we later hit an error, ttm_pool_free_page() will leak the mapping.

Ah, I see. Good point.

>
>>> could call set_pages_wb() on already uncached pages.
>> Yeah, but what's the problem?
> Umm, at least if you try to set WC on an already WC'd page, the
> set_pages_ code will spam dmesg with warnings.
> Not sure if set_pages_wb() on WB pages does the same, nor if it
> issues unnecessary global cache / tlb flushes or whether that will
> change in the future.
> The point of avoiding the set_pages_wb() when already WB is you don't
> have to check, and you don't have to care.

Please just open code the error handling then. That helper function 
looks horrible complicated to me.

Alternatively we could have a free function for a range of pages.

Regards,
Christian.


>
> That said, the __ttm_pool_free() is used also in upcoming patches.
>
> /Thomas
>
>
>> Regards,
>> Christian.
>>
>>> Fix this by introducing a common __ttm_pool_free() function that
>>> does the right thing.
>>>
>>> Fixes: d099fc8f540a ("drm/ttm: new TT backend allocation pool v3")
>>> Cc: Christian König <christian.koenig@amd.com>
>>> Cc: Dave Airlie <airlied@redhat.com>
>>> Cc: Madhav Chauhan <madhav.chauhan@amd.com>
>>> Cc: Christian Koenig <christian.koenig@amd.com>
>>> Cc: Huang Rui <ray.huang@amd.com>
>>> Cc: dri-devel@lists.freedesktop.org
>>> Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
>>> ---
>>>    drivers/gpu/drm/ttm/ttm_pool.c | 74 +++++++++++++++++++++--------
>>> -----
>>>    1 file changed, 45 insertions(+), 29 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/ttm/ttm_pool.c
>>> b/drivers/gpu/drm/ttm/ttm_pool.c
>>> index aa116a7bbae3..1cc7591a9542 100644
>>> --- a/drivers/gpu/drm/ttm/ttm_pool.c
>>> +++ b/drivers/gpu/drm/ttm/ttm_pool.c
>>> @@ -367,6 +367,39 @@ static int ttm_pool_page_allocated(struct
>>> ttm_pool *pool, unsigned int order,
>>>          return 0;
>>>    }
>>>    
>>> +static void __ttm_pool_free(struct ttm_pool *pool, struct ttm_tt
>>> *tt,
>>> +                           struct page **caching_divide,
>>> +                           enum ttm_caching initial_caching,
>>> +                           enum ttm_caching subseq_caching,
>>> +                           pgoff_t num_pages)
>>> +{
>>> +       enum ttm_caching caching = subseq_caching;
>>> +       struct page **pages = tt->pages;
>>> +       unsigned int order;
>>> +       pgoff_t i, nr;
>>> +
>>> +       if (pool && caching_divide)
>>> +               caching = initial_caching;
>>> +
>>> +       for (i = 0; i < num_pages; i += nr, pages += nr) {
>>> +               struct ttm_pool_type *pt = NULL;
>>> +
>>> +               if (unlikely(caching_divide == pages))
>>> +                       caching = subseq_caching;
>>> +
>>> +               order = ttm_pool_page_order(pool, *pages);
>>> +               nr = (1UL << order);
>>> +               if (tt->dma_address)
>>> +                       ttm_pool_unmap(pool, tt->dma_address[i],
>>> nr);
>>> +
>>> +               pt = ttm_pool_select_type(pool, caching, order);
>>> +               if (pt)
>>> +                       ttm_pool_type_give(pt, *pages);
>>> +               else
>>> +                       ttm_pool_free_page(pool, caching, order,
>>> *pages);
>>> +       }
>>> +}
>>> +
>>>    /**
>>>     * ttm_pool_alloc - Fill a ttm_tt object
>>>     *
>>> @@ -386,8 +419,9 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>> struct ttm_tt *tt,
>>>          dma_addr_t *dma_addr = tt->dma_address;
>>>          struct page **caching = tt->pages;
>>>          struct page **pages = tt->pages;
>>> +       enum ttm_caching page_caching;
>>>          gfp_t gfp_flags = GFP_USER;
>>> -       unsigned int i, order;
>>> +       unsigned int order;
>>>          struct page *p;
>>>          int r;
>>>    
>>> @@ -410,6 +444,7 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>> struct ttm_tt *tt,
>>>               order = min_t(unsigned int, order, __fls(num_pages)))
>>> {
>>>                  struct ttm_pool_type *pt;
>>>    
>>> +               page_caching = tt->caching;
>>>                  pt = ttm_pool_select_type(pool, tt->caching,
>>> order);
>>>                  p = pt ? ttm_pool_type_take(pt) : NULL;
>>>                  if (p) {
>>> @@ -418,6 +453,7 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>> struct ttm_tt *tt,
>>>                          if (r)
>>>                                  goto error_free_page;
>>>    
>>> +                       caching = pages;
>>>                          do {
>>>                                  r = ttm_pool_page_allocated(pool,
>>> order, p,
>>>                                                             
>>> &dma_addr,
>>> @@ -426,14 +462,15 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>> struct ttm_tt *tt,
>>>                                  if (r)
>>>                                          goto error_free_page;
>>>    
>>> +                               caching = pages;
>>>                                  if (num_pages < (1 << order))
>>>                                          break;
>>>    
>>>                                  p = ttm_pool_type_take(pt);
>>>                          } while (p);
>>> -                       caching = pages;
>>>                  }
>>>    
>>> +               page_caching = ttm_cached;
>>>                  while (num_pages >= (1 << order) &&
>>>                         (p = ttm_pool_alloc_page(pool, gfp_flags,
>>> order))) {
>>>    
>>> @@ -442,6 +479,7 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>> struct ttm_tt *tt,
>>>                                                             tt-
>>>> caching);
>>>                                  if (r)
>>>                                          goto error_free_page;
>>> +                               caching = pages;
>>>                          }
>>>                          r = ttm_pool_page_allocated(pool, order, p,
>>> &dma_addr,
>>>                                                      &num_pages,
>>> &pages);
>>> @@ -468,15 +506,12 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>> struct ttm_tt *tt,
>>>          return 0;
>>>    
>>>    error_free_page:
>>> -       ttm_pool_free_page(pool, tt->caching, order, p);
>>> +       ttm_pool_free_page(pool, page_caching, order, p);
>>>    
>>>    error_free_all:
>>>          num_pages = tt->num_pages - num_pages;
>>> -       for (i = 0; i < num_pages; ) {
>>> -               order = ttm_pool_page_order(pool, tt->pages[i]);
>>> -               ttm_pool_free_page(pool, tt->caching, order, tt-
>>>> pages[i]);
>>> -               i += 1 << order;
>>> -       }
>>> +       __ttm_pool_free(pool, tt, caching, tt->caching, ttm_cached,
>>> +                       num_pages);
>>>    
>>>          return r;
>>>    }
>>> @@ -492,27 +527,8 @@ EXPORT_SYMBOL(ttm_pool_alloc);
>>>     */
>>>    void ttm_pool_free(struct ttm_pool *pool, struct ttm_tt *tt)
>>>    {
>>> -       unsigned int i;
>>> -
>>> -       for (i = 0; i < tt->num_pages; ) {
>>> -               struct page *p = tt->pages[i];
>>> -               unsigned int order, num_pages;
>>> -               struct ttm_pool_type *pt;
>>> -
>>> -               order = ttm_pool_page_order(pool, p);
>>> -               num_pages = 1ULL << order;
>>> -               if (tt->dma_address)
>>> -                       ttm_pool_unmap(pool, tt->dma_address[i],
>>> num_pages);
>>> -
>>> -               pt = ttm_pool_select_type(pool, tt->caching,
>>> order);
>>> -               if (pt)
>>> -                       ttm_pool_type_give(pt, tt->pages[i]);
>>> -               else
>>> -                       ttm_pool_free_page(pool, tt->caching,
>>> order,
>>> -                                          tt->pages[i]);
>>> -
>>> -               i += num_pages;
>>> -       }
>>> +       __ttm_pool_free(pool, tt, NULL, tt->caching, tt->caching,
>>> +                       tt->num_pages);
>>>    
>>>          while (atomic_long_read(&allocated_pages) > page_pool_size)
>>>                  ttm_pool_shrink();


WARNING: multiple messages have this Message-ID (diff)
From: "Christian König" <christian.koenig@amd.com>
To: "Thomas Hellström" <thomas.hellstrom@linux.intel.com>,
	dri-devel@lists.freedesktop.org
Cc: Miaohe Lin <linmiaohe@huawei.com>,
	David Hildenbrand <david@redhat.com>, NeilBrown <neilb@suse.de>,
	Daniel Vetter <daniel.vetter@ffwll.ch>,
	intel-gfx@lists.freedesktop.org,
	"Matthew Wilcox \(Oracle\)" <willy@infradead.org>,
	linux-mm@kvack.org, Dave Hansen <dave.hansen@intel.com>,
	Huang Rui <ray.huang@amd.com>,
	linux-graphics-maintainer@vmware.com,
	Peter Xu <peterx@redhat.com>,
	Johannes Weiner <hannes@cmpxchg.org>,
	Madhav Chauhan <madhav.chauhan@amd.com>,
	Dave Airlie <airlied@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Matthew Auld <matthew.auld@intel.com>
Subject: Re: [Intel-gfx] [RFC PATCH 02/16] drm/ttm/pool: Fix ttm_pool_alloc error path
Date: Wed, 15 Feb 2023 19:26:23 +0100	[thread overview]
Message-ID: <63d9b7a9-1d03-c434-df77-055969c42517@amd.com> (raw)
In-Reply-To: <85166ca49f556c9faef7a0d76cb1e826c0014ce6.camel@linux.intel.com>

Am 15.02.23 um 19:02 schrieb Thomas Hellström:
> On Wed, 2023-02-15 at 18:31 +0100, Christian König wrote:
>> Am 15.02.23 um 17:13 schrieb Thomas Hellström:
>>> When hitting an error, the error path forgot to unmap dma mappings
>>> and
>> I don't see where this happens?
>  From what I can tell, ttm_pool_page_allocated() maps the page for dma,
> If we later hit an error, ttm_pool_free_page() will leak the mapping.

Ah, I see. Good point.

>
>>> could call set_pages_wb() on already uncached pages.
>> Yeah, but what's the problem?
> Umm, at least if you try to set WC on an already WC'd page, the
> set_pages_ code will spam dmesg with warnings.
> Not sure if set_pages_wb() on WB pages does the same, nor if it
> issues unnecessary global cache / tlb flushes or whether that will
> change in the future.
> The point of avoiding the set_pages_wb() when already WB is you don't
> have to check, and you don't have to care.

Please just open code the error handling then. That helper function 
looks horrible complicated to me.

Alternatively we could have a free function for a range of pages.

Regards,
Christian.


>
> That said, the __ttm_pool_free() is used also in upcoming patches.
>
> /Thomas
>
>
>> Regards,
>> Christian.
>>
>>> Fix this by introducing a common __ttm_pool_free() function that
>>> does the right thing.
>>>
>>> Fixes: d099fc8f540a ("drm/ttm: new TT backend allocation pool v3")
>>> Cc: Christian König <christian.koenig@amd.com>
>>> Cc: Dave Airlie <airlied@redhat.com>
>>> Cc: Madhav Chauhan <madhav.chauhan@amd.com>
>>> Cc: Christian Koenig <christian.koenig@amd.com>
>>> Cc: Huang Rui <ray.huang@amd.com>
>>> Cc: dri-devel@lists.freedesktop.org
>>> Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
>>> ---
>>>    drivers/gpu/drm/ttm/ttm_pool.c | 74 +++++++++++++++++++++--------
>>> -----
>>>    1 file changed, 45 insertions(+), 29 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/ttm/ttm_pool.c
>>> b/drivers/gpu/drm/ttm/ttm_pool.c
>>> index aa116a7bbae3..1cc7591a9542 100644
>>> --- a/drivers/gpu/drm/ttm/ttm_pool.c
>>> +++ b/drivers/gpu/drm/ttm/ttm_pool.c
>>> @@ -367,6 +367,39 @@ static int ttm_pool_page_allocated(struct
>>> ttm_pool *pool, unsigned int order,
>>>          return 0;
>>>    }
>>>    
>>> +static void __ttm_pool_free(struct ttm_pool *pool, struct ttm_tt
>>> *tt,
>>> +                           struct page **caching_divide,
>>> +                           enum ttm_caching initial_caching,
>>> +                           enum ttm_caching subseq_caching,
>>> +                           pgoff_t num_pages)
>>> +{
>>> +       enum ttm_caching caching = subseq_caching;
>>> +       struct page **pages = tt->pages;
>>> +       unsigned int order;
>>> +       pgoff_t i, nr;
>>> +
>>> +       if (pool && caching_divide)
>>> +               caching = initial_caching;
>>> +
>>> +       for (i = 0; i < num_pages; i += nr, pages += nr) {
>>> +               struct ttm_pool_type *pt = NULL;
>>> +
>>> +               if (unlikely(caching_divide == pages))
>>> +                       caching = subseq_caching;
>>> +
>>> +               order = ttm_pool_page_order(pool, *pages);
>>> +               nr = (1UL << order);
>>> +               if (tt->dma_address)
>>> +                       ttm_pool_unmap(pool, tt->dma_address[i],
>>> nr);
>>> +
>>> +               pt = ttm_pool_select_type(pool, caching, order);
>>> +               if (pt)
>>> +                       ttm_pool_type_give(pt, *pages);
>>> +               else
>>> +                       ttm_pool_free_page(pool, caching, order,
>>> *pages);
>>> +       }
>>> +}
>>> +
>>>    /**
>>>     * ttm_pool_alloc - Fill a ttm_tt object
>>>     *
>>> @@ -386,8 +419,9 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>> struct ttm_tt *tt,
>>>          dma_addr_t *dma_addr = tt->dma_address;
>>>          struct page **caching = tt->pages;
>>>          struct page **pages = tt->pages;
>>> +       enum ttm_caching page_caching;
>>>          gfp_t gfp_flags = GFP_USER;
>>> -       unsigned int i, order;
>>> +       unsigned int order;
>>>          struct page *p;
>>>          int r;
>>>    
>>> @@ -410,6 +444,7 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>> struct ttm_tt *tt,
>>>               order = min_t(unsigned int, order, __fls(num_pages)))
>>> {
>>>                  struct ttm_pool_type *pt;
>>>    
>>> +               page_caching = tt->caching;
>>>                  pt = ttm_pool_select_type(pool, tt->caching,
>>> order);
>>>                  p = pt ? ttm_pool_type_take(pt) : NULL;
>>>                  if (p) {
>>> @@ -418,6 +453,7 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>> struct ttm_tt *tt,
>>>                          if (r)
>>>                                  goto error_free_page;
>>>    
>>> +                       caching = pages;
>>>                          do {
>>>                                  r = ttm_pool_page_allocated(pool,
>>> order, p,
>>>                                                             
>>> &dma_addr,
>>> @@ -426,14 +462,15 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>> struct ttm_tt *tt,
>>>                                  if (r)
>>>                                          goto error_free_page;
>>>    
>>> +                               caching = pages;
>>>                                  if (num_pages < (1 << order))
>>>                                          break;
>>>    
>>>                                  p = ttm_pool_type_take(pt);
>>>                          } while (p);
>>> -                       caching = pages;
>>>                  }
>>>    
>>> +               page_caching = ttm_cached;
>>>                  while (num_pages >= (1 << order) &&
>>>                         (p = ttm_pool_alloc_page(pool, gfp_flags,
>>> order))) {
>>>    
>>> @@ -442,6 +479,7 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>> struct ttm_tt *tt,
>>>                                                             tt-
>>>> caching);
>>>                                  if (r)
>>>                                          goto error_free_page;
>>> +                               caching = pages;
>>>                          }
>>>                          r = ttm_pool_page_allocated(pool, order, p,
>>> &dma_addr,
>>>                                                      &num_pages,
>>> &pages);
>>> @@ -468,15 +506,12 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>> struct ttm_tt *tt,
>>>          return 0;
>>>    
>>>    error_free_page:
>>> -       ttm_pool_free_page(pool, tt->caching, order, p);
>>> +       ttm_pool_free_page(pool, page_caching, order, p);
>>>    
>>>    error_free_all:
>>>          num_pages = tt->num_pages - num_pages;
>>> -       for (i = 0; i < num_pages; ) {
>>> -               order = ttm_pool_page_order(pool, tt->pages[i]);
>>> -               ttm_pool_free_page(pool, tt->caching, order, tt-
>>>> pages[i]);
>>> -               i += 1 << order;
>>> -       }
>>> +       __ttm_pool_free(pool, tt, caching, tt->caching, ttm_cached,
>>> +                       num_pages);
>>>    
>>>          return r;
>>>    }
>>> @@ -492,27 +527,8 @@ EXPORT_SYMBOL(ttm_pool_alloc);
>>>     */
>>>    void ttm_pool_free(struct ttm_pool *pool, struct ttm_tt *tt)
>>>    {
>>> -       unsigned int i;
>>> -
>>> -       for (i = 0; i < tt->num_pages; ) {
>>> -               struct page *p = tt->pages[i];
>>> -               unsigned int order, num_pages;
>>> -               struct ttm_pool_type *pt;
>>> -
>>> -               order = ttm_pool_page_order(pool, p);
>>> -               num_pages = 1ULL << order;
>>> -               if (tt->dma_address)
>>> -                       ttm_pool_unmap(pool, tt->dma_address[i],
>>> num_pages);
>>> -
>>> -               pt = ttm_pool_select_type(pool, tt->caching,
>>> order);
>>> -               if (pt)
>>> -                       ttm_pool_type_give(pt, tt->pages[i]);
>>> -               else
>>> -                       ttm_pool_free_page(pool, tt->caching,
>>> order,
>>> -                                          tt->pages[i]);
>>> -
>>> -               i += num_pages;
>>> -       }
>>> +       __ttm_pool_free(pool, tt, NULL, tt->caching, tt->caching,
>>> +                       tt->num_pages);
>>>    
>>>          while (atomic_long_read(&allocated_pages) > page_pool_size)
>>>                  ttm_pool_shrink();


  reply	other threads:[~2023-02-15 18:26 UTC|newest]

Thread overview: 104+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-15 16:13 [RFC PATCH 00/16] Add a TTM shrinker Thomas Hellström
2023-02-15 16:13 ` [Intel-gfx] " Thomas Hellström
2023-02-15 16:13 ` Thomas Hellström
2023-02-15 16:13 ` [RFC PATCH 01/16] drm/ttm: Fix a NULL pointer dereference Thomas Hellström
2023-02-15 16:13   ` [Intel-gfx] " Thomas Hellström
2023-02-15 16:13   ` Thomas Hellström
2023-02-15 17:25   ` Christian König
2023-02-15 17:25     ` [Intel-gfx] " Christian König
2023-02-15 17:25     ` Christian König
2023-02-15 16:13 ` [RFC PATCH 02/16] drm/ttm/pool: Fix ttm_pool_alloc error path Thomas Hellström
2023-02-15 16:13   ` [Intel-gfx] " Thomas Hellström
2023-02-15 16:13   ` Thomas Hellström
2023-02-15 17:31   ` Christian König
2023-02-15 17:31     ` [Intel-gfx] " Christian König
2023-02-15 17:31     ` Christian König
2023-02-15 18:02     ` Thomas Hellström
2023-02-15 18:02       ` [Intel-gfx] " Thomas Hellström
2023-02-15 18:02       ` Thomas Hellström
2023-02-15 18:26       ` Christian König [this message]
2023-02-15 18:26         ` [Intel-gfx] " Christian König
2023-02-15 18:26         ` Christian König
2023-02-15 18:51         ` Thomas Hellström
2023-02-15 18:51           ` [Intel-gfx] " Thomas Hellström
2023-02-15 18:51           ` Thomas Hellström
2023-02-15 16:13 ` [RFC PATCH 03/16] drm/ttm: Use the BIT macro for the TTM_TT_FLAGs Thomas Hellström
2023-02-15 16:13   ` [Intel-gfx] " Thomas Hellström
2023-02-15 16:13   ` Thomas Hellström
2023-02-15 17:33   ` Christian König
2023-02-15 17:33     ` [Intel-gfx] " Christian König
2023-02-15 17:33     ` Christian König
2023-02-15 16:13 ` [RFC PATCH 04/16] drm/ttm, drm/vmwgfx: Update the TTM swapout interface Thomas Hellström
2023-02-15 16:13   ` [Intel-gfx] " Thomas Hellström
2023-02-15 16:13   ` Thomas Hellström
2023-02-15 17:39   ` Christian König
2023-02-15 17:39     ` [Intel-gfx] " Christian König
2023-02-15 17:39     ` Christian König
2023-02-15 18:19     ` Thomas Hellström
2023-02-15 18:19       ` [Intel-gfx] " Thomas Hellström
2023-02-15 18:19       ` Thomas Hellström
2023-02-15 18:32       ` Christian König
2023-02-15 18:32         ` [Intel-gfx] " Christian König
2023-02-15 18:32         ` Christian König
2023-02-15 16:13 ` [RFC PATCH 05/16] drm/ttm: Unexport ttm_global_swapout() Thomas Hellström
2023-02-15 16:13   ` [Intel-gfx] " Thomas Hellström
2023-02-15 16:13   ` Thomas Hellström
2023-02-15 16:13 ` [RFC PATCH 06/16] drm/ttm: Don't use watermark accounting on shrinkable pools Thomas Hellström
2023-02-15 16:13   ` [Intel-gfx] " Thomas Hellström
2023-02-15 16:13   ` Thomas Hellström
2023-02-15 16:13 ` [RFC PATCH 07/16] drm/ttm: Reduce the number of used allocation orders for TTM pages Thomas Hellström
2023-02-15 16:13   ` [Intel-gfx] " Thomas Hellström
2023-02-15 16:13   ` Thomas Hellström
2023-02-15 17:42   ` Christian König
2023-02-15 17:42     ` [Intel-gfx] " Christian König
2023-02-15 17:42     ` Christian König
2023-02-15 18:12     ` Thomas Hellström
2023-02-15 18:12       ` [Intel-gfx] " Thomas Hellström
2023-02-15 18:12       ` Thomas Hellström
2023-02-15 18:30       ` Christian König
2023-02-15 18:30         ` [Intel-gfx] " Christian König
2023-02-15 18:30         ` Christian König
2023-02-15 19:00         ` Thomas Hellström
2023-02-15 19:00           ` [Intel-gfx] " Thomas Hellström
2023-02-15 19:00           ` Thomas Hellström
2023-02-16  7:11           ` Christian König
2023-02-16  7:11             ` [Intel-gfx] " Christian König
2023-02-16  7:11             ` Christian König
2023-02-16  7:24             ` Thomas Hellström
2023-02-16  7:24               ` [Intel-gfx] " Thomas Hellström
2023-02-16  7:24               ` Thomas Hellström
2023-02-15 18:15   ` kernel test robot
2023-02-15 20:07   ` kernel test robot
2023-02-15 16:13 ` [Intel-gfx] [RFC PATCH 08/16] drm/ttm: Add a shrinker and shrinker accounting Thomas Hellström
2023-02-15 16:13   ` Thomas Hellström
2023-02-15 16:13   ` Thomas Hellström
2023-02-15 16:13 ` [RFC PATCH 09/16] drm/ttm: Introduce shrink throttling Thomas Hellström
2023-02-15 16:13   ` [Intel-gfx] " Thomas Hellström
2023-02-15 16:13   ` Thomas Hellström
2023-02-15 16:13 ` [RFC PATCH 10/16] drm/ttm: Remove pinned bos from shrinkable accounting Thomas Hellström
2023-02-15 16:13   ` [Intel-gfx] " Thomas Hellström
2023-02-15 16:13   ` Thomas Hellström
2023-02-15 16:14 ` [RFC PATCH 11/16] drm/ttm: Add a simple api to set / clear purgeable ttm_tt content Thomas Hellström
2023-02-15 16:14   ` [Intel-gfx] " Thomas Hellström
2023-02-15 16:14   ` Thomas Hellström
2023-02-15 16:14 ` [RFC PATCH 12/16] mm: Add interfaces to back up and recover folio contents using swap Thomas Hellström
2023-02-15 16:14   ` [Intel-gfx] " Thomas Hellström
2023-02-15 16:14   ` Thomas Hellström
2023-02-15 16:14 ` [RFC PATCH 13/16] drm/ttm: Make the call to ttm_tt_populate() interruptible when faulting Thomas Hellström
2023-02-15 16:14   ` [Intel-gfx] " Thomas Hellström
2023-02-15 16:14   ` Thomas Hellström
2023-02-15 16:14 ` [RFC PATCH 14/16] drm/ttm: Provide helpers for shrinking Thomas Hellström
2023-02-15 16:14   ` [Intel-gfx] " Thomas Hellström
2023-02-15 16:14   ` Thomas Hellström
2023-02-15 22:00   ` [Intel-gfx] " kernel test robot
2023-02-16  5:41   ` kernel test robot
2023-02-16 16:23   ` kernel test robot
2023-02-15 16:14 ` [RFC PATCH 15/16] drm/ttm: Use fault-injection to test error paths Thomas Hellström
2023-02-15 16:14   ` [Intel-gfx] " Thomas Hellström
2023-02-15 16:14   ` Thomas Hellström
2023-02-15 16:14 ` [RFC PATCH 16/16] drm/i915, drm/ttm: Use the TTM shrinker rather than the external shmem pool Thomas Hellström
2023-02-15 16:14   ` [Intel-gfx] " Thomas Hellström
2023-02-15 16:14   ` Thomas Hellström
2023-02-15 19:31 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for Add a TTM shrinker Patchwork
2023-02-15 19:58 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2023-02-16 15:34 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=63d9b7a9-1d03-c434-df77-055969c42517@amd.com \
    --to=christian.koenig@amd.com \
    --cc=airlied@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=daniel.vetter@ffwll.ch \
    --cc=dave.hansen@intel.com \
    --cc=david@redhat.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=hannes@cmpxchg.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=linmiaohe@huawei.com \
    --cc=linux-graphics-maintainer@vmware.com \
    --cc=linux-mm@kvack.org \
    --cc=madhav.chauhan@amd.com \
    --cc=matthew.auld@intel.com \
    --cc=neilb@suse.de \
    --cc=peterx@redhat.com \
    --cc=ray.huang@amd.com \
    --cc=thomas.hellstrom@linux.intel.com \
    --cc=willy@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.