AMD-GFX Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Matthew Auld <matthew.auld@intel.com>
To: "Paneer Selvam, Arunpravin" <arunpravin.paneerselvam@amd.com>,
	Alex Deucher <alexdeucher@gmail.com>
Cc: dri-devel@lists.freedesktop.org, amd-gfx@lists.freedesktop.org,
	christian.koenig@amd.com, alexander.deucher@amd.com,
	frank.min@amd.com, marek.olsak@amd.com
Subject: Re: [PATCH] drm/buddy: Add start address support to trim function
Date: Tue, 16 Jul 2024 11:04:03 +0100	[thread overview]
Message-ID: <9fce9f74-ebbb-4763-9f87-218055e61654@intel.com> (raw)
In-Reply-To: <f4027aee-1ff2-4f0d-8230-6f6b2e101f78@amd.com>

On 16/07/2024 10:50, Paneer Selvam, Arunpravin wrote:
> Hi Matthew,
> 
> On 7/10/2024 6:20 PM, Matthew Auld wrote:
>> On 10/07/2024 07:03, Paneer Selvam, Arunpravin wrote:
>>> Thanks Alex.
>>>
>>> Hi Matthew,
>>> Any comments?
>>
>> Do we not pass the required address alignment when allocating the 
>> pages in the first place?
> If address alignment is really useful, we can add that in the 
> drm_buddy_alloc_blocks() function.

I mean don't we already pass the min page size, which should give us 
matching physical address alignment?

