@@ -448,7 +448,6 @@ EXPORT_SYMBOL_GPL(msi_next_desc);
448
448
unsigned int msi_domain_get_virq (struct device * dev , unsigned int domid , unsigned int index )
449
449
{
450
450
struct msi_desc * desc ;
451
- unsigned int ret = 0 ;
452
451
bool pcimsi = false;
453
452
struct xarray * xa ;
454
453
@@ -462,7 +461,7 @@ unsigned int msi_domain_get_virq(struct device *dev, unsigned int domid, unsigne
462
461
if (dev_is_pci (dev ) && domid == MSI_DEFAULT_DOMAIN )
463
462
pcimsi = to_pci_dev (dev )-> msi_enabled ;
464
463
465
- msi_lock_descs (dev );
464
+ guard ( msi_descs_lock ) (dev );
466
465
xa = & dev -> msi .data -> __domains [domid ].store ;
467
466
desc = xa_load (xa , pcimsi ? 0 : index );
468
467
if (desc && desc -> irq ) {
@@ -471,16 +470,12 @@ unsigned int msi_domain_get_virq(struct device *dev, unsigned int domid, unsigne
471
470
* PCI-MSIX and platform MSI use a descriptor per
472
471
* interrupt.
473
472
*/
474
- if (pcimsi ) {
475
- if (index < desc -> nvec_used )
476
- ret = desc -> irq + index ;
477
- } else {
478
- ret = desc -> irq ;
479
- }
473
+ if (!pcimsi )
474
+ return desc -> irq ;
475
+ if (index < desc -> nvec_used )
476
+ return desc -> irq + index ;
480
477
}
481
-
482
- msi_unlock_descs (dev );
483
- return ret ;
478
+ return 0 ;
484
479
}
485
480
EXPORT_SYMBOL_GPL (msi_domain_get_virq );
486
481
@@ -998,17 +993,17 @@ bool msi_create_device_irq_domain(struct device *dev, unsigned int domid,
998
993
void * chip_data )
999
994
{
1000
995
struct irq_domain * domain , * parent = dev -> msi .domain ;
1001
- struct fwnode_handle * fwnode , * fwnalloced = NULL ;
1002
- struct msi_domain_template * bundle ;
1003
996
const struct msi_parent_ops * pops ;
997
+ struct fwnode_handle * fwnode ;
1004
998
1005
999
if (!irq_domain_is_msi_parent (parent ))
1006
1000
return false;
1007
1001
1008
1002
if (domid >= MSI_MAX_DEVICE_IRQDOMAINS )
1009
1003
return false;
1010
1004
1011
- bundle = kmemdup (template , sizeof (* bundle ), GFP_KERNEL );
1005
+ struct msi_domain_template * bundle __free (kfree ) =
1006
+ kmemdup (template , sizeof (* bundle ), GFP_KERNEL );
1012
1007
if (!bundle )
1013
1008
return false;
1014
1009
@@ -1031,41 +1026,36 @@ bool msi_create_device_irq_domain(struct device *dev, unsigned int domid,
1031
1026
* node as they are not guaranteed to have a fwnode. They are never
1032
1027
* looked up and always handled in the context of the device.
1033
1028
*/
1034
- if (bundle -> info .flags & MSI_FLAG_USE_DEV_FWNODE )
1035
- fwnode = dev -> fwnode ;
1029
+ struct fwnode_handle * fwnode_alloced __free (irq_domain_free_fwnode ) = NULL ;
1030
+
1031
+ if (!(bundle -> info .flags & MSI_FLAG_USE_DEV_FWNODE ))
1032
+ fwnode = fwnode_alloced = irq_domain_alloc_named_fwnode (bundle -> name );
1036
1033
else
1037
- fwnode = fwnalloced = irq_domain_alloc_named_fwnode ( bundle -> name ) ;
1034
+ fwnode = dev -> fwnode ;
1038
1035
1039
1036
if (!fwnode )
1040
- goto free_bundle ;
1037
+ return false ;
1041
1038
1042
1039
if (msi_setup_device_data (dev ))
1043
- goto free_fwnode ;
1044
-
1045
- msi_lock_descs (dev );
1040
+ return false;
1046
1041
1042
+ guard (msi_descs_lock )(dev );
1047
1043
if (WARN_ON_ONCE (msi_get_device_domain (dev , domid )))
1048
- goto fail ;
1044
+ return false ;
1049
1045
1050
1046
if (!pops -> init_dev_msi_info (dev , parent , parent , & bundle -> info ))
1051
- goto fail ;
1047
+ return false ;
1052
1048
1053
1049
domain = __msi_create_irq_domain (fwnode , & bundle -> info , IRQ_DOMAIN_FLAG_MSI_DEVICE , parent );
1054
1050
if (!domain )
1055
- goto fail ;
1051
+ return false ;
1056
1052
1053
+ /* @bundle and @fwnode_alloced are now in use. Prevent cleanup */
1054
+ retain_and_null_ptr (bundle );
1055
+ retain_and_null_ptr (fwnode_alloced );
1057
1056
domain -> dev = dev ;
1058
1057
dev -> msi .data -> __domains [domid ].domain = domain ;
1059
- msi_unlock_descs (dev );
1060
1058
return true;
1061
-
1062
- fail :
1063
- msi_unlock_descs (dev );
1064
- free_fwnode :
1065
- irq_domain_free_fwnode (fwnalloced );
1066
- free_bundle :
1067
- kfree (bundle );
1068
- return false;
1069
1059
}
1070
1060
1071
1061
/**
@@ -1079,12 +1069,10 @@ void msi_remove_device_irq_domain(struct device *dev, unsigned int domid)
1079
1069
struct msi_domain_info * info ;
1080
1070
struct irq_domain * domain ;
1081
1071
1082
- msi_lock_descs (dev );
1083
-
1072
+ guard (msi_descs_lock )(dev );
1084
1073
domain = msi_get_device_domain (dev , domid );
1085
-
1086
1074
if (!domain || !irq_domain_is_msi_device (domain ))
1087
- goto unlock ;
1075
+ return ;
1088
1076
1089
1077
dev -> msi .data -> __domains [domid ].domain = NULL ;
1090
1078
info = domain -> host_data ;
@@ -1093,9 +1081,6 @@ void msi_remove_device_irq_domain(struct device *dev, unsigned int domid)
1093
1081
irq_domain_remove (domain );
1094
1082
irq_domain_free_fwnode (fwnode );
1095
1083
kfree (container_of (info , struct msi_domain_template , info ));
1096
-
1097
- unlock :
1098
- msi_unlock_descs (dev );
1099
1084
}
1100
1085
1101
1086
/**
@@ -1111,16 +1096,14 @@ bool msi_match_device_irq_domain(struct device *dev, unsigned int domid,
1111
1096
{
1112
1097
struct msi_domain_info * info ;
1113
1098
struct irq_domain * domain ;
1114
- bool ret = false;
1115
1099
1116
- msi_lock_descs (dev );
1100
+ guard ( msi_descs_lock ) (dev );
1117
1101
domain = msi_get_device_domain (dev , domid );
1118
1102
if (domain && irq_domain_is_msi_device (domain )) {
1119
1103
info = domain -> host_data ;
1120
- ret = info -> bus_token == bus_token ;
1104
+ return info -> bus_token == bus_token ;
1121
1105
}
1122
- msi_unlock_descs (dev );
1123
- return ret ;
1106
+ return false;
1124
1107
}
1125
1108
1126
1109
static int msi_domain_prepare_irqs (struct irq_domain * domain , struct device * dev ,
@@ -1391,12 +1374,9 @@ int msi_domain_alloc_irqs_range_locked(struct device *dev, unsigned int domid,
1391
1374
int msi_domain_alloc_irqs_range (struct device * dev , unsigned int domid ,
1392
1375
unsigned int first , unsigned int last )
1393
1376
{
1394
- int ret ;
1395
1377
1396
- msi_lock_descs (dev );
1397
- ret = msi_domain_alloc_irqs_range_locked (dev , domid , first , last );
1398
- msi_unlock_descs (dev );
1399
- return ret ;
1378
+ guard (msi_descs_lock )(dev );
1379
+ return msi_domain_alloc_irqs_range_locked (dev , domid , first , last );
1400
1380
}
1401
1381
EXPORT_SYMBOL_GPL (msi_domain_alloc_irqs_range );
1402
1382
@@ -1500,12 +1480,8 @@ struct msi_map msi_domain_alloc_irq_at(struct device *dev, unsigned int domid, u
1500
1480
const struct irq_affinity_desc * affdesc ,
1501
1481
union msi_instance_cookie * icookie )
1502
1482
{
1503
- struct msi_map map ;
1504
-
1505
- msi_lock_descs (dev );
1506
- map = __msi_domain_alloc_irq_at (dev , domid , index , affdesc , icookie );
1507
- msi_unlock_descs (dev );
1508
- return map ;
1483
+ guard (msi_descs_lock )(dev );
1484
+ return __msi_domain_alloc_irq_at (dev , domid , index , affdesc , icookie );
1509
1485
}
1510
1486
1511
1487
/**
@@ -1542,13 +1518,11 @@ int msi_device_domain_alloc_wired(struct irq_domain *domain, unsigned int hwirq,
1542
1518
1543
1519
icookie .value = ((u64 )type << 32 ) | hwirq ;
1544
1520
1545
- msi_lock_descs (dev );
1521
+ guard ( msi_descs_lock ) (dev );
1546
1522
if (WARN_ON_ONCE (msi_get_device_domain (dev , domid ) != domain ))
1547
1523
map .index = - EINVAL ;
1548
1524
else
1549
1525
map = __msi_domain_alloc_irq_at (dev , domid , MSI_ANY_INDEX , NULL , & icookie );
1550
- msi_unlock_descs (dev );
1551
-
1552
1526
return map .index >= 0 ? map .virq : map .index ;
1553
1527
}
1554
1528
@@ -1641,9 +1615,8 @@ void msi_domain_free_irqs_range_locked(struct device *dev, unsigned int domid,
1641
1615
void msi_domain_free_irqs_range (struct device * dev , unsigned int domid ,
1642
1616
unsigned int first , unsigned int last )
1643
1617
{
1644
- msi_lock_descs (dev );
1618
+ guard ( msi_descs_lock ) (dev );
1645
1619
msi_domain_free_irqs_range_locked (dev , domid , first , last );
1646
- msi_unlock_descs (dev );
1647
1620
}
1648
1621
EXPORT_SYMBOL_GPL (msi_domain_free_irqs_all );
1649
1622
@@ -1673,9 +1646,8 @@ void msi_domain_free_irqs_all_locked(struct device *dev, unsigned int domid)
1673
1646
*/
1674
1647
void msi_domain_free_irqs_all (struct device * dev , unsigned int domid )
1675
1648
{
1676
- msi_lock_descs (dev );
1649
+ guard ( msi_descs_lock ) (dev );
1677
1650
msi_domain_free_irqs_all_locked (dev , domid );
1678
- msi_unlock_descs (dev );
1679
1651
}
1680
1652
1681
1653
/**
@@ -1694,12 +1666,11 @@ void msi_device_domain_free_wired(struct irq_domain *domain, unsigned int virq)
1694
1666
if (WARN_ON_ONCE (!dev || !desc || domain -> bus_token != DOMAIN_BUS_WIRED_TO_MSI ))
1695
1667
return ;
1696
1668
1697
- msi_lock_descs (dev );
1698
- if (!WARN_ON_ONCE (msi_get_device_domain (dev , MSI_DEFAULT_DOMAIN ) != domain )) {
1699
- msi_domain_free_irqs_range_locked (dev , MSI_DEFAULT_DOMAIN , desc -> msi_index ,
1700
- desc -> msi_index );
1701
- }
1702
- msi_unlock_descs (dev );
1669
+ guard (msi_descs_lock )(dev );
1670
+ if (WARN_ON_ONCE (msi_get_device_domain (dev , MSI_DEFAULT_DOMAIN ) != domain ))
1671
+ return ;
1672
+ msi_domain_free_irqs_range_locked (dev , MSI_DEFAULT_DOMAIN , desc -> msi_index ,
1673
+ desc -> msi_index );
1703
1674
}
1704
1675
1705
1676
/**
0 commit comments