Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: "Ghimiray, Himal Prasad" <himal.prasad.ghimiray@intel.com>
To: Danilo Krummrich <dakr@kernel.org>
Cc: <intel-xe@lists.freedesktop.org>, <matthew.brost@intel.com>,
	<thomas.hellstrom@linux.intel.com>, <oak.zeng@intel.com>,
	<dri-devel@lists.freedesktop.org>, <bbrezillon@kernel.org>
Subject: Re: [RFC 13/29] drm/gpuvm: Introduce MADVISE Operations
Date: Tue, 18 Mar 2025 17:28:02 +0530	[thread overview]
Message-ID: <4203f450-4b49-401d-81a8-cdcca02035f9@intel.com> (raw)
In-Reply-To: <Z9gxV0RZLopxf8et@pollux>

Hi Danilo,

On 17-03-2025 19:57, Danilo Krummrich wrote:
> (Cc: dri-devel@lists.freedesktop.org, Boris)
> 
> Hi Himal,
> 
> Please make sure to copy in dri-devel for such patches.

Thanks for taking time for this. Will make sure to do same in future.

> 
> On Fri, Mar 14, 2025 at 01:32:10PM +0530, Himal Prasad Ghimiray wrote:
>> Introduce MADVISE operations that do not unmap the GPU VMA. These
>> operations split VMAs if the start or end addresses fall within existing
>> VMAs. The operations can create up to 2 REMAPS and 2 MAPs.
> 
> Can you please add some more motivation details for this patch? What exactly is
> it used for?

We are working on defining the madvise ioctl within the Xe driver,
which sets or unsets attributes to control page placement and PTE
(Page Table Entry) encoding for GPUVMA's within a user-provided
range.

The goal of this patch is to introduce drm_gpuva_ops, which will
create a drm_gpuva_op to cover the user-defined input range.

Let's assume there are multiple gpuvma's within a to d:

         drm_gpuva1                        drm_gpuva2
         attr_1 = x                        attr_1 = x1
         attr_2 = y                        attr_2 = y1
         attr_3 = z                        attr_3 = z1
[a----------------------------b-1][b-------------------c-1]

         drm_gpuva3
         attr_1 = x2
         attr_2 = y2
         attr_3 = z2
[c-------------------d-1]

Case 1)
In this case, the start and end of the user-provided range
lie within drm_gpuva1 a and b-1. We need to update attr_1 to x'.

drm_gpuva1:pre      drm_gpuva:New map         drm_gpuva1:next
  attr_1 = x         attr_1 = x'               attr_1 = x
  attr_2 = y         attr_2 = y                attr_2 = y
  attr_3 = z         attr_3 = z                attr_3 = z
[a---------start-1][start------- end-1][end---------------b-1]

In this scenario, behavior for ops_create is same as
drm_gpuvm_sm_map_ops_create
  REMAP:UNMAP drm_gpuva1 a to b
  REMAP:PREV a to start -1
  REMAP:NEXT end to b-1
  MAP: start to end

Case 2)
User provided input range covers multiple drm_gpuva's.

Start is in between a and b (drm_gpuva1). End is in between c and
d-1 (drm_gpuva2). We need to update attr_2 to y'.

drm_gpuva1:pre         drm_gpuva:Map1          drm_gpuva2
attr_1 = x             attr_1 = x             attr_1 = x1
attr_2 = y             attr_2 = y'            attr_2 = y'
attr_3 = z             attr_3 = z             attr_3 = z1
[a----------start-1][start-------------b-1][b-------------c - 1]

drm_gpuva:Map2  drm_gpuva3:Next
attr_1 = x2     attr_1 = x2
attr_2 = y'     attr_2 = y2
attr_3 = z2     attr_3 = z2
[c------ end-1][end------------d-1]

In this scenario:
REMAP:UNMAP drm_gpuva1 a to b
REMAP:PREV a to start -1
MAP: start to b

REMAP:UNMAP drm_gpuva3 a to b
REMAP:NEXT end+1 to e
MAP: d+1 to end

