Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86/hyperv: Refactor hv_msi_domain_free_irqs()

No point in looking up things over and over. Just look up the associated
irq data and work from there.

No functional change.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Wei Liu <wei.liu@kernel.org>
Link: https://lore.kernel.org/r/20211206210224.429625690@linutronix.de

+17 -38
+17 -38
arch/x86/hyperv/irqdomain.c
··· 253 253 return hv_unmap_interrupt(hv_build_pci_dev_id(dev).as_uint64, old_entry); 254 254 } 255 255 256 - static void hv_teardown_msi_irq_common(struct pci_dev *dev, struct msi_desc *msidesc, int irq) 256 + static void hv_teardown_msi_irq(struct pci_dev *dev, struct irq_data *irqd) 257 257 { 258 - u64 status; 259 258 struct hv_interrupt_entry old_entry; 260 - struct irq_desc *desc; 261 - struct irq_data *data; 262 259 struct msi_msg msg; 260 + u64 status; 263 261 264 - desc = irq_to_desc(irq); 265 - if (!desc) { 266 - pr_debug("%s: no irq desc\n", __func__); 267 - return; 268 - } 269 - 270 - data = &desc->irq_data; 271 - if (!data) { 272 - pr_debug("%s: no irq data\n", __func__); 273 - return; 274 - } 275 - 276 - if (!data->chip_data) { 262 + if (!irqd->chip_data) { 277 263 pr_debug("%s: no chip data\n!", __func__); 278 264 return; 279 265 } 280 266 281 - old_entry = *(struct hv_interrupt_entry *)data->chip_data; 267 + old_entry = *(struct hv_interrupt_entry *)irqd->chip_data; 282 268 entry_to_msi_msg(&old_entry, &msg); 283 269 284 - kfree(data->chip_data); 285 - data->chip_data = NULL; 270 + kfree(irqd->chip_data); 271 + irqd->chip_data = NULL; 286 272 287 273 status = hv_unmap_msi_interrupt(dev, &old_entry); 288 274 289 - if (status != HV_STATUS_SUCCESS) { 275 + if (status != HV_STATUS_SUCCESS) 290 276 pr_err("%s: hypercall failed, status %lld\n", __func__, status); 291 - return; 292 - } 293 277 } 294 278 295 - static void hv_msi_domain_free_irqs(struct irq_domain *domain, struct device *dev) 279 + static void hv_msi_free_irq(struct irq_domain *domain, 280 + struct msi_domain_info *info, unsigned int virq) 296 281 { 297 - int i; 298 - struct msi_desc *entry; 299 - struct pci_dev *pdev; 282 + struct irq_data *irqd = irq_get_irq_data(virq); 283 + struct msi_desc *desc; 300 284 301 - if (WARN_ON_ONCE(!dev_is_pci(dev))) 285 + if (!irqd) 302 286 return; 303 287 304 - pdev = to_pci_dev(dev); 288 + desc = irq_data_get_msi_desc(irqd); 289 + if (!desc || !desc->irq || WARN_ON_ONCE(!dev_is_pci(desc->dev))) 290 + return; 305 291 306 - for_each_pci_msi_entry(entry, pdev) { 307 - if (entry->irq) { 308 - for (i = 0; i < entry->nvec_used; i++) { 309 - hv_teardown_msi_irq_common(pdev, entry, entry->irq + i); 310 - irq_domain_free_irqs(entry->irq + i, 1); 311 - } 312 - } 313 - } 292 + hv_teardown_msi_irq(to_pci_dev(desc->dev), irqd); 314 293 } 315 294 316 295 /* ··· 308 329 }; 309 330 310 331 static struct msi_domain_ops pci_msi_domain_ops = { 311 - .domain_free_irqs = hv_msi_domain_free_irqs, 332 + .msi_free = hv_msi_free_irq, 312 333 .msi_prepare = pci_msi_prepare, 313 334 }; 314 335