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.zhou at 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.koenig at 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); >>  } >