@@ -185,6 +185,21 @@ static int handle_vma_pagefault(struct xe_tile *tile, struct pagefault *pf,
185
185
return err ;
186
186
}
187
187
188
+ static struct xe_vm * asid_to_vm (struct xe_device * xe , u32 asid )
189
+ {
190
+ struct xe_vm * vm ;
191
+
192
+ down_read (& xe -> usm .lock );
193
+ vm = xa_load (& xe -> usm .asid_to_vm , asid );
194
+ if (vm && xe_vm_in_fault_mode (vm ))
195
+ xe_vm_get (vm );
196
+ else
197
+ vm = ERR_PTR (- EINVAL );
198
+ up_read (& xe -> usm .lock );
199
+
200
+ return vm ;
201
+ }
202
+
188
203
static int handle_pagefault (struct xe_gt * gt , struct pagefault * pf )
189
204
{
190
205
struct xe_device * xe = gt_to_xe (gt );
@@ -197,16 +212,9 @@ static int handle_pagefault(struct xe_gt *gt, struct pagefault *pf)
197
212
if (pf -> trva_fault )
198
213
return - EFAULT ;
199
214
200
- /* ASID to VM */
201
- down_read (& xe -> usm .lock );
202
- vm = xa_load (& xe -> usm .asid_to_vm , pf -> asid );
203
- if (vm && xe_vm_in_fault_mode (vm ))
204
- xe_vm_get (vm );
205
- else
206
- vm = NULL ;
207
- up_read (& xe -> usm .lock );
208
- if (!vm )
209
- return - EINVAL ;
215
+ vm = asid_to_vm (xe , pf -> asid );
216
+ if (IS_ERR (vm ))
217
+ return PTR_ERR (vm );
210
218
211
219
/*
212
220
* TODO: Change to read lock? Using write lock for simplicity.
@@ -548,14 +556,9 @@ static int handle_acc(struct xe_gt *gt, struct acc *acc)
548
556
if (acc -> access_type != ACC_TRIGGER )
549
557
return - EINVAL ;
550
558
551
- /* ASID to VM */
552
- down_read (& xe -> usm .lock );
553
- vm = xa_load (& xe -> usm .asid_to_vm , acc -> asid );
554
- if (vm )
555
- xe_vm_get (vm );
556
- up_read (& xe -> usm .lock );
557
- if (!vm || !xe_vm_in_fault_mode (vm ))
558
- return - EINVAL ;
559
+ vm = asid_to_vm (xe , acc -> asid );
560
+ if (IS_ERR (vm ))
561
+ return PTR_ERR (vm );
559
562
560
563
down_read (& vm -> lock );
561
564
0 commit comments