@@ -120,7 +120,7 @@ static int msi_add_simple_msi_descs(struct device *dev, unsigned int index, unsi
120
120
fail_mem :
121
121
ret = - ENOMEM ;
122
122
fail :
123
- msi_free_msi_descs_range (dev , MSI_DESC_ALL , index , last );
123
+ msi_free_msi_descs_range (dev , index , last );
124
124
return ret ;
125
125
}
126
126
@@ -141,12 +141,11 @@ static bool msi_desc_match(struct msi_desc *desc, enum msi_desc_filter filter)
141
141
/**
142
142
* msi_free_msi_descs_range - Free MSI descriptors of a device
143
143
* @dev: Device to free the descriptors
144
- * @filter: Descriptor state filter
145
144
* @first_index: Index to start freeing from
146
145
* @last_index: Last index to be freed
147
146
*/
148
- void msi_free_msi_descs_range (struct device * dev , enum msi_desc_filter filter ,
149
- unsigned int first_index , unsigned int last_index )
147
+ void msi_free_msi_descs_range (struct device * dev , unsigned int first_index ,
148
+ unsigned int last_index )
150
149
{
151
150
struct xarray * xa = & dev -> msi .data -> __store ;
152
151
struct msi_desc * desc ;
@@ -155,10 +154,12 @@ void msi_free_msi_descs_range(struct device *dev, enum msi_desc_filter filter,
155
154
lockdep_assert_held (& dev -> msi .data -> mutex );
156
155
157
156
xa_for_each_range (xa , idx , desc , first_index , last_index ) {
158
- if (msi_desc_match (desc , filter )) {
159
- xa_erase (xa , idx );
160
- msi_free_desc (desc );
161
- }
157
+ xa_erase (xa , idx );
158
+
159
+ /* Leak the descriptor when it is still referenced */
160
+ if (WARN_ON_ONCE (msi_desc_match (desc , MSI_DESC_ASSOCIATED )))
161
+ continue ;
162
+ msi_free_desc (desc );
162
163
}
163
164
}
164
165
@@ -739,7 +740,7 @@ int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
739
740
fail :
740
741
for (-- virq ; virq >= virq_base ; virq -- )
741
742
irq_domain_free_irqs_common (domain , virq , 1 );
742
- msi_free_msi_descs_range (dev , MSI_DESC_ALL , virq_base , virq_base + nvec - 1 );
743
+ msi_free_msi_descs_range (dev , virq_base , virq_base + nvec - 1 );
743
744
unlock :
744
745
msi_unlock_descs (dev );
745
746
return ret ;
0 commit comments