Message ID | 1516349483-30717-1-git-send-email-Hongbo.He@amd.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Am 19.01.2018 um 09:11 schrieb Roger He: > when ttm_mem_global_alloc_page fails, we should call > ttm_mem_global_free_page to update memory count for > the ttm pages which already run ttm_mem_global_alloc_page > successfully > > Signed-off-by: Roger He <Hongbo.He@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> > --- > drivers/gpu/drm/ttm/ttm_page_alloc.c | 41 ++++++++++++++++++++++-------------- > 1 file changed, 25 insertions(+), 16 deletions(-) > > diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c > index 2b12c55a..9ec2021 100644 > --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c > +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c > @@ -1063,6 +1063,28 @@ void ttm_page_alloc_fini(void) > _manager = NULL; > } > > +static void > +ttm_pool_unpopulate_helper(struct ttm_tt *ttm, unsigned mem_count_update) > +{ > + unsigned i; > + > + if (mem_count_update == 0) > + goto put_pages; > + > + for (i = 0; i < mem_count_update; ++i) { > + if (!ttm->pages[i]) > + continue; > + > + ttm_mem_global_free_page(ttm->glob->mem_glob, ttm->pages[i], > + PAGE_SIZE); > + } > + > +put_pages: > + ttm_put_pages(ttm->pages, ttm->num_pages, ttm->page_flags, > + ttm->caching_state); > + ttm->state = tt_unpopulated; > +} > + > int ttm_pool_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx) > { > struct ttm_mem_global *mem_glob = ttm->glob->mem_glob; > @@ -1075,8 +1097,7 @@ int ttm_pool_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx) > ret = ttm_get_pages(ttm->pages, ttm->num_pages, ttm->page_flags, > ttm->caching_state); > if (unlikely(ret != 0)) { > - ttm_put_pages(ttm->pages, ttm->num_pages, ttm->page_flags, > - ttm->caching_state); > + ttm_pool_unpopulate_helper(ttm, 0); > return ret; > } > > @@ -1084,8 +1105,7 @@ int ttm_pool_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx) > ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i], > PAGE_SIZE, ctx); > if (unlikely(ret != 0)) { > - ttm_put_pages(ttm->pages, ttm->num_pages, > - ttm->page_flags, ttm->caching_state); > + ttm_pool_unpopulate_helper(ttm, i); > return -ENOMEM; > } > } > @@ -1105,18 +1125,7 @@ EXPORT_SYMBOL(ttm_pool_populate); > > void ttm_pool_unpopulate(struct ttm_tt *ttm) > { > - unsigned i; > - > - for (i = 0; i < ttm->num_pages; ++i) { > - if (!ttm->pages[i]) > - continue; > - > - ttm_mem_global_free_page(ttm->glob->mem_glob, ttm->pages[i], > - PAGE_SIZE); > - } > - ttm_put_pages(ttm->pages, ttm->num_pages, ttm->page_flags, > - ttm->caching_state); > - ttm->state = tt_unpopulated; > + ttm_pool_unpopulate_helper(ttm, ttm->num_pages); > } > EXPORT_SYMBOL(ttm_pool_unpopulate); >
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c index 2b12c55a..9ec2021 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c @@ -1063,6 +1063,28 @@ void ttm_page_alloc_fini(void) _manager = NULL; } +static void +ttm_pool_unpopulate_helper(struct ttm_tt *ttm, unsigned mem_count_update) +{ + unsigned i; + + if (mem_count_update == 0) + goto put_pages; + + for (i = 0; i < mem_count_update; ++i) { + if (!ttm->pages[i]) + continue; + + ttm_mem_global_free_page(ttm->glob->mem_glob, ttm->pages[i], + PAGE_SIZE); + } + +put_pages: + ttm_put_pages(ttm->pages, ttm->num_pages, ttm->page_flags, + ttm->caching_state); + ttm->state = tt_unpopulated; +} + int ttm_pool_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx) { struct ttm_mem_global *mem_glob = ttm->glob->mem_glob; @@ -1075,8 +1097,7 @@ int ttm_pool_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx) ret = ttm_get_pages(ttm->pages, ttm->num_pages, ttm->page_flags, ttm->caching_state); if (unlikely(ret != 0)) { - ttm_put_pages(ttm->pages, ttm->num_pages, ttm->page_flags, - ttm->caching_state); + ttm_pool_unpopulate_helper(ttm, 0); return ret; } @@ -1084,8 +1105,7 @@ int ttm_pool_populate(struct ttm_tt *ttm, struct ttm_operation_ctx *ctx) ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i], PAGE_SIZE, ctx); if (unlikely(ret != 0)) { - ttm_put_pages(ttm->pages, ttm->num_pages, - ttm->page_flags, ttm->caching_state); + ttm_pool_unpopulate_helper(ttm, i); return -ENOMEM; } } @@ -1105,18 +1125,7 @@ EXPORT_SYMBOL(ttm_pool_populate); void ttm_pool_unpopulate(struct ttm_tt *ttm) { - unsigned i; - - for (i = 0; i < ttm->num_pages; ++i) { - if (!ttm->pages[i]) - continue; - - ttm_mem_global_free_page(ttm->glob->mem_glob, ttm->pages[i], - PAGE_SIZE); - } - ttm_put_pages(ttm->pages, ttm->num_pages, ttm->page_flags, - ttm->caching_state); - ttm->state = tt_unpopulated; + ttm_pool_unpopulate_helper(ttm, ttm->num_pages); } EXPORT_SYMBOL(ttm_pool_unpopulate);
when ttm_mem_global_alloc_page fails, we should call ttm_mem_global_free_page to update memory count for the ttm pages which already run ttm_mem_global_alloc_page successfully Signed-off-by: Roger He <Hongbo.He@amd.com> --- drivers/gpu/drm/ttm/ttm_page_alloc.c | 41 ++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 16 deletions(-)