From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964973AbbLHL6o (ORCPT ); Tue, 8 Dec 2015 06:58:44 -0500 Received: from terminus.zytor.com ([198.137.202.10]:54657 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S964930AbbLHL6h (ORCPT ); Tue, 8 Dec 2015 06:58:37 -0500 Date: Tue, 8 Dec 2015 03:57:51 -0800 From: tip-bot for Thomas Petazzoni Message-ID: Cc: sebastian.hesselbarth@gmail.com, andrew@lunn.ch, tawfik@marvell.com, thomas.petazzoni@free-electrons.com, hpa@zytor.com, gregory.clement@free-electrons.com, marc.zyngier@arm.com, jason@lakedaemon.net, tglx@linutronix.de, linux-kernel@vger.kernel.org, nadavh@marvell.com, alior@marvell.com, mingo@kernel.org Reply-To: thomas.petazzoni@free-electrons.com, tawfik@marvell.com, gregory.clement@free-electrons.com, hpa@zytor.com, sebastian.hesselbarth@gmail.com, andrew@lunn.ch, nadavh@marvell.com, mingo@kernel.org, alior@marvell.com, marc.zyngier@arm.com, jason@lakedaemon.net, linux-kernel@vger.kernel.org, tglx@linutronix.de In-Reply-To: <1445347435-2333-2-git-send-email-thomas.petazzoni@free-electrons.com> References: <1445347435-2333-2-git-send-email-thomas.petazzoni@free-electrons.com> To: linux-tip-commits@vger.kernel.org Subject: [tip:irq/core] genirq: Implement irq_percpu_is_enabled() Git-Commit-ID: f0cb32207307e9d7b3ee8117078b7a37f8d0166e X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: f0cb32207307e9d7b3ee8117078b7a37f8d0166e Gitweb: http://git.kernel.org/tip/f0cb32207307e9d7b3ee8117078b7a37f8d0166e Author: Thomas Petazzoni AuthorDate: Tue, 20 Oct 2015 15:23:51 +0200 Committer: Thomas Gleixner CommitDate: Tue, 8 Dec 2015 12:53:29 +0100 genirq: Implement irq_percpu_is_enabled() Certain interrupt controller drivers have a register set that does not make it easy to save/restore the mask of enabled/disabled interrupts at suspend/resume time. At resume time, such drivers rely on the core kernel irq subsystem to tell whether such or such interrupt is enabled or not, in order to restore the proper state in the interrupt controller register. While the irqd_irq_disabled() provides the relevant information for global interrupts, there is no similar function to query the enabled/disabled state of a per-CPU interrupt. Therefore, this commit complements the percpu_irq API with an irq_percpu_is_enabled() function. [ tglx: Simplified the implementation and added kerneldoc ] Signed-off-by: Thomas Petazzoni Cc: linux-arm-kernel@lists.infradead.org Cc: Tawfik Bayouk Cc: Nadav Haklai Cc: Lior Amsalem Cc: Andrew Lunn Cc: Sebastian Hesselbarth Cc: Gregory Clement Cc: Jason Cooper Cc: Marc Zyngier Link: http://lkml.kernel.org/r/1445347435-2333-2-git-send-email-thomas.petazzoni@free-electrons.com Signed-off-by: Thomas Gleixner --- include/linux/interrupt.h | 1 + kernel/irq/manage.c | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index ad16809..cb30edb 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h @@ -195,6 +195,7 @@ extern void disable_irq(unsigned int irq); extern void disable_percpu_irq(unsigned int irq); extern void enable_irq(unsigned int irq); extern void enable_percpu_irq(unsigned int irq, unsigned int type); +extern bool irq_percpu_is_enabled(unsigned int irq); extern void irq_wake_thread(unsigned int irq, void *dev_id); /* The following three functions are for the core kernel use only. */ diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 0eebaee..c84670c 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -1743,6 +1743,31 @@ out: } EXPORT_SYMBOL_GPL(enable_percpu_irq); +/** + * irq_percpu_is_enabled - Check whether the per cpu irq is enabled + * @irq: Linux irq number to check for + * + * Must be called from a non migratable context. Returns the enable + * state of a per cpu interrupt on the current cpu. + */ +bool irq_percpu_is_enabled(unsigned int irq) +{ + unsigned int cpu = smp_processor_id(); + struct irq_desc *desc; + unsigned long flags; + bool is_enabled; + + desc = irq_get_desc_lock(irq, &flags, IRQ_GET_DESC_CHECK_PERCPU); + if (!desc) + return false; + + is_enabled = cpumask_test_cpu(cpu, desc->percpu_enabled); + irq_put_desc_unlock(desc, flags); + + return is_enabled; +} +EXPORT_SYMBOL_GPL(irq_percpu_is_enabled); + void disable_percpu_irq(unsigned int irq) { unsigned int cpu = smp_processor_id();