• Arunpravin's avatar
    drm: improve drm_buddy_alloc function · afea229f
    Arunpravin authored
    - Make drm_buddy_alloc a single function to handle
      range allocation and non-range allocation demands
    
    - Implemented a new function alloc_range() which allocates
      the requested power-of-two block comply with range limitations
    
    - Moved order computation and memory alignment logic from
      i915 driver to drm buddy
    
    v2:
      merged below changes to keep the build unbroken
       - drm_buddy_alloc_range() becomes obsolete and may be removed
       - enable ttm range allocation (fpfn / lpfn) support in i915 driver
       - apply enhanced drm_buddy_alloc() function to i915 driver
    
    v3(Matthew Auld):
      - Fix alignment issues and remove unnecessary list_empty check
      - add more validation checks for input arguments
      - make alloc_range() block allocations as bottom-up
      - optimize order computation logic
      - replace uint64_t with u64, which is preferred in the kernel
    
    v4(Matthew Auld):
      - keep drm_buddy_alloc_range() function implementation for generic
        actual range allocations
      - keep alloc_range() implementation for end bias allocations
    
    v5(Matthew Auld):
      - modify drm_buddy_alloc() passing argument place->lpfn to lpfn
        as place->lpfn will currently always be zero for i915
    
    v6(Matthew Auld):
      - fixup potential uaf - If we are unlucky and can't allocate
        enough memory when splitting blocks, where we temporarily
        end up with the given block and its buddy on the respective
        free list, then we need to ensure we delete both blocks,
        and no just the buddy, before potentially freeing them
    
      - fix warnings reported by kernel test robot <lkp@intel.com>
    
    v7(Matthew Auld):
      - revert fixup potential uaf
      - keep __alloc_range() add node to the list logic same as
        drm_buddy_alloc_blocks() by having a temporary list variable
      - at drm_buddy_alloc_blocks() keep i915 range_overflows macro
        and add a new check for end variable
    
    v8:
      - fix warnings reported by kernel test robot <lkp@intel.com>
    
    v9(Matthew Auld):
      - remove DRM_BUDDY_RANGE_ALLOCATION flag
      - remove unnecessary function description
    
    v10:
       - keep DRM_BUDDY_RANGE_ALLOCATION flag as removing the flag
         and replacing with (end < size) logic fails amdgpu driver load
    Signed-off-by: default avatarArunpravin <Arunpravin.PaneerSelvam@amd.com>
    Reviewed-by: default avatarMatthew Auld <matthew.auld@intel.com>
    Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20220221164552.2434-1-Arunpravin.PaneerSelvam@amd.com
    afea229f
drm_buddy.c 14.1 KB