All of lore.kernel.org
 help / color / mirror / Atom feed
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);

  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: link
Be 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.