Behavior is entirely different than drm_gpuvm_sm_map_ops_create.

Case 3) Either of start or end lies within gpuvma and will have one
REMAP and one MAP.

Case 4) Both start and end are lying on existing drm_gpuva's
start/end. No OPS.

The behavior is not same as drm_gpuvm_sm_map_ops_create. Here we
don't merge the drm_gpuva's and there are no unmaps.

Currently, we don't want split to happen on bo backed vma's,
therefore skip_gem_obj_va is added.
[1] and [2] are the patches within driver using the ops and defining the 
ioctl

[1] 
https://lore.kernel.org/intel-xe/20250314080226.2059819-1-himal.prasad.ghimiray@intel.com/T/#m77dd9ea3507ed15bfcd2a1c410f9df17f79c69e1

[2] 
https://lore.kernel.org/intel-xe/20250314080226.2059819-1-himal.prasad.ghimiray@intel.com/T/#m2c49bf11661dec9d52edb8bf1bf9a553a709682e


> 
>>
>> If the input range is within the existing range, it creates REMAP:UNMAP,
>> REMAP:PREV, REMAP:NEXT, and MAP operations for the input range.
>>    Example:
>>    Input Range: 0x00007f0a54000000 to 0x00007f0a54400000
>>    GPU VMA: 0x0000000000000000 to 0x0000800000000000
>>    Operations Result:
>>    - REMAP:UNMAP: addr=0x0000000000000000, range=0x0000800000000000
>>    - REMAP:PREV: addr=0x0000000000000000, range=0x00007f0a54000000
>>    - REMAP:NEXT: addr=0x00007f0a54400000, range=0x000000f5abc00000
>>    - MAP: addr=0x00007f0a54000000, range=0x0000000000400000
> 
> This would be much easier to read if you'd pick some more human readable
> numbers.

This was the output which I printed from within the driver. Should have 
ensured it to be more explanatory. Can you provide some input on how can 
I make it more readable ?

> 
>>
>> If the input range starts at the beginning of one GPU VMA and ends at
>> the end of another VMA, covering multiple VMAs, the operations do nothing.
>>    Example:
>>    Input Range: 0x00007fc898800000 to 0x00007fc899000000
>>    GPU VMAs:
>>    - 0x0000000000000000 to 0x00007fc898800000
>>    - 0x00007fc898800000 to 0x00007fc898a00000
>>    - 0x00007fc898a00000 to 0x00007fc898c00000
>>    - 0x00007fc898c00000 to 0x00007fc899000000
>>    - 0x00007fc899000000 to 0x00007fc899200000
>>    Operations Result: None
> 
> Same here.
> 
>>
>> Cc: Danilo Krummrich <dakr@redhat.com>
>> Cc: Matthew Brost <matthew.brost@intel.com>
>> Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
>> ---
>>   drivers/gpu/drm/drm_gpuvm.c | 175 +++++++++++++++++++++++++++++++++++-
>>   include/drm/drm_gpuvm.h     |   6 ++
>>   2 files changed, 180 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/drm_gpuvm.c b/drivers/gpu/drm/drm_gpuvm.c
>> index f9eb56f24bef..904a26641b21 100644
>> --- a/drivers/gpu/drm/drm_gpuvm.c
>> +++ b/drivers/gpu/drm/drm_gpuvm.c
>> @@ -2230,7 +2230,7 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
>>   				ret = op_remap_cb(ops, priv, NULL, &n, &u);
>>   				if (ret)
>>   					return ret;
>> -				break;
>> +				return 0;
>>   			}
>>   		}
>>   	}
>> @@ -2240,6 +2240,143 @@ __drm_gpuvm_sm_map(struct drm_gpuvm *gpuvm,
>>   			 req_obj, req_offset);
>>   }
>>   
>> +static int
>> +__drm_gpuvm_skip_split_map(struct drm_gpuvm *gpuvm,
>> +			   const struct drm_gpuvm_ops *ops, void *priv,
>> +			   u64 req_addr, u64 req_range,
>> +			   bool skip_gem_obj_va, u64 req_offset)
> 
> This looks like a full copy of __drm_gpuvm_sm_map(). I think you should extend
> __drm_gpuvm_sm_map() instead and add an optional flags parameter, e.g.

