Re: [Mesa-dev] [PATCH 07/12] panfrost: Allocate dedicated slab for linear BOs

2019-03-11 Thread Tomeu Vizoso
Reviewed-by: Tomeu Vizoso 

On Sun, 10 Mar 2019 at 07:50, Alyssa Rosenzweig  wrote:
>
> Previously, linear BOs shared memory with each other to minimize kernel
> round-trips / latency, as well as to work around a bug in the free_slab
> function. These concerns are invalid now, but continuing to use the slab
> allocator for BOs resulted in memory allocation errors. This issue was
> aggravated, though not introduced (so not a real regression) in the
> previous commit.
>
> Signed-off-by: Alyssa Rosenzweig 
> ---
>  src/gallium/drivers/panfrost/pan_resource.c | 32 -
>  1 file changed, 19 insertions(+), 13 deletions(-)
>
> diff --git a/src/gallium/drivers/panfrost/pan_resource.c 
> b/src/gallium/drivers/panfrost/pan_resource.c
> index 39783f5a63a..0f11b8e5e38 100644
> --- a/src/gallium/drivers/panfrost/pan_resource.c
> +++ b/src/gallium/drivers/panfrost/pan_resource.c
> @@ -248,14 +248,16 @@ panfrost_create_bo(struct panfrost_screen *screen, 
> const struct pipe_resource *t
>  sz >>= 2;
>  }
>  } else {
> -/* But for linear, we can! */
> +/* For a linear resource, allocate a block of memory from
> + * kernel space */
>
> -struct pb_slab_entry *entry = pb_slab_alloc(>slabs, 
> sz, HEAP_TEXTURE);
> -struct panfrost_memory_entry *p_entry = (struct 
> panfrost_memory_entry *) entry;
> -struct panfrost_memory *backing = (struct panfrost_memory *) 
> entry->slab;
> -bo->entry[0] = p_entry;
> -bo->cpu[0] = backing->cpu + p_entry->offset;
> -bo->gpu[0] = backing->gpu + p_entry->offset;
> +struct panfrost_memory mem;
> +
> +unsigned pages = ((sz + 4095) / 4096) * 2;
> +screen->driver->allocate_slab(screen, , pages, true, 0, 
> 0, 0);
> +
> +bo->cpu[0] = mem.cpu;
> +bo->gpu[0] = mem.gpu;
>
>  /* TODO: Mipmap */
>  }
> @@ -325,12 +327,16 @@ panfrost_destroy_bo(struct panfrost_screen *screen, 
> struct panfrost_bo *pbo)
>  {
> struct panfrost_bo *bo = (struct panfrost_bo *)pbo;
>
> -for (int l = 0; l < MAX_MIP_LEVELS; ++l) {
> -if (bo->entry[l] != NULL) {
> -/* Most allocations have an entry to free */
> -bo->entry[l]->freed = true;
> -pb_slab_free(>slabs, >entry[l]->base);
> -}
> +if (bo->layout == PAN_LINEAR) {
> +/* Construct a memory object for all mip levels */
> +
> +struct panfrost_memory mem = {
> +.cpu = bo->cpu[0],
> +.gpu = bo->gpu[0],
> +.size = bo->imported_size
> +};
> +
> +screen->driver->free_slab(screen, );
>  }
>
>  if (bo->layout == PAN_TILED) {
> --
> 2.20.1
>
> ___
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

[Mesa-dev] [PATCH 07/12] panfrost: Allocate dedicated slab for linear BOs

2019-03-09 Thread Alyssa Rosenzweig
Previously, linear BOs shared memory with each other to minimize kernel
round-trips / latency, as well as to work around a bug in the free_slab
function. These concerns are invalid now, but continuing to use the slab
allocator for BOs resulted in memory allocation errors. This issue was
aggravated, though not introduced (so not a real regression) in the
previous commit.

Signed-off-by: Alyssa Rosenzweig 
---
 src/gallium/drivers/panfrost/pan_resource.c | 32 -
 1 file changed, 19 insertions(+), 13 deletions(-)

diff --git a/src/gallium/drivers/panfrost/pan_resource.c 
b/src/gallium/drivers/panfrost/pan_resource.c
index 39783f5a63a..0f11b8e5e38 100644
--- a/src/gallium/drivers/panfrost/pan_resource.c
+++ b/src/gallium/drivers/panfrost/pan_resource.c
@@ -248,14 +248,16 @@ panfrost_create_bo(struct panfrost_screen *screen, const 
struct pipe_resource *t
 sz >>= 2;
 }
 } else {
-/* But for linear, we can! */
+/* For a linear resource, allocate a block of memory from
+ * kernel space */
 
-struct pb_slab_entry *entry = pb_slab_alloc(>slabs, 
sz, HEAP_TEXTURE);
-struct panfrost_memory_entry *p_entry = (struct 
panfrost_memory_entry *) entry;
-struct panfrost_memory *backing = (struct panfrost_memory *) 
entry->slab;
-bo->entry[0] = p_entry;
-bo->cpu[0] = backing->cpu + p_entry->offset;
-bo->gpu[0] = backing->gpu + p_entry->offset;
+struct panfrost_memory mem;
+
+unsigned pages = ((sz + 4095) / 4096) * 2;
+screen->driver->allocate_slab(screen, , pages, true, 0, 0, 
0);
+
+bo->cpu[0] = mem.cpu;
+bo->gpu[0] = mem.gpu;
 
 /* TODO: Mipmap */
 }
@@ -325,12 +327,16 @@ panfrost_destroy_bo(struct panfrost_screen *screen, 
struct panfrost_bo *pbo)
 {
struct panfrost_bo *bo = (struct panfrost_bo *)pbo;
 
-for (int l = 0; l < MAX_MIP_LEVELS; ++l) {
-if (bo->entry[l] != NULL) {
-/* Most allocations have an entry to free */
-bo->entry[l]->freed = true;
-pb_slab_free(>slabs, >entry[l]->base);
-}
+if (bo->layout == PAN_LINEAR) {
+/* Construct a memory object for all mip levels */
+
+struct panfrost_memory mem = {
+.cpu = bo->cpu[0],
+.gpu = bo->gpu[0],
+.size = bo->imported_size
+};
+
+screen->driver->free_slab(screen, );
 }
 
 if (bo->layout == PAN_TILED) {
-- 
2.20.1

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev