Message ID | 1497275529-23565-1-git-send-email-daniel.lezcano@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, 12 Jun 2017, Daniel Lezcano wrote: > But, the API request_percpu_irq does not allow to pass a flag, hence specifying > if the interrupt type is a timer. > > Add a function request_percpu_irq_flags() where we can specify the flags. The > request_percpu_irq() function is changed to be a wrapper to > request_percpu_irq_flags() passing a zero flag parameter. And exactly this change wants to be a separate patch. We do not make whole sale changes this way. You should know that already and someone pointed that out to you in some of the earlier versions. > -int request_percpu_irq(unsigned int irq, irq_handler_t handler, > - const char *devname, void __percpu *dev_id) > +int request_percpu_irq_flags(unsigned int irq, irq_handler_t handler, The function name sucks. The first time I read it, it meant request the per cpu irq flags, which is not what you aim at, right? Please make that __request_percpu_irq() for now and on -rc1 time provide a patch set to convert all current request_percpu_irq() users to have the extra argument and then remove the __request_percpu_irq() intermediate. Thanks, tglx
On Tue, Jun 20, 2017 at 04:05:07PM +0200, Thomas Gleixner wrote: > On Mon, 12 Jun 2017, Daniel Lezcano wrote: > > But, the API request_percpu_irq does not allow to pass a flag, hence specifying > > if the interrupt type is a timer. > > > > Add a function request_percpu_irq_flags() where we can specify the flags. The > > request_percpu_irq() function is changed to be a wrapper to > > request_percpu_irq_flags() passing a zero flag parameter. > > And exactly this change wants to be a separate patch. We do not make whole > sale changes this way. You should know that already and someone pointed > that out to you in some of the earlier versions. > > > -int request_percpu_irq(unsigned int irq, irq_handler_t handler, > > - const char *devname, void __percpu *dev_id) > > +int request_percpu_irq_flags(unsigned int irq, irq_handler_t handler, > > The function name sucks. The first time I read it, it meant request the per > cpu irq flags, which is not what you aim at, right? > > Please make that __request_percpu_irq() for now and on -rc1 time provide a > patch set to convert all current request_percpu_irq() users to have the > extra argument and then remove the __request_percpu_irq() intermediate. Ok, I will the change this way. What about 2/3 and 3/3? Is it possible to take them with the __request_percpu_irq change?
On Tue, 20 Jun 2017, Daniel Lezcano wrote: > On Tue, Jun 20, 2017 at 04:05:07PM +0200, Thomas Gleixner wrote: > > On Mon, 12 Jun 2017, Daniel Lezcano wrote: > > > But, the API request_percpu_irq does not allow to pass a flag, hence specifying > > > if the interrupt type is a timer. > > > > > > Add a function request_percpu_irq_flags() where we can specify the flags. The > > > request_percpu_irq() function is changed to be a wrapper to > > > request_percpu_irq_flags() passing a zero flag parameter. > > > > And exactly this change wants to be a separate patch. We do not make whole > > sale changes this way. You should know that already and someone pointed > > that out to you in some of the earlier versions. > > > > > -int request_percpu_irq(unsigned int irq, irq_handler_t handler, > > > - const char *devname, void __percpu *dev_id) > > > +int request_percpu_irq_flags(unsigned int irq, irq_handler_t handler, > > > > The function name sucks. The first time I read it, it meant request the per > > cpu irq flags, which is not what you aim at, right? > > > > Please make that __request_percpu_irq() for now and on -rc1 time provide a > > patch set to convert all current request_percpu_irq() users to have the > > extra argument and then remove the __request_percpu_irq() intermediate. > > Ok, I will the change this way. > > What about 2/3 and 3/3? Is it possible to take them with the > __request_percpu_irq change? The rest looks ok. Please repost.
On 20/06/2017 22:29, Thomas Gleixner wrote: > On Tue, 20 Jun 2017, Daniel Lezcano wrote: >> On Tue, Jun 20, 2017 at 04:05:07PM +0200, Thomas Gleixner wrote: >>> On Mon, 12 Jun 2017, Daniel Lezcano wrote: >>>> But, the API request_percpu_irq does not allow to pass a flag, hence specifying >>>> if the interrupt type is a timer. >>>> >>>> Add a function request_percpu_irq_flags() where we can specify the flags. The >>>> request_percpu_irq() function is changed to be a wrapper to >>>> request_percpu_irq_flags() passing a zero flag parameter. >>> >>> And exactly this change wants to be a separate patch. We do not make whole >>> sale changes this way. You should know that already and someone pointed >>> that out to you in some of the earlier versions. >>> >>>> -int request_percpu_irq(unsigned int irq, irq_handler_t handler, >>>> - const char *devname, void __percpu *dev_id) >>>> +int request_percpu_irq_flags(unsigned int irq, irq_handler_t handler, >>> >>> The function name sucks. The first time I read it, it meant request the per >>> cpu irq flags, which is not what you aim at, right? >>> >>> Please make that __request_percpu_irq() for now and on -rc1 time provide a >>> patch set to convert all current request_percpu_irq() users to have the >>> extra argument and then remove the __request_percpu_irq() intermediate. >> >> Ok, I will the change this way. >> >> What about 2/3 and 3/3? Is it possible to take them with the >> __request_percpu_irq change? > > The rest looks ok. Please repost. Ok, thanks.
diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c index 895ae51..ce9fdcf 100644 --- a/arch/arm/kernel/smp_twd.c +++ b/arch/arm/kernel/smp_twd.c @@ -332,7 +332,8 @@ static int __init twd_local_timer_common_register(struct device_node *np) goto out_free; } - err = request_percpu_irq(twd_ppi, twd_handler, "twd", twd_evt); + err = request_percpu_irq_flags(twd_ppi, twd_handler, IRQF_TIMER, "twd", + twd_evt); if (err) { pr_err("twd: can't register interrupt %d (%d)\n", twd_ppi, err); goto out_free; diff --git a/drivers/clocksource/arc_timer.c b/drivers/clocksource/arc_timer.c index 2164973..66f2632 100644 --- a/drivers/clocksource/arc_timer.c +++ b/drivers/clocksource/arc_timer.c @@ -301,8 +301,8 @@ static int __init arc_clockevent_setup(struct device_node *node) } /* Needs apriori irq_set_percpu_devid() done in intc map function */ - ret = request_percpu_irq(arc_timer_irq, timer_irq_handler, - "Timer0 (per-cpu-tick)", evt); + ret = request_percpu_irq_flags(arc_timer_irq, timer_irq_handler, IRQF_TIMER, + "Timer0 (per-cpu-tick)", evt); if (ret) { pr_err("clockevent: unable to request irq\n"); return ret; diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c index 4bed671..22646b5 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c @@ -980,25 +980,29 @@ static int __init arch_timer_register(void) ppi = arch_timer_ppi[arch_timer_uses_ppi]; switch (arch_timer_uses_ppi) { case ARCH_TIMER_VIRT_PPI: - err = request_percpu_irq(ppi, arch_timer_handler_virt, - "arch_timer", arch_timer_evt); + err = request_percpu_irq_flags(ppi, arch_timer_handler_virt, + IRQF_TIMER, "arch_timer", + arch_timer_evt); break; case ARCH_TIMER_PHYS_SECURE_PPI: case ARCH_TIMER_PHYS_NONSECURE_PPI: - err = request_percpu_irq(ppi, arch_timer_handler_phys, - "arch_timer", arch_timer_evt); + err = request_percpu_irq_flags(ppi, arch_timer_handler_phys, + IRQF_TIMER, "arch_timer", + arch_timer_evt); if (!err && arch_timer_has_nonsecure_ppi()) { ppi = arch_timer_ppi[ARCH_TIMER_PHYS_NONSECURE_PPI]; - err = request_percpu_irq(ppi, arch_timer_handler_phys, - "arch_timer", arch_timer_evt); + err = request_percpu_irq_flags(ppi, arch_timer_handler_phys, + IRQF_TIMER, "arch_timer", + arch_timer_evt); if (err) free_percpu_irq(arch_timer_ppi[ARCH_TIMER_PHYS_SECURE_PPI], arch_timer_evt); } break; case ARCH_TIMER_HYP_PPI: - err = request_percpu_irq(ppi, arch_timer_handler_phys, - "arch_timer", arch_timer_evt); + err = request_percpu_irq_flags(ppi, arch_timer_handler_phys, + IRQF_TIMER, "arch_timer", + arch_timer_evt); break; default: BUG(); diff --git a/drivers/clocksource/arm_global_timer.c b/drivers/clocksource/arm_global_timer.c index 123ed20..5a72ec1 100644 --- a/drivers/clocksource/arm_global_timer.c +++ b/drivers/clocksource/arm_global_timer.c @@ -302,8 +302,8 @@ static int __init global_timer_of_register(struct device_node *np) goto out_clk; } - err = request_percpu_irq(gt_ppi, gt_clockevent_interrupt, - "gt", gt_evt); + err = request_percpu_irq_flags(gt_ppi, gt_clockevent_interrupt, + IRQF_TIMER, "gt", gt_evt); if (err) { pr_warn("global-timer: can't register interrupt %d (%d)\n", gt_ppi, err); diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c index 670ff0f..a48ca0f 100644 --- a/drivers/clocksource/exynos_mct.c +++ b/drivers/clocksource/exynos_mct.c @@ -524,9 +524,10 @@ static int __init exynos4_timer_resources(struct device_node *np, void __iomem * if (mct_int_type == MCT_INT_PPI) { - err = request_percpu_irq(mct_irqs[MCT_L0_IRQ], - exynos4_mct_tick_isr, "MCT", - &percpu_mct_tick); + err = request_percpu_irq_flags(mct_irqs[MCT_L0_IRQ], + exynos4_mct_tick_isr, + IRQF_TIMER, "MCT", + &percpu_mct_tick); WARN(err, "MCT: can't request IRQ %d (%d)\n", mct_irqs[MCT_L0_IRQ], err); } else { diff --git a/drivers/clocksource/qcom-timer.c b/drivers/clocksource/qcom-timer.c index ee358cd..8e876fc 100644 --- a/drivers/clocksource/qcom-timer.c +++ b/drivers/clocksource/qcom-timer.c @@ -174,8 +174,8 @@ static int __init msm_timer_init(u32 dgt_hz, int sched_bits, int irq, } if (percpu) - res = request_percpu_irq(irq, msm_timer_interrupt, - "gp_timer", msm_evt); + res = request_percpu_irq_flags(irq, msm_timer_interrupt, + IRQF_TIMER, "gp_timer", msm_evt); if (res) { pr_err("request_percpu_irq failed\n"); diff --git a/drivers/clocksource/time-armada-370-xp.c b/drivers/clocksource/time-armada-370-xp.c index aea4380..fea81ad 100644 --- a/drivers/clocksource/time-armada-370-xp.c +++ b/drivers/clocksource/time-armada-370-xp.c @@ -309,10 +309,11 @@ static int __init armada_370_xp_timer_common_init(struct device_node *np) /* * Setup clockevent timer (interrupt-driven). */ - res = request_percpu_irq(armada_370_xp_clkevt_irq, - armada_370_xp_timer_interrupt, - "armada_370_xp_per_cpu_tick", - armada_370_xp_evt); + res = request_percpu_irq_flags(armada_370_xp_clkevt_irq, + armada_370_xp_timer_interrupt, + IRQF_TIMER, + "armada_370_xp_per_cpu_tick", + armada_370_xp_evt); /* Immediately configure the timer on the boot CPU */ if (res) { pr_err("Failed to request percpu irq\n"); diff --git a/drivers/clocksource/timer-nps.c b/drivers/clocksource/timer-nps.c index e74ea17..a83b6a4 100644 --- a/drivers/clocksource/timer-nps.c +++ b/drivers/clocksource/timer-nps.c @@ -256,9 +256,9 @@ static int __init nps_setup_clockevent(struct device_node *node) return ret; /* Needs apriori irq_set_percpu_devid() done in intc map function */ - ret = request_percpu_irq(nps_timer0_irq, timer_irq_handler, - "Timer0 (per-cpu-tick)", - &nps_clockevent_device); + ret = request_percpu_irq_flags(nps_timer0_irq, timer_irq_handler, + IRQF_TIMER, "Timer0 (per-cpu-tick)", + &nps_clockevent_device); if (ret) { pr_err("Couldn't request irq\n"); clk_disable_unprepare(clk); diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index a6fba48..89defd5 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h @@ -152,8 +152,17 @@ request_any_context_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev_id); extern int __must_check +request_percpu_irq_flags(unsigned int irq, irq_handler_t handler, + unsigned long flags, const char *devname, + void __percpu *percpu_dev_id); + +static inline int __must_check request_percpu_irq(unsigned int irq, irq_handler_t handler, - const char *devname, void __percpu *percpu_dev_id); + const char *devname, void __percpu *percpu_dev_id) +{ + return request_percpu_irq_flags(irq, handler, 0, + devname, percpu_dev_id); +} extern const void *free_irq(unsigned int, void *); extern void free_percpu_irq(unsigned int, void __percpu *); diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 070be98..057fde8 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -1958,9 +1958,10 @@ int setup_percpu_irq(unsigned int irq, struct irqaction *act) } /** - * request_percpu_irq - allocate a percpu interrupt line + * request_percpu_irq_flags - allocate a percpu interrupt line * @irq: Interrupt line to allocate * @handler: Function to be called when the IRQ occurs. + * @flags: Interrupt type flags (IRQF_TIMER only) * @devname: An ascii name for the claiming device * @dev_id: A percpu cookie passed back to the handler function * @@ -1973,8 +1974,9 @@ int setup_percpu_irq(unsigned int irq, struct irqaction *act) * the handler gets called with the interrupted CPU's instance of * that variable. */ -int request_percpu_irq(unsigned int irq, irq_handler_t handler, - const char *devname, void __percpu *dev_id) +int request_percpu_irq_flags(unsigned int irq, irq_handler_t handler, + unsigned long flags, const char *devname, + void __percpu *dev_id) { struct irqaction *action; struct irq_desc *desc; @@ -1988,12 +1990,15 @@ int request_percpu_irq(unsigned int irq, irq_handler_t handler, !irq_settings_is_per_cpu_devid(desc)) return -EINVAL; + if (flags && flags != IRQF_TIMER) + return -EINVAL; + action = kzalloc(sizeof(struct irqaction), GFP_KERNEL); if (!action) return -ENOMEM; action->handler = handler; - action->flags = IRQF_PERCPU | IRQF_NO_SUSPEND; + action->flags = flags | IRQF_PERCPU | IRQF_NO_SUSPEND; action->name = devname; action->percpu_dev_id = dev_id; @@ -2014,7 +2019,7 @@ int request_percpu_irq(unsigned int irq, irq_handler_t handler, return retval; } -EXPORT_SYMBOL_GPL(request_percpu_irq); +EXPORT_SYMBOL_GPL(request_percpu_irq_flags); /** * irq_get_irqchip_state - returns the irqchip state of a interrupt.