Unlike __drm_gpuvm_sm_map() this wont have any unmaps and merging of 
drm_gpuva's, hence I thought keeping it as separate ops is better. If 
you are of the opinion modifying __drm_gpuvm_sm_map on the basis of flag 
is more cleaner and maintainable, will change to it.


> 
> 	enum drm_gpuvm_madvise_flags {
> 		DRM_GPUVM_SKIP_GEM_OBJ_VA = BIT(0),
> 	}
> 
> Not sure whether "SKIP_GEM_OBJ_VA" is a good name, but I haven't gone through
> this to such extend that I could propose something better.
> 
>> +struct drm_gpuva_ops *
>> +drm_gpuvm_madvise_ops_create(struct drm_gpuvm *gpuvm,
>> +			     u64 req_addr, u64 req_range,
>> +			     bool skip_gem_obj_va, u64 req_offset)
> 
> Same here, I don't think we need a new function for this, but just the
> corresponding flags argument to the existing one.

Same as above

> 
> Besides that, when adding new functionality, please extend the documentation of
> drm_gpuvm accordingly. It's fine you didn't do so for the RFC of course. :)

Thanks for reminding. I Will definitely add proper documentation with 
conclusion on further design, just wanted to have opinions on this with 
RFC.

- Himal


  reply	other threads:[~2025-03-18 11:58 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-14  8:01 [RFC 00/29] PREFETCH and MADVISE for SVM ranges Himal Prasad Ghimiray
2025-03-14  8:01 ` [RFC 01/29] drm/xe: Introduce xe_vma_op_prefetch_range struct for prefetch of ranges Himal Prasad Ghimiray
2025-04-03 20:59   ` Matthew Brost
2025-03-14  8:01 ` [RFC 02/29] drm/xe: Make xe_svm_alloc_vram public Himal Prasad Ghimiray
2025-03-27 22:45   ` Matthew Brost
2025-03-28  7:51     ` Ghimiray, Himal Prasad
2025-03-14  8:02 ` [RFC 03/29] drm/xe/svm: Helper to add tile masks to svm ranges Himal Prasad Ghimiray
2025-03-14  8:02 ` [RFC 04/29] drm/xe/svm: Make to_xe_range a public function Himal Prasad Ghimiray
2025-03-28  2:57   ` Matthew Brost
2025-03-14  8:02 ` [RFC 05/29] drm/xe/svm: Make xe_svm_range_* end/start/size public Himal Prasad Ghimiray
2025-03-27 22:46   ` Matthew Brost
2025-03-14  8:02 ` [RFC 06/29] drm/xe/vm: Update xe_vma_ops_incr_pt_update_ops to take an increment value Himal Prasad Ghimiray
2025-03-28  2:56   ` Matthew Brost
2025-03-28  7:52     ` Ghimiray, Himal Prasad
2025-03-14  8:02 ` [RFC 07/29] drm/xe/vm: Add an identifier in xe_vma_ops for svm prefetch Himal Prasad Ghimiray
2025-03-27 22:49   ` Matthew Brost
2025-03-28  7:53     ` Ghimiray, Himal Prasad
2025-03-14  8:02 ` [RFC 08/29] drm/xe: Rename lookup_vma function to xe_find_vma_by_addr Himal Prasad Ghimiray
2025-04-03 21:02   ` Matthew Brost
2025-04-07  6:16     ` Ghimiray, Himal Prasad
2025-03-14  8:02 ` [RFC 09/29] drm/xe/svm: Allow unaligned addresses and ranges for prefetch Himal Prasad Ghimiray
2025-04-03 20:52   ` Matthew Brost
2025-04-07  6:15     ` Ghimiray, Himal Prasad
2025-03-14  8:02 ` [RFC 10/29] drm/xe/svm: Refactor usage of drm_gpusvm* function in xe_svm Himal Prasad Ghimiray
2025-04-03 20:54   ` Matthew Brost
2025-04-07  6:15     ` Ghimiray, Himal Prasad
2025-03-14  8:02 ` [RFC 11/29] drm/xe/svm: Implement prefetch support for SVM ranges Himal Prasad Ghimiray
2025-03-14  8:02 ` [RFC 12/29] drm/xe/vm: Add debug prints for SVM range prefetch Himal Prasad Ghimiray
2025-03-14  8:02 ` [RFC 13/29] drm/gpuvm: Introduce MADVISE Operations Himal Prasad Ghimiray
2025-03-14  8:46   ` Ghimiray, Himal Prasad
2025-03-17 14:27   ` Danilo Krummrich
2025-03-18 11:58     ` Ghimiray, Himal Prasad [this message]
2025-03-14  8:02 ` [RFC 14/29] drm/xe/uapi: Add madvise interface Himal Prasad Ghimiray
2025-03-14  8:02 ` [RFC 15/29] drm/xe/vm: Add attributes struct as member of vma Himal Prasad Ghimiray
2025-03-14  8:02 ` [RFC 16/29] drm/xe/vma: Move pat_index to vma attributes Himal Prasad Ghimiray
2025-03-14  8:02 ` [RFC 17/29] drm/xe/vma: Modify new_vma to accept struct xe_vma_mem_attr as parameter Himal Prasad Ghimiray
2025-03-14  8:02 ` [RFC 18/29] drm/gpusvm: Make drm_gpusvm_for_each_* macros public Himal Prasad Ghimiray
2025-03-14  8:02 ` [RFC 19/29] drm/xe/svm: Split system allocator vma incase of madvise call Himal Prasad Ghimiray
2025-03-14  8:02 ` [RFC 20/29] drm/xe: Implement madvise ioctl for xe Himal Prasad Ghimiray
2025-03-14  8:02 ` [RFC 21/29] drm/xe: Allow CPU address mirror VMA unbind with gpu bindings for madvise Himal Prasad Ghimiray
2025-03-14  8:02 ` [RFC 22/29] drm/xe/svm : Add svm ranges migration policy on atomic access Himal Prasad Ghimiray
2025-03-14  8:02 ` [RFC 23/29] drm/xe/madvise: Update migration policy based on preferred location Himal Prasad Ghimiray
2025-03-14  8:02 ` [RFC 24/29] drm/xe/svm: Support DRM_XE_SVM_ATTR_PAT memory attribute Himal Prasad Ghimiray
2025-03-14  8:02 ` [RFC 25/29] drm/xe/uapi: Add flag for consulting madvise hints on svm prefetch Himal Prasad Ghimiray
2025-05-14 19:26   ` Matthew Brost
2025-03-14  8:02 ` [RFC 26/29] drm/xe/svm: Consult madvise preferred location in prefetch Himal Prasad Ghimiray
2025-03-14  8:02 ` [RFC 27/29] drm/xe/uapi: Add uapi for vma count and mem attributes Himal Prasad Ghimiray
2025-05-14 19:39   ` Matthew Brost
2025-03-14  8:02 ` [RFC 28/29] drm/xe/bo: Add attributes field to xe_bo Himal Prasad Ghimiray
2025-05-14 19:35   ` Matthew Brost
2025-03-14  8:02 ` [RFC 29/29] drm/xe/bo : Update atomic_access attribute on madvise Himal Prasad Ghimiray
2025-03-14 15:00 ` ✗ CI.Patch_applied: failure for PREFETCH and MADVISE for SVM ranges (rev2) Patchwork

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=4203f450-4b49-401d-81a8-cdcca02035f9@intel.com \
    --to=himal.prasad.ghimiray@intel.com \
    --cc=bbrezillon@kernel.org \
    --cc=dakr@kernel.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=matthew.brost@intel.com \
    --cc=oak.zeng@intel.com \
    --cc=thomas.hellstrom@linux.intel.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