From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751485AbdFZJ6B (ORCPT ); Mon, 26 Jun 2017 05:58:01 -0400 Received: from regular1.263xmail.com ([211.150.99.138]:38213 "EHLO regular1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751397AbdFZJ5y (ORCPT ); Mon, 26 Jun 2017 05:57:54 -0400 X-263anti-spam: BIG:0; X-MAIL-GRAY: 0 X-MAIL-DELIVERY: 1 X-ADDR-CHECKED4: 1 X-ABS-CHECKED: 1 X-SKE-CHECKED: 1 X-ANTISPAM-LEVEL: 2 X-RL-SENDER: jeffy.chen@rock-chips.com X-FST-TO: tglx@linutronix.de X-SENDER-IP: 103.29.142.67 X-LOGIN-NAME: jeffy.chen@rock-chips.com X-UNIQUE-TAG: <1ec1d77fa3da7b190da0b962ae9210ff> X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 Message-ID: <5950DA92.5050709@rock-chips.com> Date: Mon, 26 Jun 2017 17:57:38 +0800 From: jeffy User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20130126 Thunderbird/19.0 MIME-Version: 1.0 To: Thomas Gleixner CC: linux-kernel@vger.kernel.org, briannorris@chromium.org, dianders@chromium.org, tfiga@chromium.org Subject: Re: [RFC PATCH] genirq: Avoid unnecessary low level irq function calls References: <1498457522-25045-1-git-send-email-jeffy.chen@rock-chips.com> In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Thomas, thanx for your comments. On 06/26/2017 04:20 PM, Thomas Gleixner wrote: > Jeffy, > > On Mon, 26 Jun 2017, Jeffy Chen wrote: >> void irq_enable(struct irq_desc *desc) >> { >> - irq_state_clr_disabled(desc); >> - if (desc->irq_data.chip->irq_enable) >> - desc->irq_data.chip->irq_enable(&desc->irq_data); >> - else >> - desc->irq_data.chip->irq_unmask(&desc->irq_data); >> - irq_state_clr_masked(desc); >> + if (irqd_is_started(&desc->irq_data) && >> + !irqd_irq_disabled(&desc->irq_data)) { >> + unmask_irq(desc); > > I'm having a hard time to understand the logic here. > > if (started && !disabled) > unmask() > > That does not make any sense. If you need that to work around a state > inconsistency then it needs to be addressed there and not worked around > here. right, we already set disabled state in desc_set_defaults, so the disabled state should be consistency here. so just if(!disabled) unmask() else enable() ? and i saw we didn't set masked state in desc_set_defaults, i'll send a patch for that, and remove unmask_irq's started check too. > >> + } else { >> + irq_state_clr_disabled(desc); >> + if (desc->irq_data.chip->irq_enable) { >> + desc->irq_data.chip->irq_enable(&desc->irq_data); >> + irq_state_clr_masked(desc); >> + } else { >> + unmask_irq(desc); >> + } >> + } >> } >> >> static void __irq_disable(struct irq_desc *desc, bool mask) >> { >> - irq_state_set_disabled(desc); >> - if (desc->irq_data.chip->irq_disable) { >> - desc->irq_data.chip->irq_disable(&desc->irq_data); >> - irq_state_set_masked(desc); >> - } else if (mask) { >> - mask_irq(desc); >> + if (irqd_irq_disabled(&desc->irq_data)) { >> + if (mask) >> + mask_irq(desc); >> + } else { >> + irq_state_set_disabled(desc); >> + if (desc->irq_data.chip->irq_disable) { >> + desc->irq_data.chip->irq_disable(&desc->irq_data); >> + irq_state_set_masked(desc); >> + } else if (mask) { >> + mask_irq(desc); >> + } >> } >> } >> >> @@ -311,18 +322,21 @@ void irq_percpu_disable(struct irq_desc *desc, unsigned int cpu) >> >> static inline void mask_ack_irq(struct irq_desc *desc) >> { >> - if (desc->irq_data.chip->irq_mask_ack) >> + if (desc->irq_data.chip->irq_mask_ack) { >> desc->irq_data.chip->irq_mask_ack(&desc->irq_data); >> - else { >> - desc->irq_data.chip->irq_mask(&desc->irq_data); >> + irq_state_set_masked(desc); >> + } else { >> + mask_irq(desc); >> if (desc->irq_data.chip->irq_ack) >> desc->irq_data.chip->irq_ack(&desc->irq_data); >> } >> - irq_state_set_masked(desc); >> } >> >> void mask_irq(struct irq_desc *desc) >> { >> + if (irqd_irq_masked(&desc->irq_data)) >> + return; >> + >> if (desc->irq_data.chip->irq_mask) { >> desc->irq_data.chip->irq_mask(&desc->irq_data); >> irq_state_set_masked(desc); >> @@ -331,6 +345,10 @@ void mask_irq(struct irq_desc *desc) >> >> void unmask_irq(struct irq_desc *desc) >> { >> + if (irqd_is_started(&desc->irq_data) && >> + !irqd_irq_masked(&desc->irq_data)) >> + return; > > Ditto. > > Thanks, > > tglx > > >