From: Thomas Gleixner <tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org> To: LKML <linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org> Cc: Heiko Stuebner <heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org>, Julia Cartwright <julia-acOepvfBmUk@public.gmane.org>, Marc Zyngier <marc.zyngier-5wv7dgnIgG8@public.gmane.org>, Linus Walleij <linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>, Brian Norris <briannorris-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>, Doug Anderson <dianders-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>, linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, John Keeping <john-HooS5bfzL4hWk0Htik3J/w@public.gmane.org>, linux-gpio-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Subject: [patch 3/5] genirq: Add mutex to irq desc to serialize request/free_irq() Date: Thu, 29 Jun 2017 23:33:37 +0200 [thread overview] Message-ID: <20170629214344.039220922@linutronix.de> (raw) In-Reply-To: 20170629213334.375848050@linutronix.de [-- Attachment #1: genirq--Add-mutex-to-irq-desc-to-serialize-request-free.patch --] [-- Type: text/plain, Size: 2713 bytes --] The irq_request/release_resources() callbacks ar currently invoked under desc->lock with interrupts disabled. This is a source of problems on RT and conceptually not required. Add a seperate mutex to struct irq_desc which allows to serialize request/free_irq(), which can be used to move the resource functions out of the desc->lock held region. Signed-off-by: Thomas Gleixner <tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org> --- include/linux/irqdesc.h | 3 +++ kernel/irq/irqdesc.c | 1 + kernel/irq/manage.c | 8 ++++++++ 3 files changed, 12 insertions(+) --- a/include/linux/irqdesc.h +++ b/include/linux/irqdesc.h @@ -3,6 +3,7 @@ #include <linux/rcupdate.h> #include <linux/kobject.h> +#include <linux/mutex.h> /* * Core internal functions to deal with irq descriptors @@ -45,6 +46,7 @@ struct pt_regs; * IRQF_FORCE_RESUME set * @rcu: rcu head for delayed free * @kobj: kobject used to represent this struct in sysfs + * @request_mutex: mutex to protect request/free before locking desc->lock * @dir: /proc/irq/ procfs entry * @debugfs_file: dentry for the debugfs file * @name: flow handler name for /proc/interrupts output @@ -96,6 +98,7 @@ struct irq_desc { struct rcu_head rcu; struct kobject kobj; #endif + struct mutex request_mutex; int parent_irq; struct module *owner; const char *name; --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c @@ -373,6 +373,7 @@ static struct irq_desc *alloc_desc(int i raw_spin_lock_init(&desc->lock); lockdep_set_class(&desc->lock, &irq_desc_lock_class); + mutex_init(&desc->request_mutex); init_rcu_head(&desc->rcu); desc_set_defaults(irq, desc, node, affinity, owner); --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -1167,6 +1167,8 @@ static int if (desc->irq_data.chip->flags & IRQCHIP_ONESHOT_SAFE) new->flags &= ~IRQF_ONESHOT; + mutex_lock(&desc->request_mutex); + chip_bus_lock(desc); /* @@ -1350,6 +1352,7 @@ static int raw_spin_unlock_irqrestore(&desc->lock, flags); chip_bus_sync_unlock(desc); + mutex_unlock(&desc->request_mutex); irq_setup_timings(desc, new); @@ -1383,6 +1386,8 @@ static int chip_bus_sync_unlock(desc); + mutex_unlock(&desc->request_mutex); + out_thread: if (new->thread) { struct task_struct *t = new->thread; @@ -1446,6 +1451,7 @@ static struct irqaction *__free_irq(unsi if (!desc) return NULL; + mutex_lock(&desc->request_mutex); chip_bus_lock(desc); raw_spin_lock_irqsave(&desc->lock, flags); @@ -1521,6 +1527,8 @@ static struct irqaction *__free_irq(unsi } } + mutex_unlock(&desc->request_mutex); + irq_chip_pm_put(&desc->irq_data); module_put(desc->owner); kfree(action->secondary);
WARNING: multiple messages have this Message-ID (diff)
From: Thomas Gleixner <tglx@linutronix.de> To: LKML <linux-kernel@vger.kernel.org> Cc: Marc Zyngier <marc.zyngier@arm.com>, Linus Walleij <linus.walleij@linaro.org>, Brian Norris <briannorris@chromium.org>, Heiko Stuebner <heiko@sntech.de>, linux-rockchip@lists.infradead.org, Julia Cartwright <julia@ni.com>, linux-gpio@vger.kernel.org, John Keeping <john@metanate.com>, Doug Anderson <dianders@chromium.org> Subject: [patch 3/5] genirq: Add mutex to irq desc to serialize request/free_irq() Date: Thu, 29 Jun 2017 23:33:37 +0200 [thread overview] Message-ID: <20170629214344.039220922@linutronix.de> (raw) In-Reply-To: 20170629213334.375848050@linutronix.de [-- Attachment #1: genirq--Add-mutex-to-irq-desc-to-serialize-request-free.patch --] [-- Type: text/plain, Size: 2687 bytes --] The irq_request/release_resources() callbacks ar currently invoked under desc->lock with interrupts disabled. This is a source of problems on RT and conceptually not required. Add a seperate mutex to struct irq_desc which allows to serialize request/free_irq(), which can be used to move the resource functions out of the desc->lock held region. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- include/linux/irqdesc.h | 3 +++ kernel/irq/irqdesc.c | 1 + kernel/irq/manage.c | 8 ++++++++ 3 files changed, 12 insertions(+) --- a/include/linux/irqdesc.h +++ b/include/linux/irqdesc.h @@ -3,6 +3,7 @@ #include <linux/rcupdate.h> #include <linux/kobject.h> +#include <linux/mutex.h> /* * Core internal functions to deal with irq descriptors @@ -45,6 +46,7 @@ struct pt_regs; * IRQF_FORCE_RESUME set * @rcu: rcu head for delayed free * @kobj: kobject used to represent this struct in sysfs + * @request_mutex: mutex to protect request/free before locking desc->lock * @dir: /proc/irq/ procfs entry * @debugfs_file: dentry for the debugfs file * @name: flow handler name for /proc/interrupts output @@ -96,6 +98,7 @@ struct irq_desc { struct rcu_head rcu; struct kobject kobj; #endif + struct mutex request_mutex; int parent_irq; struct module *owner; const char *name; --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c @@ -373,6 +373,7 @@ static struct irq_desc *alloc_desc(int i raw_spin_lock_init(&desc->lock); lockdep_set_class(&desc->lock, &irq_desc_lock_class); + mutex_init(&desc->request_mutex); init_rcu_head(&desc->rcu); desc_set_defaults(irq, desc, node, affinity, owner); --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -1167,6 +1167,8 @@ static int if (desc->irq_data.chip->flags & IRQCHIP_ONESHOT_SAFE) new->flags &= ~IRQF_ONESHOT; + mutex_lock(&desc->request_mutex); + chip_bus_lock(desc); /* @@ -1350,6 +1352,7 @@ static int raw_spin_unlock_irqrestore(&desc->lock, flags); chip_bus_sync_unlock(desc); + mutex_unlock(&desc->request_mutex); irq_setup_timings(desc, new); @@ -1383,6 +1386,8 @@ static int chip_bus_sync_unlock(desc); + mutex_unlock(&desc->request_mutex); + out_thread: if (new->thread) { struct task_struct *t = new->thread; @@ -1446,6 +1451,7 @@ static struct irqaction *__free_irq(unsi if (!desc) return NULL; + mutex_lock(&desc->request_mutex); chip_bus_lock(desc); raw_spin_lock_irqsave(&desc->lock, flags); @@ -1521,6 +1527,8 @@ static struct irqaction *__free_irq(unsi } } + mutex_unlock(&desc->request_mutex); + irq_chip_pm_put(&desc->irq_data); module_put(desc->owner); kfree(action->secondary);
next prev parent reply other threads:[~2017-06-29 21:33 UTC|newest] Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-06-29 21:33 [patch 0/5] genirq: Distangle irq_request/release_resources() from irq_desc->lock Thomas Gleixner 2017-06-29 21:33 ` Thomas Gleixner 2017-06-29 21:33 ` [patch 1/5] pinctrl: samsung: Remove bogus irq_[un]mask from resource management Thomas Gleixner 2017-06-29 21:33 ` Thomas Gleixner 2017-06-30 2:47 ` Tomasz Figa 2017-06-30 2:47 ` Tomasz Figa 2017-06-30 2:47 ` Tomasz Figa 2017-06-30 6:02 ` Krzysztof Kozlowski 2017-06-30 6:02 ` Krzysztof Kozlowski 2017-06-30 6:02 ` Krzysztof Kozlowski 2017-06-30 6:20 ` Tomasz Figa 2017-06-30 6:20 ` Tomasz Figa 2017-06-30 6:20 ` Tomasz Figa [not found] ` <20170629214343.882576048-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org> 2017-06-30 12:12 ` Linus Walleij 2017-06-30 12:12 ` Linus Walleij 2017-06-30 12:12 ` Linus Walleij 2017-06-30 12:17 ` Thomas Gleixner 2017-06-30 12:17 ` Thomas Gleixner 2017-06-30 12:17 ` Thomas Gleixner 2017-06-30 13:53 ` Linus Walleij 2017-06-30 13:53 ` Linus Walleij 2017-06-30 13:53 ` Linus Walleij 2017-06-30 14:58 ` Krzysztof Kozlowski 2017-06-30 14:58 ` Krzysztof Kozlowski 2017-06-30 14:58 ` Krzysztof Kozlowski 2017-06-29 21:33 ` [patch 2/5] genirq: Move bus locking into __setup_irq() Thomas Gleixner 2017-07-04 10:48 ` [tip:irq/urgent] " tip-bot for Thomas Gleixner 2017-06-29 21:33 ` Thomas Gleixner [this message] 2017-06-29 21:33 ` [patch 3/5] genirq: Add mutex to irq desc to serialize request/free_irq() Thomas Gleixner 2017-07-04 10:48 ` [tip:irq/urgent] " tip-bot for Thomas Gleixner 2017-06-29 21:33 ` [patch 4/5] genirq: Move irq resource handling out of spinlocked region Thomas Gleixner 2017-07-04 10:49 ` [tip:irq/urgent] " tip-bot for Thomas Gleixner 2017-06-29 21:33 ` [patch 5/5] genirq/timings: Move free timings " Thomas Gleixner 2017-07-04 10:49 ` [tip:irq/urgent] " tip-bot for Thomas Gleixner 2017-06-30 13:49 ` [patch 0/5] genirq: Distangle irq_request/release_resources() from irq_desc->lock Marc Zyngier
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20170629214344.039220922@linutronix.de \ --to=tglx-hfztesqfncyowbw4kg4ksq@public.gmane.org \ --cc=briannorris-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org \ --cc=dianders-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org \ --cc=heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org \ --cc=john-HooS5bfzL4hWk0Htik3J/w@public.gmane.org \ --cc=julia-acOepvfBmUk@public.gmane.org \ --cc=linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \ --cc=linux-gpio-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \ --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \ --cc=linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \ --cc=marc.zyngier-5wv7dgnIgG8@public.gmane.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.