On 2018年01月12日 16:04, Christian König wrote:
Am 12.01.2018 um 06:45 schrieb Chunming Zhou:
Change-Id: I7ca19a1f6404356a6c69ab4af27c8e13454f0279
Signed-off-by: Chunming Zhou <david1.z...@amd.com>
---
  amdgpu/amdgpu_internal.h |   2 -
  amdgpu/amdgpu_vamgr.c    | 152 ++++++++++++++---------------------------------
  2 files changed, 46 insertions(+), 108 deletions(-)

diff --git a/amdgpu/amdgpu_internal.h b/amdgpu/amdgpu_internal.h
index fd522f39..7484780b 100644
--- a/amdgpu/amdgpu_internal.h
+++ b/amdgpu/amdgpu_internal.h
@@ -53,8 +53,6 @@ struct amdgpu_bo_va_hole {
  };
    struct amdgpu_bo_va_mgr {
-    /* the start virtual address */
-    uint64_t va_offset;
      uint64_t va_min;
      uint64_t va_max;

Is va_min and va_max actually still used after that series?
Yes, still used for svm manager.

If not I would remove them as well.

Apart from that I would indeed add the warning when the calloc during free fails.

With that fixed the series is Reviewed-by: Christian König <christian.koe...@amd.com>.
Thanks for review.

Regards,
David Zhou

Regards,
Christian.

      struct list_head va_holes;
diff --git a/amdgpu/amdgpu_vamgr.c b/amdgpu/amdgpu_vamgr.c
index 66bb8ecd..b826ac81 100644
--- a/amdgpu/amdgpu_vamgr.c
+++ b/amdgpu/amdgpu_vamgr.c
@@ -61,13 +61,20 @@ int amdgpu_va_range_query(amdgpu_device_handle dev,
  drm_private void amdgpu_vamgr_init(struct amdgpu_bo_va_mgr *mgr, uint64_t start,
                    uint64_t max, uint64_t alignment)
  {
-    mgr->va_offset = start;
+    struct amdgpu_bo_va_hole *n;
+
      mgr->va_min = start;
      mgr->va_max = max;
      mgr->va_alignment = alignment;
        list_inithead(&mgr->va_holes);
      pthread_mutex_init(&mgr->bo_va_mutex, NULL);
+    pthread_mutex_lock(&mgr->bo_va_mutex);
+    n = calloc(1, sizeof(struct amdgpu_bo_va_hole));
+    n->size = mgr->va_max;
+    n->offset = mgr->va_min;
+    list_add(&n->list, &mgr->va_holes);
+    pthread_mutex_unlock(&mgr->bo_va_mutex);
  }
    drm_private void amdgpu_vamgr_deinit(struct amdgpu_bo_va_mgr *mgr)
@@ -136,35 +143,8 @@ amdgpu_vamgr_find_va(struct amdgpu_bo_va_mgr *mgr, uint64_t size,
          }
      }
  -    if (base_required) {
-        if (base_required < mgr->va_offset) {
-            pthread_mutex_unlock(&mgr->bo_va_mutex);
-            return AMDGPU_INVALID_VA_ADDRESS;
-        }
-        offset = mgr->va_offset;
-        waste = base_required - mgr->va_offset;
-    } else {
-        offset = mgr->va_offset;
-        waste = offset % alignment;
-        waste = waste ? alignment - waste : 0;
-    }
-
-    if (offset + waste + size > mgr->va_max) {
-        pthread_mutex_unlock(&mgr->bo_va_mutex);
-        return AMDGPU_INVALID_VA_ADDRESS;
-    }
-
-    if (waste) {
-        n = calloc(1, sizeof(struct amdgpu_bo_va_hole));
-        n->size = waste;
-        n->offset = offset;
-        list_add(&n->list, &mgr->va_holes);
-    }
-
-    offset += waste;
-    mgr->va_offset += size + waste;
      pthread_mutex_unlock(&mgr->bo_va_mutex);
-    return offset;
+    return AMDGPU_INVALID_VA_ADDRESS;
  }
    static uint64_t amdgpu_vamgr_find_va_in_range(struct amdgpu_bo_va_mgr *mgr, uint64_t size, @@ -232,41 +212,14 @@ static uint64_t amdgpu_vamgr_find_va_in_range(struct amdgpu_bo_va_mgr *mgr, uint
          }
      }
  -    if (mgr->va_offset > range_max) {
-        pthread_mutex_unlock(&mgr->bo_va_mutex);
-        return AMDGPU_INVALID_VA_ADDRESS;
-    } else if (mgr->va_offset > range_min) {
-        offset = mgr->va_offset;
-        waste = offset % alignment;
-        waste = waste ? alignment - waste : 0;
-        if (offset + waste + size > range_max) {
-            pthread_mutex_unlock(&mgr->bo_va_mutex);
-            return AMDGPU_INVALID_VA_ADDRESS;
-        }
-    } else {
-        offset = mgr->va_offset;
-        waste = range_min % alignment;
-        waste = waste ? alignment - waste : 0;
-        waste += range_min - offset ;
-    }
-
-    if (waste) {
-        n = calloc(1, sizeof(struct amdgpu_bo_va_hole));
-        n->size = waste;
-        n->offset = offset;
-        list_add(&n->list, &mgr->va_holes);
-    }
-
-    offset += waste;
-    mgr->va_offset = size + offset;
      pthread_mutex_unlock(&mgr->bo_va_mutex);
