drm/xe/userptr: properly setup pfn_flags_mask
Subsystems (3)
PATCH 1/1 drm/xe/userptr: properly setup pfn_flags_mask
Currently we just leave it uninitialised, which at first looks harmless, however we also don't zero out the pfn array, and with pfn_flags_mask the idea is to be able set individual flags for a given range of pfn or completely ignore them, outside of default_flags. So here we end up with pfn[i] & pfn_flags_mask, and if both are uninitialised we might get back an unexpected flags value, like asking for read only with default_flags, but getting back write on top, leading to potentially bogus behaviour.
To fix this ensure we zero the pfn_flags_mask, such that hmm only considers the default_flags and not also the initial pfn[i] value.
--- drivers/gpu/drm/xe/xe_hmm.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/xe/xe_hmm.c +1 -0
@@ -206,6 +206,7 @@ int xe_hmm_userptr_populate_range(struct xe_userptr_vma *uvma, goto free_pfns; } + hmm_range.pfn_flags_mask =0 ; hmm_range.default_flags = flags; hmm_range.hmm_pfns = pfns; hmm_range.notifier = &userptr->notifier;
Signature · 1 line
2.48.1
Quoted 37 lines · Matthew Auld
Currently we just leave it uninitialised, which at first looks harmless,
however we also don't zero out the pfn array, and withpfn_flags_maskthe idea is to be able set individual flags for a given range of pfn or
completely ignore them, outside ofdefault_flags. So here we end up with
pfn[i] &pfn_flags_mask, and if both are uninitialised we might get back
an unexpected flags value, like asking for read only withdefault_flags,
but getting back write on top, leading to potentially bogus behaviour.To fix this ensure we zero the
pfn_flags_mask, such that hmm only considers thedefault_flagsand not also the initial pfn[i] value.Fixes 81e058a3e7fd ("drm/xe: Introduce helper to populate userptr")Signed-off-by Matthew Auld <[email protected]>Cc Matthew Brost <[email protected]>Cc Thomas Hellström <[email protected]>Cc <[email protected]> # v6.10+---
drivers/gpu/drm/xe/xe_hmm.c | 1 +1 file changed, 1 insertion(+)drivers/gpu/drm/xe/xe_hmm.c +0
-0@@ -206,6 +206,7 @@ int xe_hmm_userptr_populate_range(structxe_userptr_vma *uvma, goto free_pfns; }drivers/gpu/drm/xe/xe_hmm.c +1
-0+ hmm_range.pfn_flags_mask =0 ;
Quoted 3 lines
hmm_range.default_flags = flags;
hmm_range.hmm_pfns = pfns;
hmm_range.notifier =&userptr->notifier;
Is there a chance we can modify the function to have an initializer for hmm_range
struct hmm_range hmm_range = {...
That'd also make adding fields to struct hmm_range less fragile.
Either way,
Quoted 36 lines
-----Original Message-----
From: Intel-xe <[email protected]> On Behalf Of Matthew Auld
Sent: Wednesday, February 26, 2025 10:47 PM
To: [email protected]
Cc: Brost, Matthew <[email protected]>; Hellstrom, Thomas <[email protected]>; [email protected]
Subject: [PATCH] drm/xe/userptr: properly setuppfn_flags_maskCurrently we just leave it uninitialised, which at first looks harmless, however we also don't zero out the pfn array, and with
pfn_flags_maskthe idea is to be able set individual flags for a given range of pfn or completely ignore them, outside ofdefault_flags. So here we end up with pfn[i] &pfn_flags_mask, and if both are uninitialised we might get back an unexpected flags value, like asking for read only withdefault_flags, but getting back write on top, leading to potentially bogus behaviour.To fix this ensure we zero the
pfn_flags_mask, such that hmm only considers thedefault_flagsand not also the initial pfn[i] value.Fixes 81e058a3e7fd ("drm/xe: Introduce helper to populate userptr")Signed-off-by Matthew Auld <[email protected]>Cc Matthew Brost <[email protected]>Cc Thomas Hellström <[email protected]>Cc <[email protected]> # v6.10+--- drivers/gpu/drm/xe/xe_hmm.c | 1 + 1 file changed, 1 insertion(+)drivers/gpu/drm/xe/xe_hmm.c +0
-0
drivers/gpu/drm/xe/xe_hmm.c int xe_hmm_userptr_populate_range(struct · line 210
Quoted 5 lines
drivers/gpu/drm/xe/xe_hmm.c +1
-0@@ -206,6 +206,7 @@ int xe_hmm_userptr_populate_range(structxe_userptr_vma *uvma, goto free_pfns; } + hmm_range.pfn_flags_mask =0 ;
Looks correct to me,
Tejas
Quoted 5 lines
drivers/gpu/drm/xe/xe_hmm.c +0
-0hmm_range.default_flags = flags; hmm_range.hmm_pfns = pfns;hmm_range.notifier =
&userptr->notifier;
--
2.48.1