@@ -443,7 +443,6 @@ EXPORT_SYMBOL_GPL(msi_next_desc);
443
443
unsigned int msi_domain_get_virq (struct device * dev , unsigned int domid , unsigned int index )
444
444
{
445
445
struct msi_desc * desc ;
446
- unsigned int ret = 0 ;
447
446
bool pcimsi = false;
448
447
struct xarray * xa ;
449
448
@@ -457,7 +456,7 @@ unsigned int msi_domain_get_virq(struct device *dev, unsigned int domid, unsigne
457
456
if (dev_is_pci (dev ) && domid == MSI_DEFAULT_DOMAIN )
458
457
pcimsi = to_pci_dev (dev )-> msi_enabled ;
459
458
460
- msi_lock_descs (dev );
459
+ guard ( msi_descs_lock ) (dev );
461
460
xa = & dev -> msi .data -> __domains [domid ].store ;
462
461
desc = xa_load (xa , pcimsi ? 0 : index );
463
462
if (desc && desc -> irq ) {
@@ -466,16 +465,12 @@ unsigned int msi_domain_get_virq(struct device *dev, unsigned int domid, unsigne
466
465
* PCI-MSIX and platform MSI use a descriptor per
467
466
* interrupt.
468
467
*/
469
- if (pcimsi ) {
470
- if (index < desc -> nvec_used )
471
- ret = desc -> irq + index ;
472
- } else {
473
- ret = desc -> irq ;
474
- }
468
+ if (!pcimsi )
469
+ return desc -> irq ;
470
+ if (index < desc -> nvec_used )
471
+ return desc -> irq + index ;
475
472
}
476
-
477
- msi_unlock_descs (dev );
478
- return ret ;
473
+ return 0 ;
479
474
}
480
475
EXPORT_SYMBOL_GPL (msi_domain_get_virq );
481
476
@@ -993,17 +988,17 @@ bool msi_create_device_irq_domain(struct device *dev, unsigned int domid,
993
988
void * chip_data )
994
989
{
995
990
struct irq_domain * domain , * parent = dev -> msi .domain ;
996
- struct fwnode_handle * fwnode , * fwnalloced = NULL ;
997
- struct msi_domain_template * bundle ;
998
991
const struct msi_parent_ops * pops ;
992
+ struct fwnode_handle * fwnode ;
999
993
1000
994
if (!irq_domain_is_msi_parent (parent ))
1001
995
return false;
1002
996
1003
997
if (domid >= MSI_MAX_DEVICE_IRQDOMAINS )
1004
998
return false;
1005
999
1006
- bundle = kmemdup (template , sizeof (* bundle ), GFP_KERNEL );
1000
+ struct msi_domain_template * bundle __free (kfree ) =
1001
+ bundle = kmemdup (template , sizeof (* bundle ), GFP_KERNEL );
1007
1002
if (!bundle )
1008
1003
return false;
1009
1004
@@ -1026,41 +1021,36 @@ bool msi_create_device_irq_domain(struct device *dev, unsigned int domid,
1026
1021
* node as they are not guaranteed to have a fwnode. They are never
1027
1022
* looked up and always handled in the context of the device.
1028
1023
*/
1029
- if (bundle -> info .flags & MSI_FLAG_USE_DEV_FWNODE )
1030
- fwnode = dev -> fwnode ;
1024
+ struct fwnode_handle * fwnode_alloced __free (irq_domain_free_fwnode ) = NULL ;
1025
+
1026
+ if (!(bundle -> info .flags & MSI_FLAG_USE_DEV_FWNODE ))
1027
+ fwnode = fwnode_alloced = irq_domain_alloc_named_fwnode (bundle -> name );
1031
1028
else
1032
- fwnode = fwnalloced = irq_domain_alloc_named_fwnode ( bundle -> name ) ;
1029
+ fwnode = dev -> fwnode ;
1033
1030
1034
1031
if (!fwnode )
1035
- goto free_bundle ;
1032
+ return false ;
1036
1033
1037
1034
if (msi_setup_device_data (dev ))
1038
- goto free_fwnode ;
1039
-
1040
- msi_lock_descs (dev );
1035
+ return false;
1041
1036
1037
+ guard (msi_descs_lock )(dev );
1042
1038
if (WARN_ON_ONCE (msi_get_device_domain (dev , domid )))
1043
- goto fail ;
1039
+ return false ;
1044
1040
1045
1041
if (!pops -> init_dev_msi_info (dev , parent , parent , & bundle -> info ))
1046
- goto fail ;
1042
+ return false ;
1047
1043
1048
1044
domain = __msi_create_irq_domain (fwnode , & bundle -> info , IRQ_DOMAIN_FLAG_MSI_DEVICE , parent );
1049
1045
if (!domain )
1050
- goto fail ;
1046
+ return false ;
1051
1047
1048
+ /* @bundle and @fwnode_alloced are now in use. Prevent cleanup */
1049
+ retain_ptr (bundle );
1050
+ retain_ptr (fwnode_alloced );
1052
1051
domain -> dev = dev ;
1053
1052
dev -> msi .data -> __domains [domid ].domain = domain ;
1054
- msi_unlock_descs (dev );
1055
1053
return true;
1056
-
1057
- fail :
1058
- msi_unlock_descs (dev );
1059
- free_fwnode :
1060
- irq_domain_free_fwnode (fwnalloced );
1061
- free_bundle :
1062
- kfree (bundle );
1063
- return false;
1064
1054
}
1065
1055
1066
1056
/**
@@ -1074,12 +1064,10 @@ void msi_remove_device_irq_domain(struct device *dev, unsigned int domid)
1074
1064
struct msi_domain_info * info ;
1075
1065
struct irq_domain * domain ;
1076
1066
1077
- msi_lock_descs (dev );
1078
-
1067
+ guard (msi_descs_lock )(dev );
1079
1068
domain = msi_get_device_domain (dev , domid );
1080
-
1081
1069
if (!domain || !irq_domain_is_msi_device (domain ))
1082
- goto unlock ;
1070
+ return ;
1083
1071
1084
1072
dev -> msi .data -> __domains [domid ].domain = NULL ;
1085
1073
info = domain -> host_data ;
@@ -1088,9 +1076,6 @@ void msi_remove_device_irq_domain(struct device *dev, unsigned int domid)
1088
1076
irq_domain_remove (domain );
1089
1077
irq_domain_free_fwnode (fwnode );
1090
1078
kfree (container_of (info , struct msi_domain_template , info ));
1091
-
1092
- unlock :
1093
- msi_unlock_descs (dev );
1094
1079
}
1095
1080
1096
1081
/**
@@ -1106,16 +1091,14 @@ bool msi_match_device_irq_domain(struct device *dev, unsigned int domid,
1106
1091
{
1107
1092
struct msi_domain_info * info ;
1108
1093
struct irq_domain * domain ;
1109
- bool ret = false;
1110
1094
1111
- msi_lock_descs (dev );
1095
+ guard ( msi_descs_lock ) (dev );
1112
1096
domain = msi_get_device_domain (dev , domid );
1113
1097
if (domain && irq_domain_is_msi_device (domain )) {
1114
1098
info = domain -> host_data ;
1115
- ret = info -> bus_token == bus_token ;
1099
+ return info -> bus_token == bus_token ;
1116
1100
}
1117
- msi_unlock_descs (dev );
1118
- return ret ;
1101
+ return false;
1119
1102
}
1120
1103
1121
1104
static int msi_domain_prepare_irqs (struct irq_domain * domain , struct device * dev ,
@@ -1365,12 +1348,9 @@ int msi_domain_alloc_irqs_range(struct device *dev, unsigned int domid,
1365
1348
.last = last ,
1366
1349
.nirqs = last + 1 - first ,
1367
1350
};
1368
- int ret ;
1369
1351
1370
- msi_lock_descs (dev );
1371
- ret = msi_domain_alloc_locked (dev , & ctrl );
1372
- msi_unlock_descs (dev );
1373
- return ret ;
1352
+ guard (msi_descs_lock )(dev );
1353
+ return msi_domain_alloc_locked (dev , & ctrl );
1374
1354
}
1375
1355
EXPORT_SYMBOL_GPL (msi_domain_alloc_irqs_range );
1376
1356
@@ -1474,12 +1454,8 @@ struct msi_map msi_domain_alloc_irq_at(struct device *dev, unsigned int domid, u
1474
1454
const struct irq_affinity_desc * affdesc ,
1475
1455
union msi_instance_cookie * icookie )
1476
1456
{
1477
- struct msi_map map ;
1478
-
1479
- msi_lock_descs (dev );
1480
- map = __msi_domain_alloc_irq_at (dev , domid , index , affdesc , icookie );
1481
- msi_unlock_descs (dev );
1482
- return map ;
1457
+ guard (msi_descs_lock )(dev );
1458
+ return __msi_domain_alloc_irq_at (dev , domid , index , affdesc , icookie );
1483
1459
}
1484
1460
1485
1461
/**
@@ -1516,13 +1492,11 @@ int msi_device_domain_alloc_wired(struct irq_domain *domain, unsigned int hwirq,
1516
1492
1517
1493
icookie .value = ((u64 )type << 32 ) | hwirq ;
1518
1494
1519
- msi_lock_descs (dev );
1495
+ guard ( msi_descs_lock ) (dev );
1520
1496
if (WARN_ON_ONCE (msi_get_device_domain (dev , domid ) != domain ))
1521
1497
map .index = - EINVAL ;
1522
1498
else
1523
1499
map = __msi_domain_alloc_irq_at (dev , domid , MSI_ANY_INDEX , NULL , & icookie );
1524
- msi_unlock_descs (dev );
1525
-
1526
1500
return map .index >= 0 ? map .virq : map .index ;
1527
1501
}
1528
1502
@@ -1615,9 +1589,8 @@ static void msi_domain_free_irqs_range_locked(struct device *dev, unsigned int d
1615
1589
void msi_domain_free_irqs_range (struct device * dev , unsigned int domid ,
1616
1590
unsigned int first , unsigned int last )
1617
1591
{
1618
- msi_lock_descs (dev );
1592
+ guard ( msi_descs_lock ) (dev );
1619
1593
msi_domain_free_irqs_range_locked (dev , domid , first , last );
1620
- msi_unlock_descs (dev );
1621
1594
}
1622
1595
EXPORT_SYMBOL_GPL (msi_domain_free_irqs_all );
1623
1596
@@ -1647,9 +1620,8 @@ void msi_domain_free_irqs_all_locked(struct device *dev, unsigned int domid)
1647
1620
*/
1648
1621
void msi_domain_free_irqs_all (struct device * dev , unsigned int domid )
1649
1622
{
1650
- msi_lock_descs (dev );
1623
+ guard ( msi_descs_lock ) (dev );
1651
1624
msi_domain_free_irqs_all_locked (dev , domid );
1652
- msi_unlock_descs (dev );
1653
1625
}
1654
1626
1655
1627
/**
@@ -1668,12 +1640,11 @@ void msi_device_domain_free_wired(struct irq_domain *domain, unsigned int virq)
1668
1640
if (WARN_ON_ONCE (!dev || !desc || domain -> bus_token != DOMAIN_BUS_WIRED_TO_MSI ))
1669
1641
return ;
1670
1642
1671
- msi_lock_descs (dev );
1672
- if (!WARN_ON_ONCE (msi_get_device_domain (dev , MSI_DEFAULT_DOMAIN ) != domain )) {
1673
- msi_domain_free_irqs_range_locked (dev , MSI_DEFAULT_DOMAIN , desc -> msi_index ,
1674
- desc -> msi_index );
1675
- }
1676
- msi_unlock_descs (dev );
1643
+ guard (msi_descs_lock )(dev );
1644
+ if (WARN_ON_ONCE (msi_get_device_domain (dev , MSI_DEFAULT_DOMAIN ) != domain ))
1645
+ return ;
1646
+ msi_domain_free_irqs_range_locked (dev , MSI_DEFAULT_DOMAIN , desc -> msi_index ,
1647
+ desc -> msi_index );
1677
1648
}
1678
1649
1679
1650
/**
0 commit comments