-    return offset;
+    return AMDGPU_INVALID_VA_ADDRESS;
  }
    drm_private void
  amdgpu_vamgr_free_va(struct amdgpu_bo_va_mgr *mgr, uint64_t va, uint64_t size)
  {
-    struct amdgpu_bo_va_hole *hole;
+    struct amdgpu_bo_va_hole *hole, *next;
        if (va == AMDGPU_INVALID_VA_ADDRESS)
          return;
@@ -274,61 +227,48 @@ amdgpu_vamgr_free_va(struct amdgpu_bo_va_mgr *mgr, uint64_t va, uint64_t size)
      size = ALIGN(size, mgr->va_alignment);
        pthread_mutex_lock(&mgr->bo_va_mutex);
-    if ((va + size) == mgr->va_offset) {
-        mgr->va_offset = va;
-        /* Delete uppermost hole if it reaches the new top */
-        if (!LIST_IS_EMPTY(&mgr->va_holes)) {
-            hole = container_of(mgr->va_holes.next, hole, list);
-            if ((hole->offset + hole->size) == va) {
-                mgr->va_offset = hole->offset;
-                list_del(&hole->list);
-                free(hole);
-            }
-        }
-    } else {
-        struct amdgpu_bo_va_hole *next;
  -        hole = container_of(&mgr->va_holes, hole, list);
-        LIST_FOR_EACH_ENTRY(next, &mgr->va_holes, list) {
-            if (next->offset < va)
-                break;
-            hole = next;
-        }
+    hole = container_of(&mgr->va_holes, hole, list);
+    LIST_FOR_EACH_ENTRY(next, &mgr->va_holes, list) {
+        if (next->offset < va)
+            break;
+        hole = next;
+    }
  -        if (&hole->list != &mgr->va_holes) {
-            /* Grow upper hole if it's adjacent */
-            if (hole->offset == (va + size)) {
-                hole->offset = va;
-                hole->size += size;
-                /* Merge lower hole if it's adjacent */
-                if (next != hole
-                        && &next->list != &mgr->va_holes
-                        && (next->offset + next->size) == va) {
-                    next->size += hole->size;
-                    list_del(&hole->list);
-                    free(hole);
-                }
-                goto out;
+    if (&hole->list != &mgr->va_holes) {
+        /* Grow upper hole if it's adjacent */
+        if (hole->offset == (va + size)) {
+            hole->offset = va;
+            hole->size += size;
+            /* Merge lower hole if it's adjacent */
+            if (next != hole &&
+                &next->list != &mgr->va_holes &&
+                (next->offset + next->size) == va) {
+                next->size += hole->size;
+                list_del(&hole->list);
+                free(hole);
              }
-        }
-
-        /* Grow lower hole if it's adjacent */
-        if (next != hole && &next->list != &mgr->va_holes &&
-                (next->offset + next->size) == va) {
-            next->size += size;
              goto out;
          }
+    }
  -        /* FIXME on allocation failure we just lose virtual address space
-         * maybe print a warning
-         */
-        next = calloc(1, sizeof(struct amdgpu_bo_va_hole));
-        if (next) {
-            next->size = size;
-            next->offset = va;
-            list_add(&next->list, &hole->list);
-        }
+    /* Grow lower hole if it's adjacent */
+    if (next != hole && &next->list != &mgr->va_holes &&
+        (next->offset + next->size) == va) {
+        next->size += size;
+        goto out;
      }
+
+    /* FIXME on allocation failure we just lose virtual address space
+     * maybe print a warning
+     */
+    next = calloc(1, sizeof(struct amdgpu_bo_va_hole));
+    if (next) {
+        next->size = size;
+        next->offset = va;
+        list_add(&next->list, &hole->list);
+    }
+
  out:
      pthread_mutex_unlock(&mgr->bo_va_mutex);
  }


_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to