diff mbox

[1/3] drm/ttm: add support for different pool sizes

Message ID 1499954169-3209-1-git-send-email-deathsimple@vodafone.de (mailing list archive)
State New, archived
Headers show

Commit Message

Christian König July 13, 2017, 1:56 p.m. UTC
From: Christian König <christian.koenig@amd.com>

Correctly handle different page sizes in the memory accounting.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/ttm/ttm_memory.c         | 12 +++++-------
 drivers/gpu/drm/ttm/ttm_page_alloc.c     |  4 ++--
 drivers/gpu/drm/ttm/ttm_page_alloc_dma.c |  6 +++---
 include/drm/ttm/ttm_memory.h             |  5 ++---
 4 files changed, 12 insertions(+), 15 deletions(-)

Comments

Alex Deucher July 14, 2017, 3:41 p.m. UTC | #1
On Thu, Jul 13, 2017 at 9:56 AM, Christian König
<deathsimple@vodafone.de> wrote:
> From: Christian König <christian.koenig@amd.com>
>
> Correctly handle different page sizes in the memory accounting.
>
> Signed-off-by: Christian König <christian.koenig@amd.com>

I'd split this patch in two, one to remove the no_wait and
interruptible flags and one to add the size parameter.

Alex

> ---
>  drivers/gpu/drm/ttm/ttm_memory.c         | 12 +++++-------
>  drivers/gpu/drm/ttm/ttm_page_alloc.c     |  4 ++--
>  drivers/gpu/drm/ttm/ttm_page_alloc_dma.c |  6 +++---
>  include/drm/ttm/ttm_memory.h             |  5 ++---
>  4 files changed, 12 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/ttm/ttm_memory.c b/drivers/gpu/drm/ttm/ttm_memory.c
> index 29855be..e963749 100644
> --- a/drivers/gpu/drm/ttm/ttm_memory.c
> +++ b/drivers/gpu/drm/ttm/ttm_memory.c
> @@ -546,8 +546,7 @@ int ttm_mem_global_alloc(struct ttm_mem_global *glob, uint64_t memory,
>  EXPORT_SYMBOL(ttm_mem_global_alloc);
>
>  int ttm_mem_global_alloc_page(struct ttm_mem_global *glob,
> -                             struct page *page,
> -                             bool no_wait, bool interruptible)
> +                             struct page *page, uint64_t size)
>  {
>
>         struct ttm_mem_zone *zone = NULL;
> @@ -564,11 +563,11 @@ int ttm_mem_global_alloc_page(struct ttm_mem_global *glob,
>         if (glob->zone_dma32 && page_to_pfn(page) > 0x00100000UL)
>                 zone = glob->zone_kernel;
>  #endif
> -       return ttm_mem_global_alloc_zone(glob, zone, PAGE_SIZE, no_wait,
> -                                        interruptible);
> +       return ttm_mem_global_alloc_zone(glob, zone, size, false, false);
>  }
>
> -void ttm_mem_global_free_page(struct ttm_mem_global *glob, struct page *page)
> +void ttm_mem_global_free_page(struct ttm_mem_global *glob, struct page *page,
> +                             uint64_t size)
>  {
>         struct ttm_mem_zone *zone = NULL;
>
> @@ -579,10 +578,9 @@ void ttm_mem_global_free_page(struct ttm_mem_global *glob, struct page *page)
>         if (glob->zone_dma32 && page_to_pfn(page) > 0x00100000UL)
>                 zone = glob->zone_kernel;
>  #endif
> -       ttm_mem_global_free_zone(glob, zone, PAGE_SIZE);
> +       ttm_mem_global_free_zone(glob, zone, size);
>  }
>
> -
>  size_t ttm_round_pot(size_t size)
>  {
>         if ((size & (size - 1)) == 0)
> diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
> index a37de5d..6add044 100644
> --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
> +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
> @@ -880,7 +880,7 @@ int ttm_pool_populate(struct ttm_tt *ttm)
>                 }
>
>                 ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i],
> -                                               false, false);
> +                                               PAGE_SIZE);
>                 if (unlikely(ret != 0)) {
>                         ttm_pool_unpopulate(ttm);
>                         return -ENOMEM;
> @@ -907,7 +907,7 @@ void ttm_pool_unpopulate(struct ttm_tt *ttm)
>         for (i = 0; i < ttm->num_pages; ++i) {
>                 if (ttm->pages[i]) {
>                         ttm_mem_global_free_page(ttm->glob->mem_glob,
> -                                                ttm->pages[i]);
> +                                                ttm->pages[i], PAGE_SIZE);
>                         ttm_put_pages(&ttm->pages[i], 1,
>                                       ttm->page_flags,
>                                       ttm->caching_state);
> diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
> index cec4b4b..6c38046 100644
> --- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
> +++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
> @@ -910,7 +910,7 @@ int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev)
>                 }
>
>                 ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i],
> -                                               false, false);
> +                                               pool->size);
>                 if (unlikely(ret != 0)) {
>                         ttm_dma_unpopulate(ttm_dma, dev);
>                         return -ENOMEM;
> @@ -975,13 +975,13 @@ void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev)
>         if (is_cached) {
>                 list_for_each_entry_safe(d_page, next, &ttm_dma->pages_list, page_list) {
>                         ttm_mem_global_free_page(ttm->glob->mem_glob,
> -                                                d_page->p);
> +                                                d_page->p, pool->size);
>                         ttm_dma_page_put(pool, d_page);
>                 }
>         } else {
>                 for (i = 0; i < count; i++) {
>                         ttm_mem_global_free_page(ttm->glob->mem_glob,
> -                                                ttm->pages[i]);
> +                                                ttm->pages[i], pool->size);
>                 }
>         }
>
> diff --git a/include/drm/ttm/ttm_memory.h b/include/drm/ttm/ttm_memory.h
> index c452089..2c1e359 100644
> --- a/include/drm/ttm/ttm_memory.h
> +++ b/include/drm/ttm/ttm_memory.h
> @@ -150,10 +150,9 @@ extern int ttm_mem_global_alloc(struct ttm_mem_global *glob, uint64_t memory,
>  extern void ttm_mem_global_free(struct ttm_mem_global *glob,
>                                 uint64_t amount);
>  extern int ttm_mem_global_alloc_page(struct ttm_mem_global *glob,
> -                                    struct page *page,
> -                                    bool no_wait, bool interruptible);
> +                                    struct page *page, uint64_t size);
>  extern void ttm_mem_global_free_page(struct ttm_mem_global *glob,
> -                                    struct page *page);
> +                                    struct page *page, uint64_t size);
>  extern size_t ttm_round_pot(size_t size);
>  extern uint64_t ttm_get_kernel_zone_memory_size(struct ttm_mem_global *glob);
>  #endif
> --
> 2.7.4
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
diff mbox

