Skip to content

Commit 2f2940d

Browse files
committed
genirq/msi: Remove filter from msi_free_descs_free_range()
When a range of descriptors is freed then all of them are not associated to a linux interrupt. Remove the filter and add a warning to the free function. Signed-off-by: Thomas Gleixner <[email protected]> Reviewed-by: Ashok Raj <[email protected]> Reviewed-by: Jason Gunthorpe <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent befd780 commit 2f2940d

File tree

3 files changed

+13
-13
lines changed

3 files changed

+13
-13
lines changed

drivers/base/platform-msi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ void platform_msi_device_domain_free(struct irq_domain *domain, unsigned int vir
325325

326326
msi_lock_descs(data->dev);
327327
irq_domain_free_irqs_common(domain, virq, nr_irqs);
328-
msi_free_msi_descs_range(data->dev, MSI_DESC_ALL, virq, virq + nr_irqs - 1);
328+
msi_free_msi_descs_range(data->dev, virq, virq + nr_irqs - 1);
329329
msi_unlock_descs(data->dev);
330330
}
331331

include/linux/msi.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -247,16 +247,15 @@ static inline void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg)
247247
#endif /* CONFIG_PCI_MSI */
248248

249249
int msi_add_msi_desc(struct device *dev, struct msi_desc *init_desc);
250-
void msi_free_msi_descs_range(struct device *dev, enum msi_desc_filter filter,
251-
unsigned int first_index, unsigned int last_index);
250+
void msi_free_msi_descs_range(struct device *dev, unsigned int first_index, unsigned int last_index);
252251

253252
/**
254253
* msi_free_msi_descs - Free MSI descriptors of a device
255254
* @dev: Device to free the descriptors
256255
*/
257256
static inline void msi_free_msi_descs(struct device *dev)
258257
{
259-
msi_free_msi_descs_range(dev, MSI_DESC_ALL, 0, MSI_MAX_INDEX);
258+
msi_free_msi_descs_range(dev, 0, MSI_MAX_INDEX);
260259
}
261260

262261
void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);

kernel/irq/msi.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ static int msi_add_simple_msi_descs(struct device *dev, unsigned int index, unsi
120120
fail_mem:
121121
ret = -ENOMEM;
122122
fail:
123-
msi_free_msi_descs_range(dev, MSI_DESC_ALL, index, last);
123+
msi_free_msi_descs_range(dev, index, last);
124124
return ret;
125125
}
126126

@@ -141,12 +141,11 @@ static bool msi_desc_match(struct msi_desc *desc, enum msi_desc_filter filter)
141141
/**
142142
* msi_free_msi_descs_range - Free MSI descriptors of a device
143143
* @dev: Device to free the descriptors
144-
* @filter: Descriptor state filter
145144
* @first_index: Index to start freeing from
146145
* @last_index: Last index to be freed
147146
*/
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)
150149
{
151150
struct xarray *xa = &dev->msi.data->__store;
152151
struct msi_desc *desc;
@@ -155,10 +154,12 @@ void msi_free_msi_descs_range(struct device *dev, enum msi_desc_filter filter,
155154
lockdep_assert_held(&dev->msi.data->mutex);
156155

157156
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);
162163
}
163164
}
164165

@@ -739,7 +740,7 @@ int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
739740
fail:
740741
for (--virq; virq >= virq_base; virq--)
741742
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);
743744
unlock:
744745
msi_unlock_descs(dev);
745746
return ret;

0 commit comments

Comments
 (0)