[PATCH] drm/ttm: Merge hugepage attr changes in ttm_dma_page_put.
Huang Rui
ray.huang at amd.com
Thu Jul 26 07:02:02 UTC 2018
On Thu, Jul 26, 2018 at 08:37:45AM +0200, Christian König wrote:
> Am 25.07.2018 um 22:29 schrieb Bas Nieuwenhuizen:
> >Every set_pages_array_wb call resulted in cross-core
> >interrupts and TLB flushes. Merge more of them for
> >less overhead.
> >
> >This reduces the time needed to free a 1.6 GiB GTT WC
> >buffer as part of Vulkan CTS from ~2 sec to < 0.25 sec.
> >(Allocation still takes more than 2 sec though)
>
> Yeah, I was already wondering when I originally implemented this if
> there isn't a better approach.
>
> This needs a bit of cleanup I think, e.g. use set_pages_wb() instead
> of set_memory_wb() and we should move the non-x86 abstraction into a
> common header for both ttm_page_alloc_dma.c and ttm_page_alloc.c.
>
Agree, at the first glance, I almost got it wrong to miss-read "#ifndef
CONFIG_X86". So it make sense to move non-x86 definition into another
header.
Thanks,
Ray
> Bas, do you want to tackle this or should just I take a look?
>
> Christian.
>
> >
> >Signed-off-by: Bas Nieuwenhuizen <basni at chromium.org>
> >---
> > drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 31 ++++++++++++++++++------
> > 1 file changed, 24 insertions(+), 7 deletions(-)
> >
> >diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
> >index 4c659405a008a..9440ba0a55116 100644
> >--- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
> >+++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
> >@@ -299,6 +299,25 @@ static int set_pages_array_uc(struct page **pages, int addrinarray)
> > #endif
> > return 0;
> > }
> >+
> >+static int ttm_set_page_range_wb(struct page *p, unsigned long numpages)
> >+{
> >+#if IS_ENABLED(CONFIG_AGP)
> >+ unsigned long i;
> >+
> >+ for (i = 0; i < numpages; i++)
> >+ unmap_page_from_agp(p + i);
> >+#endif
> >+ return 0;
> >+}
> >+
> >+#else /* for !CONFIG_X86 */
> >+
> >+static int ttm_set_page_range_wb(struct page *p, unsigned long numpages)
> >+{
> >+ return set_memory_wb((unsigned long)page_address(p), numpages);
> >+}
> >+
> > #endif /* for !CONFIG_X86 */
> > static int ttm_set_pages_caching(struct dma_pool *pool,
> >@@ -387,18 +406,16 @@ static void ttm_pool_update_free_locked(struct dma_pool *pool,
> > static void ttm_dma_page_put(struct dma_pool *pool, struct dma_page *d_page)
> > {
> > struct page *page = d_page->p;
> >- unsigned i, num_pages;
> >+ unsigned num_pages;
> > int ret;
> > /* Don't set WB on WB page pool. */
> > if (!(pool->type & IS_CACHED)) {
> > num_pages = pool->size / PAGE_SIZE;
> >- for (i = 0; i < num_pages; ++i, ++page) {
> >- ret = set_pages_array_wb(&page, 1);
> >- if (ret) {
> >- pr_err("%s: Failed to set %d pages to wb!\n",
> >- pool->dev_name, 1);
> >- }
> >+ ret = ttm_set_page_range_wb(page, num_pages);
> >+ if (ret) {
> >+ pr_err("%s: Failed to set %d pages to wb!\n",
> >+ pool->dev_name, num_pages);
> > }
> > }
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the dri-devel
mailing list