Patch

diff --git a/drivers/gpu/drm/ttm/ttm_memory.c b/drivers/gpu/drm/ttm/ttm_memory.c
index 29855be..e963749 100644
--- a/drivers/gpu/drm/ttm/ttm_memory.c
+++ b/drivers/gpu/drm/ttm/ttm_memory.c
@@ -546,8 +546,7 @@  int ttm_mem_global_alloc(struct ttm_mem_global *glob, uint64_t memory,
 EXPORT_SYMBOL(ttm_mem_global_alloc);
 
 int ttm_mem_global_alloc_page(struct ttm_mem_global *glob,
-			      struct page *page,
-			      bool no_wait, bool interruptible)
+			      struct page *page, uint64_t size)
 {
 
 	struct ttm_mem_zone *zone = NULL;
@@ -564,11 +563,11 @@  int ttm_mem_global_alloc_page(struct ttm_mem_global *glob,
 	if (glob->zone_dma32 && page_to_pfn(page) > 0x00100000UL)
 		zone = glob->zone_kernel;
 #endif
-	return ttm_mem_global_alloc_zone(glob, zone, PAGE_SIZE, no_wait,
-					 interruptible);
+	return ttm_mem_global_alloc_zone(glob, zone, size, false, false);
 }
 
-void ttm_mem_global_free_page(struct ttm_mem_global *glob, struct page *page)
+void ttm_mem_global_free_page(struct ttm_mem_global *glob, struct page *page,
+			      uint64_t size)
 {
 	struct ttm_mem_zone *zone = NULL;
 
@@ -579,10 +578,9 @@  void ttm_mem_global_free_page(struct ttm_mem_global *glob, struct page *page)
 	if (glob->zone_dma32 && page_to_pfn(page) > 0x00100000UL)
 		zone = glob->zone_kernel;
 #endif
-	ttm_mem_global_free_zone(glob, zone, PAGE_SIZE);
+	ttm_mem_global_free_zone(glob, zone, size);
 }
 
-
 size_t ttm_round_pot(size_t size)
 {
 	if ((size & (size - 1)) == 0)
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
index a37de5d..6add044 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
@@ -880,7 +880,7 @@  int ttm_pool_populate(struct ttm_tt *ttm)
 		}
 
 		ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i],