> 
> Thanks,
> Arun.
>>
>>>
>>> Thanks,
>>> Arun.
>>>
>>> On 7/9/2024 1:42 AM, Alex Deucher wrote:
>>>> On Thu, Jul 4, 2024 at 4:40 AM Arunpravin Paneer Selvam
>>>> <Arunpravin.PaneerSelvam@amd.com> wrote:
>>>>> - Add a new start parameter in trim function to specify exact
>>>>>    address from where to start the trimming. This would help us
>>>>>    in situations like if drivers would like to do address alignment
>>>>>    for specific requirements.
>>>>>
>>>>> - Add a new flag DRM_BUDDY_TRIM_DISABLE. Drivers can use this
>>>>>    flag to disable the allocator trimming part. This patch enables
>>>>>    the drivers control trimming and they can do it themselves
>>>>>    based on the application requirements.
>>>>>
>>>>> v1:(Matthew)
>>>>>    - check new_start alignment with min chunk_size
>>>>>    - use range_overflows()
>>>>>
>>>>> Signed-off-by: Arunpravin Paneer Selvam 
>>>>> <Arunpravin.PaneerSelvam@amd.com>
>>>> Series is:
>>>> Acked-by: Alex Deucher <alexander.deucher@amd.com>
>>>>
>>>> I'd like to take this series through the amdgpu tree if there are no
>>>> objections as it's required for display buffers on some chips and I'd
>>>> like to make sure it lands in 6.11.
>>>>
>>>> Thanks,
>>>>
>>>> Alex
>>>>
>>>>> ---
>>>>>   drivers/gpu/drm/drm_buddy.c          | 25 +++++++++++++++++++++++--
>>>>>   drivers/gpu/drm/xe/xe_ttm_vram_mgr.c |  2 +-
>>>>>   include/drm/drm_buddy.h              |  2 ++
>>>>>   3 files changed, 26 insertions(+), 3 deletions(-)
>>>>>
>>>>> diff --git a/drivers/gpu/drm/drm_buddy.c b/drivers/gpu/drm/drm_buddy.c
>>>>> index 94f8c34fc293..8cebe1fa4e9d 100644
>>>>> --- a/drivers/gpu/drm/drm_buddy.c
>>>>> +++ b/drivers/gpu/drm/drm_buddy.c
>>>>> @@ -851,6 +851,7 @@ static int __alloc_contig_try_harder(struct 
>>>>> drm_buddy *mm,
>>>>>    * drm_buddy_block_trim - free unused pages
>>>>>    *
>>>>>    * @mm: DRM buddy manager
>>>>> + * @start: start address to begin the trimming.
>>>>>    * @new_size: original size requested
>>>>>    * @blocks: Input and output list of allocated blocks.
>>>>>    * MUST contain single block as input to be trimmed.
>>>>> @@ -866,11 +867,13 @@ static int __alloc_contig_try_harder(struct 
>>>>> drm_buddy *mm,
>>>>>    * 0 on success, error code on failure.
>>>>>    */
>>>>>   int drm_buddy_block_trim(struct drm_buddy *mm,
>>>>> +                        u64 *start,
>>>>>                           u64 new_size,
>>>>>                           struct list_head *blocks)
>>>>>   {
>>>>>          struct drm_buddy_block *parent;
>>>>>          struct drm_buddy_block *block;
>>>>> +       u64 block_start, block_end;
>>>>>          LIST_HEAD(dfs);
>>>>>          u64 new_start;
>>>>>          int err;
>>>>> @@ -882,6 +885,9 @@ int drm_buddy_block_trim(struct drm_buddy *mm,
>>>>>                                   struct drm_buddy_block,
>>>>>                                   link);
>>>>>
>>>>> +       block_start = drm_buddy_block_offset(block);
>>>>> +       block_end = block_start + drm_buddy_block_size(mm, block);
>>>>> +
>>>>>          if (WARN_ON(!drm_buddy_block_is_allocated(block)))
>>>>>                  return -EINVAL;
>>>>>
>>>>> @@ -894,6 +900,20 @@ int drm_buddy_block_trim(struct drm_buddy *mm,
>>>>>          if (new_size == drm_buddy_block_size(mm, block))
>>>>>                  return 0;
>>>>>
>>>>> +       new_start = block_start;
>>>>> +       if (start) {
>>>>> +               new_start = *start;
>>>>> +
>>>>> +               if (new_start < block_start)
>>>>> +                       return -EINVAL;
>>>>> +
>>>>> +               if (!IS_ALIGNED(new_start, mm->chunk_size))
>>>>> +                       return -EINVAL;
>>>>> +
>>>>> +               if (range_overflows(new_start, new_size, block_end))
>>>>> +                       return -EINVAL;
>>>>> +       }
>>>>> +
>>>>>          list_del(&block->link);
>>>>>          mark_free(mm, block);
>>>>>          mm->avail += drm_buddy_block_size(mm, block);
>>>>> @@ -904,7 +924,6 @@ int drm_buddy_block_trim(struct drm_buddy *mm,
>>>>>          parent = block->parent;
>>>>>          block->parent = NULL;
>>>>>
>>>>> -       new_start = drm_buddy_block_offset(block);
>>>>>          list_add(&block->tmp_link, &dfs);
>>>>>          err =  __alloc_range(mm, &dfs, new_start, new_size, 
>>>>> blocks, NULL);
>>>>>          if (err) {
>>>>> @@ -1066,7 +1085,8 @@ int drm_buddy_alloc_blocks(struct drm_buddy *mm,
>>>>>          } while (1);
>>>>>
>>>>>          /* Trim the allocated block to the required size */
>>>>> -       if (original_size != size) {
>>>>> +       if (!(flags & DRM_BUDDY_TRIM_DISABLE) &&
>>>>> +           original_size != size) {
>>>>>                  struct list_head *trim_list;
>>>>>                  LIST_HEAD(temp);
>>>>>                  u64 trim_size;
>>>>> @@ -1083,6 +1103,7 @@ int drm_buddy_alloc_blocks(struct drm_buddy *mm,
>>>>>                  }
>>>>>
>>>>>                  drm_buddy_block_trim(mm,
>>>>> +                                    NULL,
>>>>>                                       trim_size,
>>>>>                                       trim_list);
>>>>>
>>>>> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c 
>>>>> b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
>>>>> index fe3779fdba2c..423b261ea743 100644
>>>>> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
>>>>> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
>>>>> @@ -150,7 +150,7 @@ static int xe_ttm_vram_mgr_new(struct 
>>>>> ttm_resource_manager *man,
>>>>>          } while (remaining_size);
>>>>>
>>>>>          if (place->flags & TTM_PL_FLAG_CONTIGUOUS) {
>>>>> -               if (!drm_buddy_block_trim(mm, vres->base.size, 
>>>>> &vres->blocks))
>>>>> +               if (!drm_buddy_block_trim(mm, NULL, 
>>>>> vres->base.size, &vres->blocks))
>>>>>                          size = vres->base.size;
>>>>>          }
>>>>>
>>>>> diff --git a/include/drm/drm_buddy.h b/include/drm/drm_buddy.h
>>>>> index 82570f77e817..0c2f735f0265 100644
>>>>> --- a/include/drm/drm_buddy.h
>>>>> +++ b/include/drm/drm_buddy.h
>>>>> @@ -27,6 +27,7 @@
>>>>>   #define DRM_BUDDY_CONTIGUOUS_ALLOCATION BIT(2)
>>>>>   #define DRM_BUDDY_CLEAR_ALLOCATION             BIT(3)
>>>>>   #define DRM_BUDDY_CLEARED                      BIT(4)
>>>>> +#define DRM_BUDDY_TRIM_DISABLE                 BIT(5)
>>>>>
>>>>>   struct drm_buddy_block {
>>>>>   #define DRM_BUDDY_HEADER_OFFSET GENMASK_ULL(63, 12)
>>>>> @@ -155,6 +156,7 @@ int drm_buddy_alloc_blocks(struct drm_buddy *mm,
>>>>>                             unsigned long flags);
>>>>>
>>>>>   int drm_buddy_block_trim(struct drm_buddy *mm,
>>>>> +                        u64 *start,
>>>>>                           u64 new_size,
>>>>>                           struct list_head *blocks);
>>>>>
>>>>> -- 
>>>>> 2.25.1
>>>>>
>>>
> 

  reply	other threads:[~2024-07-16 10:04 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-04  8:30 [PATCH] drm/buddy: Add start address support to trim function Arunpravin Paneer Selvam
2024-07-04  8:30 ` [PATCH 2/2] drm/amdgpu: Add address alignment support to DCC buffers Arunpravin Paneer Selvam
2024-07-04  8:47   ` Christian König
2024-07-08 20:12 ` [PATCH] drm/buddy: Add start address support to trim function Alex Deucher
2024-07-10  6:03   ` Paneer Selvam, Arunpravin
2024-07-10 12:50     ` Matthew Auld
2024-07-16  9:50       ` Paneer Selvam, Arunpravin
2024-07-16 10:04         ` Matthew Auld [this message]
2024-07-17 15:02           ` Paneer Selvam, Arunpravin
2024-07-19 10:31             ` Matthew Auld
2024-07-22 11:41               ` Paneer Selvam, Arunpravin
2024-07-23 14:56                 ` Matthew Auld
  -- strict thread matches above, loose matches on Subject: below --
2024-06-21  5:29 Arunpravin Paneer Selvam
2024-06-21 16:06 ` Matthew Auld

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9fce9f74-ebbb-4763-9f87-218055e61654@intel.com \
    --to=matthew.auld@intel.com \
    --cc=alexander.deucher@amd.com \
    --cc=alexdeucher@gmail.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=arunpravin.paneerselvam@amd.com \
    --cc=christian.koenig@amd.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=frank.min@amd.com \
    --cc=marek.olsak@amd.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox