@@ -333,18 +333,19 @@ static int
333
333
iommufd_device_attach_reserved_iova (struct iommufd_device * idev ,
334
334
struct iommufd_hwpt_paging * hwpt_paging )
335
335
{
336
+ struct iommufd_group * igroup = idev -> igroup ;
336
337
int rc ;
337
338
338
- lockdep_assert_held (& idev -> igroup -> lock );
339
+ lockdep_assert_held (& igroup -> lock );
339
340
340
341
rc = iopt_table_enforce_dev_resv_regions (& hwpt_paging -> ioas -> iopt ,
341
342
idev -> dev ,
342
- & idev -> igroup -> sw_msi_start );
343
+ & igroup -> sw_msi_start );
343
344
if (rc )
344
345
return rc ;
345
346
346
- if (list_empty (& idev -> igroup -> device_list )) {
347
- rc = iommufd_group_setup_msi (idev -> igroup , hwpt_paging );
347
+ if (list_empty (& igroup -> device_list )) {
348
+ rc = iommufd_group_setup_msi (igroup , hwpt_paging );
348
349
if (rc ) {
349
350
iopt_remove_reserved_iova (& hwpt_paging -> ioas -> iopt ,
350
351
idev -> dev );
@@ -484,11 +485,12 @@ int iommufd_hw_pagetable_attach(struct iommufd_hw_pagetable *hwpt,
484
485
{
485
486
struct iommufd_hwpt_paging * hwpt_paging = find_hwpt_paging (hwpt );
486
487
bool attach_resv = hwpt_paging && pasid == IOMMU_NO_PASID ;
488
+ struct iommufd_group * igroup = idev -> igroup ;
487
489
int rc ;
488
490
489
- mutex_lock (& idev -> igroup -> lock );
491
+ mutex_lock (& igroup -> lock );
490
492
491
- if (idev -> igroup -> hwpt != NULL && idev -> igroup -> hwpt != hwpt ) {
493
+ if (igroup -> hwpt && igroup -> hwpt != hwpt ) {
492
494
rc = - EINVAL ;
493
495
goto err_unlock ;
494
496
}
@@ -506,39 +508,40 @@ int iommufd_hw_pagetable_attach(struct iommufd_hw_pagetable *hwpt,
506
508
* reserved regions are only updated during individual device
507
509
* attachment.
508
510
*/
509
- if (list_empty (& idev -> igroup -> device_list )) {
511
+ if (list_empty (& igroup -> device_list )) {
510
512
rc = iommufd_hwpt_attach_device (hwpt , idev , pasid );
511
513
if (rc )
512
514
goto err_unresv ;
513
- idev -> igroup -> hwpt = hwpt ;
515
+ igroup -> hwpt = hwpt ;
514
516
}
515
517
refcount_inc (& hwpt -> obj .users );
516
- list_add_tail (& idev -> group_item , & idev -> igroup -> device_list );
517
- mutex_unlock (& idev -> igroup -> lock );
518
+ list_add_tail (& idev -> group_item , & igroup -> device_list );
519
+ mutex_unlock (& igroup -> lock );
518
520
return 0 ;
519
521
err_unresv :
520
522
if (attach_resv )
521
523
iopt_remove_reserved_iova (& hwpt_paging -> ioas -> iopt , idev -> dev );
522
524
err_unlock :
523
- mutex_unlock (& idev -> igroup -> lock );
525
+ mutex_unlock (& igroup -> lock );
524
526
return rc ;
525
527
}
526
528
527
529
struct iommufd_hw_pagetable *
528
530
iommufd_hw_pagetable_detach (struct iommufd_device * idev , ioasid_t pasid )
529
531
{
530
- struct iommufd_hw_pagetable * hwpt = idev -> igroup -> hwpt ;
532
+ struct iommufd_group * igroup = idev -> igroup ;
533
+ struct iommufd_hw_pagetable * hwpt = igroup -> hwpt ;
531
534
struct iommufd_hwpt_paging * hwpt_paging = find_hwpt_paging (hwpt );
532
535
533
- mutex_lock (& idev -> igroup -> lock );
536
+ mutex_lock (& igroup -> lock );
534
537
list_del (& idev -> group_item );
535
- if (list_empty (& idev -> igroup -> device_list )) {
538
+ if (list_empty (& igroup -> device_list )) {
536
539
iommufd_hwpt_detach_device (hwpt , idev , pasid );
537
- idev -> igroup -> hwpt = NULL ;
540
+ igroup -> hwpt = NULL ;
538
541
}
539
542
if (hwpt_paging && pasid == IOMMU_NO_PASID )
540
543
iopt_remove_reserved_iova (& hwpt_paging -> ioas -> iopt , idev -> dev );
541
- mutex_unlock (& idev -> igroup -> lock );
544
+ mutex_unlock (& igroup -> lock );
542
545
543
546
/* Caller must destroy hwpt */
544
547
return hwpt ;
@@ -610,7 +613,7 @@ iommufd_device_do_replace(struct iommufd_device *idev, ioasid_t pasid,
610
613
unsigned int num_devices ;
611
614
int rc ;
612
615
613
- mutex_lock (& idev -> igroup -> lock );
616
+ mutex_lock (& igroup -> lock );
614
617
615
618
if (igroup -> hwpt == NULL ) {
616
619
rc = - EINVAL ;
@@ -623,7 +626,7 @@ iommufd_device_do_replace(struct iommufd_device *idev, ioasid_t pasid,
623
626
}
624
627
625
628
if (hwpt == igroup -> hwpt ) {
626
- mutex_unlock (& idev -> igroup -> lock );
629
+ mutex_unlock (& igroup -> lock );
627
630
return NULL ;
628
631
}
629
632
@@ -654,15 +657,15 @@ iommufd_device_do_replace(struct iommufd_device *idev, ioasid_t pasid,
654
657
if (num_devices > 1 )
655
658
WARN_ON (refcount_sub_and_test (num_devices - 1 ,
656
659
& old_hwpt -> obj .users ));
657
- mutex_unlock (& idev -> igroup -> lock );
660
+ mutex_unlock (& igroup -> lock );
658
661
659
662
/* Caller must destroy old_hwpt */
660
663
return old_hwpt ;
661
664
err_unresv :
662
665
if (attach_resv )
663
666
iommufd_group_remove_reserved_iova (igroup , hwpt_paging );
664
667
err_unlock :
665
- mutex_unlock (& idev -> igroup -> lock );
668
+ mutex_unlock (& igroup -> lock );
666
669
return ERR_PTR (rc );
667
670
}
668
671
0 commit comments