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

Configure Feed

Select the types of activity you want to include in your feed.

genirq/chip: Change irq_chip_pm_put() return type to void

The irq_chip_pm_put() return value is only used in __irq_do_set_handler()
to trigger a WARN_ON() if it is negative, but doing so is not useful
because irq_chip_pm_put() simply passes the pm_runtime_put() return value
to its callers.

Returning an error code from pm_runtime_put() merely means that it has
not queued up a work item to check whether or not the device can be
suspended and there are many perfectly valid situations in which that
can happen, like after writing "on" to the devices' runtime PM "control"
attribute in sysfs for one example.

For this reason, modify irq_chip_pm_put() to discard the pm_runtime_put()
return value, change its return type to void, and drop the WARN_ON()
around the irq_chip_pm_put() invocation from __irq_do_set_handler().
Also update the irq_chip_pm_put() kerneldoc comment to be more accurate.

This will facilitate a planned change of the pm_runtime_put() return
type to void in the future.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Thomas Gleixner <tglx@kernel.org>
Link: https://patch.msgid.link/5075294.31r3eYUQgx@rafael.j.wysocki

+12 -12
+1 -1
include/linux/irq.h
··· 658 658 659 659 extern int irq_chip_compose_msi_msg(struct irq_data *data, struct msi_msg *msg); 660 660 extern int irq_chip_pm_get(struct irq_data *data); 661 - extern int irq_chip_pm_put(struct irq_data *data); 661 + extern void irq_chip_pm_put(struct irq_data *data); 662 662 #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY 663 663 extern void handle_fasteoi_ack_irq(struct irq_desc *desc); 664 664 extern void handle_fasteoi_mask_irq(struct irq_desc *desc);
+11 -11
kernel/irq/chip.c
··· 974 974 irq_state_set_disabled(desc); 975 975 if (is_chained) { 976 976 desc->action = NULL; 977 - WARN_ON(irq_chip_pm_put(irq_desc_get_irq_data(desc))); 977 + irq_chip_pm_put(irq_desc_get_irq_data(desc)); 978 978 } 979 979 desc->depth = 1; 980 980 } ··· 1530 1530 } 1531 1531 1532 1532 /** 1533 - * irq_chip_pm_put - Disable power for an IRQ chip 1533 + * irq_chip_pm_put - Drop a PM reference on an IRQ chip 1534 1534 * @data: Pointer to interrupt specific data 1535 1535 * 1536 - * Disable the power to the IRQ chip referenced by the interrupt data 1537 - * structure, belongs. Note that power will only be disabled, once this 1538 - * function has been called for all IRQs that have called irq_chip_pm_get(). 1536 + * Drop a power management reference, acquired via irq_chip_pm_get(), on the IRQ 1537 + * chip represented by the interrupt data structure. 1538 + * 1539 + * Note that this will not disable power to the IRQ chip until this function 1540 + * has been called for all IRQs that have called irq_chip_pm_get() and it may 1541 + * not disable power at all (if user space prevents that, for example). 1539 1542 */ 1540 - int irq_chip_pm_put(struct irq_data *data) 1543 + void irq_chip_pm_put(struct irq_data *data) 1541 1544 { 1542 1545 struct device *dev = irq_get_pm_device(data); 1543 - int retval = 0; 1544 1546 1545 - if (IS_ENABLED(CONFIG_PM) && dev) 1546 - retval = pm_runtime_put(dev); 1547 - 1548 - return (retval < 0) ? retval : 0; 1547 + if (dev) 1548 + pm_runtime_put(dev); 1549 1549 }