-						false, false);
+						PAGE_SIZE);
 		if (unlikely(ret != 0)) {
 			ttm_pool_unpopulate(ttm);
 			return -ENOMEM;
@@ -907,7 +907,7 @@  void ttm_pool_unpopulate(struct ttm_tt *ttm)
 	for (i = 0; i < ttm->num_pages; ++i) {
 		if (ttm->pages[i]) {
 			ttm_mem_global_free_page(ttm->glob->mem_glob,
-						 ttm->pages[i]);
+						 ttm->pages[i], PAGE_SIZE);
 			ttm_put_pages(&ttm->pages[i], 1,
 				      ttm->page_flags,
 				      ttm->caching_state);
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
index cec4b4b..6c38046 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
@@ -910,7 +910,7 @@  int ttm_dma_populate(struct ttm_dma_tt *ttm_dma, struct device *dev)
 		}
 
 		ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i],
-						false, false);
+						pool->size);
 		if (unlikely(ret != 0)) {
 			ttm_dma_unpopulate(ttm_dma, dev);
 			return -ENOMEM;
@@ -975,13 +975,13 @@  void ttm_dma_unpopulate(struct ttm_dma_tt *ttm_dma, struct device *dev)
 	if (is_cached) {
 		list_for_each_entry_safe(d_page, next, &ttm_dma->pages_list, page_list) {
 			ttm_mem_global_free_page(ttm->glob->mem_glob,
-						 d_page->p);
+						 d_page->p, pool->size);
 			ttm_dma_page_put(pool, d_page);
 		}
 	} else {
 		for (i = 0; i < count; i++) {
 			ttm_mem_global_free_page(ttm->glob->mem_glob,
-						 ttm->pages[i]);
+						 ttm->pages[i], pool->size);
 		}
 	}
 
diff --git a/include/drm/ttm/ttm_memory.h b/include/drm/ttm/ttm_memory.h
index c452089..2c1e359 100644
--- a/include/drm/ttm/ttm_memory.h
+++ b/include/drm/ttm/ttm_memory.h
@@ -150,10 +150,9 @@  extern int ttm_mem_global_alloc(struct ttm_mem_global *glob, uint64_t memory,
 extern void ttm_mem_global_free(struct ttm_mem_global *glob,
 				uint64_t amount);
 extern int ttm_mem_global_alloc_page(struct ttm_mem_global *glob,
-				     struct page *page,
-				     bool no_wait, bool interruptible);
+				     struct page *page, uint64_t size);
 extern void ttm_mem_global_free_page(struct ttm_mem_global *glob,
-				     struct page *page);
+				     struct page *page, uint64_t size);
 extern size_t ttm_round_pot(size_t size);
 extern uint64_t ttm_get_kernel_zone_memory_size(struct ttm_mem_global *glob);
 #endif