All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] convert to use generic irq handler
@ 2015-09-25 19:28 ` Grygorii Strashko
  0 siblings, 0 replies; 21+ messages in thread
From: Grygorii Strashko @ 2015-09-25 19:28 UTC (permalink / raw)
  To: Linus Walleij, Alexandre Courbot, ssantosh, tony
  Cc: linux-omap, Austin Schuh, philipp, linux-rt-users, linux-gpio,
	linux-kernel, Grygorii Strashko

This patch series contains patches which fixes wrong APIs usage in atomic
context on RT-kernel. The final goal is to make TI OMAP GPIO driver
compatible with -RT kernel as much as possible.

Patch 1: required to be compatible with -RT kernel, because PM runtime's
irq_safe mode is incompatible with -RT.
Patch 2: This patch converts TI OMAP GPIO driver to use generic irq
 handler instead of chained IRQ handler. This way OMAP GPIO driver will be
 compatible with RT-kernel where it will be forced thread IRQ handler
 while in non-RT kernel it still will be executed in HW IRQ context.

Boot, basic gpio functionality tested on:
 dra7-evm, BeagleBone(white), am43xx-gpevm, am437x-sk
Manually tested on dra7-evm including suspend/resume and wakeup.

Links on RFC:
 https://lkml.org/lkml/2015/8/18/161
 https://lkml.org/lkml/2015/8/18/162

Grygorii Strashko (2):
  gpio: omap: move pm runtime in irq_chip.irq_bus_lock/sync_unlock
  gpio: omap: convert to use generic irq handler

 drivers/gpio/gpio-omap.c | 80 +++++++++++++++++++++++++-----------------------
 1 file changed, 42 insertions(+), 38 deletions(-)

-- 
2.5.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH 0/2] convert to use generic irq handler
@ 2015-09-25 19:28 ` Grygorii Strashko
  0 siblings, 0 replies; 21+ messages in thread
From: Grygorii Strashko @ 2015-09-25 19:28 UTC (permalink / raw)
  To: Linus Walleij, Alexandre Courbot, ssantosh, tony
  Cc: linux-omap, Austin Schuh, philipp, linux-rt-users, linux-gpio,
	linux-kernel, Grygorii Strashko

This patch series contains patches which fixes wrong APIs usage in atomic
context on RT-kernel. The final goal is to make TI OMAP GPIO driver
compatible with -RT kernel as much as possible.

Patch 1: required to be compatible with -RT kernel, because PM runtime's
irq_safe mode is incompatible with -RT.
Patch 2: This patch converts TI OMAP GPIO driver to use generic irq
 handler instead of chained IRQ handler. This way OMAP GPIO driver will be
 compatible with RT-kernel where it will be forced thread IRQ handler
 while in non-RT kernel it still will be executed in HW IRQ context.

Boot, basic gpio functionality tested on:
 dra7-evm, BeagleBone(white), am43xx-gpevm, am437x-sk
Manually tested on dra7-evm including suspend/resume and wakeup.

Links on RFC:
 https://lkml.org/lkml/2015/8/18/161
 https://lkml.org/lkml/2015/8/18/162

Grygorii Strashko (2):
  gpio: omap: move pm runtime in irq_chip.irq_bus_lock/sync_unlock
  gpio: omap: convert to use generic irq handler

 drivers/gpio/gpio-omap.c | 80 +++++++++++++++++++++++++-----------------------
 1 file changed, 42 insertions(+), 38 deletions(-)

-- 
2.5.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH 1/2] gpio: omap: move pm runtime in irq_chip.irq_bus_lock/sync_unlock
  2015-09-25 19:28 ` Grygorii Strashko
@ 2015-09-25 19:28   ` Grygorii Strashko
  -1 siblings, 0 replies; 21+ messages in thread
From: Grygorii Strashko @ 2015-09-25 19:28 UTC (permalink / raw)
  To: Linus Walleij, Alexandre Courbot, ssantosh, tony
  Cc: linux-omap, Austin Schuh, philipp, linux-rt-users, linux-gpio,
	linux-kernel, Grygorii Strashko

The PM runtime API can't be used in atomic contex on -RT even if
it's configured as irqsafe. As result, below error report can
be seen when PM runtime API called from IRQ chip's callbacks
irq_startup/irq_shutdown/irq_set_type, because they are
protected by RAW spinlock:

BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:917
in_atomic(): 1, irqs_disabled(): 128, pid: 96, name: insmod
3 locks held by insmod/96:
 #0:  (&dev->mutex){......}, at: [<c04752c8>] __driver_attach+0x54/0xa0
 #1:  (&dev->mutex){......}, at: [<c04752d4>] __driver_attach+0x60/0xa0
 #2:  (class){......}, at: [<c00a408c>] __irq_get_desc_lock+0x60/0xa4
irq event stamp: 1834
hardirqs last  enabled at (1833): [<c06ab2a4>] _raw_spin_unlock_irqrestore+0x88/0x90
hardirqs last disabled at (1834): [<c06ab068>] _raw_spin_lock_irqsave+0x2c/0x64
softirqs last  enabled at (0): [<c003d220>] copy_process.part.52+0x410/0x19d8
softirqs last disabled at (0): [<  (null)>]   (null)
Preemption disabled at:[<  (null)>]   (null)

CPU: 1 PID: 96 Comm: insmod Tainted: G        W  O    4.1.3-rt3-00618-g57e2387-dirty #184
Hardware name: Generic DRA74X (Flattened Device Tree)
[<c00190f4>] (unwind_backtrace) from [<c0014734>] (show_stack+0x20/0x24)
[<c0014734>] (show_stack) from [<c06a62ec>] (dump_stack+0x88/0xdc)
[<c06a62ec>] (dump_stack) from [<c006ca44>] (___might_sleep+0x198/0x2a8)
[<c006ca44>] (___might_sleep) from [<c06ab6d4>] (rt_spin_lock+0x30/0x70)
[<c06ab6d4>] (rt_spin_lock) from [<c04815ac>] (__pm_runtime_resume+0x68/0xa4)
[<c04815ac>] (__pm_runtime_resume) from [<c04123f4>] (omap_gpio_irq_type+0x188/0x1d8)
[<c04123f4>] (omap_gpio_irq_type) from [<c00a64e4>] (__irq_set_trigger+0x68/0x130)
[<c00a64e4>] (__irq_set_trigger) from [<c00a7bc4>] (irq_set_irq_type+0x44/0x6c)
[<c00a7bc4>] (irq_set_irq_type) from [<c00abbf8>] (irq_create_of_mapping+0x120/0x174)
[<c00abbf8>] (irq_create_of_mapping) from [<c0577b74>] (of_irq_get+0x48/0x58)
[<c0577b74>] (of_irq_get) from [<c0540a14>] (i2c_device_probe+0x54/0x15c)
[<c0540a14>] (i2c_device_probe) from [<c04750dc>] (driver_probe_device+0x184/0x2c8)
[<c04750dc>] (driver_probe_device) from [<c0475310>] (__driver_attach+0x9c/0xa0)
[<c0475310>] (__driver_attach) from [<c0473238>] (bus_for_each_dev+0x7c/0xb0)
[<c0473238>] (bus_for_each_dev) from [<c0474af4>] (driver_attach+0x28/0x30)
[<c0474af4>] (driver_attach) from [<c0474760>] (bus_add_driver+0x154/0x200)
[<c0474760>] (bus_add_driver) from [<c0476348>] (driver_register+0x88/0x108)
[<c0476348>] (driver_register) from [<c0541600>] (i2c_register_driver+0x3c/0x90)
[<c0541600>] (i2c_register_driver) from [<bf003018>] (pcf857x_init+0x18/0x24 [gpio_pcf857x])
[<bf003018>] (pcf857x_init [gpio_pcf857x]) from [<c000998c>] (do_one_initcall+0x128/0x1e8)
[<c000998c>] (do_one_initcall) from [<c06a4220>] (do_init_module+0x6c/0x1bc)
[<c06a4220>] (do_init_module) from [<c00dd0c8>] (load_module+0x18e8/0x21c4)
[<c00dd0c8>] (load_module) from [<c00ddaa0>] (SyS_init_module+0xfc/0x158)
[<c00ddaa0>] (SyS_init_module) from [<c000ff40>] (ret_fast_syscall+0x0/0x54)

The IRQ chip interface defines only two callbacks which are executed in
non-atomic contex - irq_bus_lock/irq_bus_sync_unlock, so lets move
PM runtime calls there.

Tested-by: Tony Lindgren <tony@atomide.com>
Tested-by: Austin Schuh <austin@peloton-tech.com>
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
---
 drivers/gpio/gpio-omap.c | 25 +++++++++++++++----------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 5236db1..a254691 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -496,9 +496,6 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned type)
 		(type & (IRQ_TYPE_LEVEL_LOW|IRQ_TYPE_LEVEL_HIGH)))
 		return -EINVAL;
 
-	if (!BANK_USED(bank))
-		pm_runtime_get_sync(bank->dev);
-
 	raw_spin_lock_irqsave(&bank->lock, flags);
 	retval = omap_set_gpio_triggering(bank, offset, type);
 	if (retval) {
@@ -521,8 +518,6 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned type)
 	return 0;
 
 error:
-	if (!BANK_USED(bank))
-		pm_runtime_put(bank->dev);
 	return retval;
 }
 
@@ -797,9 +792,6 @@ static unsigned int omap_gpio_irq_startup(struct irq_data *d)
 	unsigned long flags;
 	unsigned offset = d->hwirq;
 
-	if (!BANK_USED(bank))
-		pm_runtime_get_sync(bank->dev);
-
 	raw_spin_lock_irqsave(&bank->lock, flags);
 
 	if (!LINE_USED(bank->mod_usage, offset))
@@ -815,8 +807,6 @@ static unsigned int omap_gpio_irq_startup(struct irq_data *d)
 	return 0;
 err:
 	raw_spin_unlock_irqrestore(&bank->lock, flags);
-	if (!BANK_USED(bank))
-		pm_runtime_put(bank->dev);
 	return -EINVAL;
 }
 
@@ -835,6 +825,19 @@ static void omap_gpio_irq_shutdown(struct irq_data *d)
 		omap_clear_gpio_debounce(bank, offset);
 	omap_disable_gpio_module(bank, offset);
 	raw_spin_unlock_irqrestore(&bank->lock, flags);
+}
+
+static void omap_gpio_irq_bus_lock(struct irq_data *data)
+{
+	struct gpio_bank *bank = omap_irq_data_get_bank(data);
+
+	if (!BANK_USED(bank))
+		pm_runtime_get_sync(bank->dev);
+}
+
+static void gpio_irq_bus_sync_unlock(struct irq_data *data)
+{
+	struct gpio_bank *bank = omap_irq_data_get_bank(data);
 
 	/*
 	 * If this is the last IRQ to be freed in the bank,
@@ -1183,6 +1186,8 @@ static int omap_gpio_probe(struct platform_device *pdev)
 	irqc->irq_unmask = omap_gpio_unmask_irq,
 	irqc->irq_set_type = omap_gpio_irq_type,
 	irqc->irq_set_wake = omap_gpio_wake_enable,
+	irqc->irq_bus_lock = omap_gpio_irq_bus_lock,
+	irqc->irq_bus_sync_unlock = gpio_irq_bus_sync_unlock,
 	irqc->name = dev_name(&pdev->dev);
 
 	bank->irq = platform_get_irq(pdev, 0);
-- 
2.5.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 1/2] gpio: omap: move pm runtime in irq_chip.irq_bus_lock/sync_unlock
@ 2015-09-25 19:28   ` Grygorii Strashko
  0 siblings, 0 replies; 21+ messages in thread
From: Grygorii Strashko @ 2015-09-25 19:28 UTC (permalink / raw)
  To: Linus Walleij, Alexandre Courbot, ssantosh, tony
  Cc: linux-omap, Austin Schuh, philipp, linux-rt-users, linux-gpio,
	linux-kernel, Grygorii Strashko

The PM runtime API can't be used in atomic contex on -RT even if
it's configured as irqsafe. As result, below error report can
be seen when PM runtime API called from IRQ chip's callbacks
irq_startup/irq_shutdown/irq_set_type, because they are
protected by RAW spinlock:

BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:917
in_atomic(): 1, irqs_disabled(): 128, pid: 96, name: insmod
3 locks held by insmod/96:
 #0:  (&dev->mutex){......}, at: [<c04752c8>] __driver_attach+0x54/0xa0
 #1:  (&dev->mutex){......}, at: [<c04752d4>] __driver_attach+0x60/0xa0
 #2:  (class){......}, at: [<c00a408c>] __irq_get_desc_lock+0x60/0xa4
irq event stamp: 1834
hardirqs last  enabled at (1833): [<c06ab2a4>] _raw_spin_unlock_irqrestore+0x88/0x90
hardirqs last disabled at (1834): [<c06ab068>] _raw_spin_lock_irqsave+0x2c/0x64
softirqs last  enabled at (0): [<c003d220>] copy_process.part.52+0x410/0x19d8
softirqs last disabled at (0): [<  (null)>]   (null)
Preemption disabled at:[<  (null)>]   (null)

CPU: 1 PID: 96 Comm: insmod Tainted: G        W  O    4.1.3-rt3-00618-g57e2387-dirty #184
Hardware name: Generic DRA74X (Flattened Device Tree)
[<c00190f4>] (unwind_backtrace) from [<c0014734>] (show_stack+0x20/0x24)
[<c0014734>] (show_stack) from [<c06a62ec>] (dump_stack+0x88/0xdc)
[<c06a62ec>] (dump_stack) from [<c006ca44>] (___might_sleep+0x198/0x2a8)
[<c006ca44>] (___might_sleep) from [<c06ab6d4>] (rt_spin_lock+0x30/0x70)
[<c06ab6d4>] (rt_spin_lock) from [<c04815ac>] (__pm_runtime_resume+0x68/0xa4)
[<c04815ac>] (__pm_runtime_resume) from [<c04123f4>] (omap_gpio_irq_type+0x188/0x1d8)
[<c04123f4>] (omap_gpio_irq_type) from [<c00a64e4>] (__irq_set_trigger+0x68/0x130)
[<c00a64e4>] (__irq_set_trigger) from [<c00a7bc4>] (irq_set_irq_type+0x44/0x6c)
[<c00a7bc4>] (irq_set_irq_type) from [<c00abbf8>] (irq_create_of_mapping+0x120/0x174)
[<c00abbf8>] (irq_create_of_mapping) from [<c0577b74>] (of_irq_get+0x48/0x58)
[<c0577b74>] (of_irq_get) from [<c0540a14>] (i2c_device_probe+0x54/0x15c)
[<c0540a14>] (i2c_device_probe) from [<c04750dc>] (driver_probe_device+0x184/0x2c8)
[<c04750dc>] (driver_probe_device) from [<c0475310>] (__driver_attach+0x9c/0xa0)
[<c0475310>] (__driver_attach) from [<c0473238>] (bus_for_each_dev+0x7c/0xb0)
[<c0473238>] (bus_for_each_dev) from [<c0474af4>] (driver_attach+0x28/0x30)
[<c0474af4>] (driver_attach) from [<c0474760>] (bus_add_driver+0x154/0x200)
[<c0474760>] (bus_add_driver) from [<c0476348>] (driver_register+0x88/0x108)
[<c0476348>] (driver_register) from [<c0541600>] (i2c_register_driver+0x3c/0x90)
[<c0541600>] (i2c_register_driver) from [<bf003018>] (pcf857x_init+0x18/0x24 [gpio_pcf857x])
[<bf003018>] (pcf857x_init [gpio_pcf857x]) from [<c000998c>] (do_one_initcall+0x128/0x1e8)
[<c000998c>] (do_one_initcall) from [<c06a4220>] (do_init_module+0x6c/0x1bc)
[<c06a4220>] (do_init_module) from [<c00dd0c8>] (load_module+0x18e8/0x21c4)
[<c00dd0c8>] (load_module) from [<c00ddaa0>] (SyS_init_module+0xfc/0x158)
[<c00ddaa0>] (SyS_init_module) from [<c000ff40>] (ret_fast_syscall+0x0/0x54)

The IRQ chip interface defines only two callbacks which are executed in
non-atomic contex - irq_bus_lock/irq_bus_sync_unlock, so lets move
PM runtime calls there.

Tested-by: Tony Lindgren <tony@atomide.com>
Tested-by: Austin Schuh <austin@peloton-tech.com>
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
---
 drivers/gpio/gpio-omap.c | 25 +++++++++++++++----------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 5236db1..a254691 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -496,9 +496,6 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned type)
 		(type & (IRQ_TYPE_LEVEL_LOW|IRQ_TYPE_LEVEL_HIGH)))
 		return -EINVAL;
 
-	if (!BANK_USED(bank))
-		pm_runtime_get_sync(bank->dev);
-
 	raw_spin_lock_irqsave(&bank->lock, flags);
 	retval = omap_set_gpio_triggering(bank, offset, type);
 	if (retval) {
@@ -521,8 +518,6 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned type)
 	return 0;
 
 error:
-	if (!BANK_USED(bank))
-		pm_runtime_put(bank->dev);
 	return retval;
 }
 
@@ -797,9 +792,6 @@ static unsigned int omap_gpio_irq_startup(struct irq_data *d)
 	unsigned long flags;
 	unsigned offset = d->hwirq;
 
-	if (!BANK_USED(bank))
-		pm_runtime_get_sync(bank->dev);
-
 	raw_spin_lock_irqsave(&bank->lock, flags);
 
 	if (!LINE_USED(bank->mod_usage, offset))
@@ -815,8 +807,6 @@ static unsigned int omap_gpio_irq_startup(struct irq_data *d)
 	return 0;
 err:
 	raw_spin_unlock_irqrestore(&bank->lock, flags);
-	if (!BANK_USED(bank))
-		pm_runtime_put(bank->dev);
 	return -EINVAL;
 }
 
@@ -835,6 +825,19 @@ static void omap_gpio_irq_shutdown(struct irq_data *d)
 		omap_clear_gpio_debounce(bank, offset);
 	omap_disable_gpio_module(bank, offset);
 	raw_spin_unlock_irqrestore(&bank->lock, flags);
+}
+
+static void omap_gpio_irq_bus_lock(struct irq_data *data)
+{
+	struct gpio_bank *bank = omap_irq_data_get_bank(data);
+
+	if (!BANK_USED(bank))
+		pm_runtime_get_sync(bank->dev);
+}
+
+static void gpio_irq_bus_sync_unlock(struct irq_data *data)
+{
+	struct gpio_bank *bank = omap_irq_data_get_bank(data);
 
 	/*
 	 * If this is the last IRQ to be freed in the bank,
@@ -1183,6 +1186,8 @@ static int omap_gpio_probe(struct platform_device *pdev)
 	irqc->irq_unmask = omap_gpio_unmask_irq,
 	irqc->irq_set_type = omap_gpio_irq_type,
 	irqc->irq_set_wake = omap_gpio_wake_enable,
+	irqc->irq_bus_lock = omap_gpio_irq_bus_lock,
+	irqc->irq_bus_sync_unlock = gpio_irq_bus_sync_unlock,
 	irqc->name = dev_name(&pdev->dev);
 
 	bank->irq = platform_get_irq(pdev, 0);
-- 
2.5.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 2/2] gpio: omap: convert to use generic irq handler
  2015-09-25 19:28 ` Grygorii Strashko
@ 2015-09-25 19:28   ` Grygorii Strashko
  -1 siblings, 0 replies; 21+ messages in thread
From: Grygorii Strashko @ 2015-09-25 19:28 UTC (permalink / raw)
  To: Linus Walleij, Alexandre Courbot, ssantosh, tony
  Cc: linux-omap, Austin Schuh, philipp, linux-rt-users, linux-gpio,
	linux-kernel, Grygorii Strashko

This patch converts TI OMAP GPIO driver to use generic irq handler
instead of chained IRQ handler. This way OMAP GPIO driver will be
compatible with RT kernel where it will be forced thread IRQ handler
while in non-RT kernel it still will be executed in HW IRQ context.
As part of this change the IRQ wakeup configuration is applied to
GPIO Bank IRQ as it now will be under control of IRQ PM Core during
suspend.

There are also additional benefits:
 - on-RT kernel there will be no complains any more about PM runtime usage
   in atomic context  "BUG: sleeping function called from invalid context";
 - GPIO bank IRQs will appear in /proc/interrupts and its usage statistic
    will be  visible;
 - GPIO bank IRQs could be configured through IRQ proc_fs interface and,
   as result, could be a part of IRQ balancing process if needed;
 - GPIO bank IRQs will be under control of IRQ PM Core during
   suspend to RAM.

Disadvantage:
 - additional runtime overhed as call chain till
   omap_gpio_irq_handler() will be longer now
 - necessity to use wa_lock in omap_gpio_irq_handler() to W/A warning
   in handle_irq_event_percpu()
   WARNING: CPU: 1 PID: 35 at kernel/irq/handle.c:149 handle_irq_event_percpu+0x51c/0x638()

This patch doesn't fully follows recommendations provided by Sebastian
Andrzej Siewior [1], because It's required to go through and check all
GPIO IRQ pin states as fast as possible and pass control to handle_level_irq
or handle_edge_irq. handle_level_irq or handle_edge_irq will perform actions
specific for IRQ triggering type and wakeup corresponding registered
threaded IRQ handler (at least it's expected to be threaded).
IRQs can be lost if handle_nested_irq() will be used, because excecution
time of some pin specific GPIO IRQ handler can be very significant and
require accessing ext. devices (I2C).

Idea of such kind reworking was also discussed in [2].

[1] http://www.spinics.net/lists/linux-omap/msg120665.html
[2] http://www.spinics.net/lists/linux-omap/msg119516.html

Tested-by: Tony Lindgren <tony@atomide.com>
Tested-by: Austin Schuh <austin@peloton-tech.com>
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
---
 drivers/gpio/gpio-omap.c | 55 ++++++++++++++++++++++++------------------------
 1 file changed, 27 insertions(+), 28 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index a254691..376827f 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -59,6 +59,7 @@ struct gpio_bank {
 	u32 level_mask;
 	u32 toggle_mask;
 	raw_spinlock_t lock;
+	raw_spinlock_t wa_lock;
 	struct gpio_chip chip;
 	struct clk *dbck;
 	u32 mod_usage;
@@ -649,8 +650,13 @@ static int omap_gpio_wake_enable(struct irq_data *d, unsigned int enable)
 {
 	struct gpio_bank *bank = omap_irq_data_get_bank(d);
 	unsigned offset = d->hwirq;
+	int ret;
+
+	ret = omap_set_gpio_wakeup(bank, offset, enable);
+	if (!ret)
+		ret = irq_set_irq_wake(bank->irq, enable);
 
-	return omap_set_gpio_wakeup(bank, offset, enable);
+	return ret;
 }
 
 static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
@@ -704,26 +710,21 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
  * line's interrupt handler has been run, we may miss some nested
  * interrupts.
  */
-static void omap_gpio_irq_handler(struct irq_desc *desc)
+static irqreturn_t omap_gpio_irq_handler(int irq, void *gpiobank)
 {
 	void __iomem *isr_reg = NULL;
 	u32 isr;
 	unsigned int bit;
-	struct gpio_bank *bank;
-	int unmasked = 0;
-	struct irq_chip *irqchip = irq_desc_get_chip(desc);
-	struct gpio_chip *chip = irq_desc_get_handler_data(desc);
+	struct gpio_bank *bank = gpiobank;
+	unsigned long wa_lock_flags;
 	unsigned long lock_flags;
 
-	chained_irq_enter(irqchip, desc);
-
-	bank = container_of(chip, struct gpio_bank, chip);
 	isr_reg = bank->base + bank->regs->irqstatus;
-	pm_runtime_get_sync(bank->dev);
-
 	if (WARN_ON(!isr_reg))
 		goto exit;
 
+	pm_runtime_get_sync(bank->dev);
+
 	while (1) {
 		u32 isr_saved, level_mask = 0;
 		u32 enabled;
@@ -745,13 +746,6 @@ static void omap_gpio_irq_handler(struct irq_desc *desc)
 
 		raw_spin_unlock_irqrestore(&bank->lock, lock_flags);
 
-		/* if there is only edge sensitive GPIO pin interrupts
-		configured, we could unmask GPIO bank interrupt immediately */
-		if (!level_mask && !unmasked) {
-			unmasked = 1;
-			chained_irq_exit(irqchip, desc);
-		}
-
 		if (!isr)
 			break;
 
@@ -772,18 +766,18 @@ static void omap_gpio_irq_handler(struct irq_desc *desc)
 
 			raw_spin_unlock_irqrestore(&bank->lock, lock_flags);
 
+			raw_spin_lock_irqsave(&bank->wa_lock, wa_lock_flags);
+
 			generic_handle_irq(irq_find_mapping(bank->chip.irqdomain,
 							    bit));
+
+			raw_spin_unlock_irqrestore(&bank->wa_lock,
+						   wa_lock_flags);
 		}
 	}
-	/* if bank has any level sensitive GPIO pin interrupt
-	configured, we must unmask the bank interrupt only after
-	handler(s) are executed in order to avoid spurious bank
-	interrupt */
 exit:
-	if (!unmasked)
-		chained_irq_exit(irqchip, desc);
 	pm_runtime_put(bank->dev);
+	return IRQ_HANDLED;
 }
 
 static unsigned int omap_gpio_irq_startup(struct irq_data *d)
@@ -1135,7 +1129,7 @@ static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
 	}
 
 	ret = gpiochip_irqchip_add(&bank->chip, irqc,
-				   irq_base, omap_gpio_irq_handler,
+				   irq_base, handle_bad_irq,
 				   IRQ_TYPE_NONE);
 
 	if (ret) {
@@ -1144,10 +1138,14 @@ static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
 		return -ENODEV;
 	}
 
-	gpiochip_set_chained_irqchip(&bank->chip, irqc,
-				     bank->irq, omap_gpio_irq_handler);
+	gpiochip_set_chained_irqchip(&bank->chip, irqc, bank->irq, NULL);
 
-	return 0;
+	ret = devm_request_irq(bank->dev, bank->irq, omap_gpio_irq_handler,
+			       0, dev_name(bank->dev), bank);
+	if (ret)
+		gpiochip_remove(&bank->chip);
+
+	return ret;
 }
 
 static const struct of_device_id omap_gpio_match[];
@@ -1229,6 +1227,7 @@ static int omap_gpio_probe(struct platform_device *pdev)
 		bank->set_dataout = omap_set_gpio_dataout_mask;
 
 	raw_spin_lock_init(&bank->lock);
+	raw_spin_lock_init(&bank->wa_lock);
 
 	/* Static mapping, never released */
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-- 
2.5.1

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [PATCH 2/2] gpio: omap: convert to use generic irq handler
@ 2015-09-25 19:28   ` Grygorii Strashko
  0 siblings, 0 replies; 21+ messages in thread
From: Grygorii Strashko @ 2015-09-25 19:28 UTC (permalink / raw)
  To: Linus Walleij, Alexandre Courbot, ssantosh, tony
  Cc: linux-omap, Austin Schuh, philipp, linux-rt-users, linux-gpio,
	linux-kernel, Grygorii Strashko

This patch converts TI OMAP GPIO driver to use generic irq handler
instead of chained IRQ handler. This way OMAP GPIO driver will be
compatible with RT kernel where it will be forced thread IRQ handler
while in non-RT kernel it still will be executed in HW IRQ context.
As part of this change the IRQ wakeup configuration is applied to
GPIO Bank IRQ as it now will be under control of IRQ PM Core during
suspend.

There are also additional benefits:
 - on-RT kernel there will be no complains any more about PM runtime usage
   in atomic context  "BUG: sleeping function called from invalid context";
 - GPIO bank IRQs will appear in /proc/interrupts and its usage statistic
    will be  visible;
 - GPIO bank IRQs could be configured through IRQ proc_fs interface and,
   as result, could be a part of IRQ balancing process if needed;
 - GPIO bank IRQs will be under control of IRQ PM Core during
   suspend to RAM.

Disadvantage:
 - additional runtime overhed as call chain till
   omap_gpio_irq_handler() will be longer now
 - necessity to use wa_lock in omap_gpio_irq_handler() to W/A warning
   in handle_irq_event_percpu()
   WARNING: CPU: 1 PID: 35 at kernel/irq/handle.c:149 handle_irq_event_percpu+0x51c/0x638()

This patch doesn't fully follows recommendations provided by Sebastian
Andrzej Siewior [1], because It's required to go through and check all
GPIO IRQ pin states as fast as possible and pass control to handle_level_irq
or handle_edge_irq. handle_level_irq or handle_edge_irq will perform actions
specific for IRQ triggering type and wakeup corresponding registered
threaded IRQ handler (at least it's expected to be threaded).
IRQs can be lost if handle_nested_irq() will be used, because excecution
time of some pin specific GPIO IRQ handler can be very significant and
require accessing ext. devices (I2C).

Idea of such kind reworking was also discussed in [2].

[1] http://www.spinics.net/lists/linux-omap/msg120665.html
[2] http://www.spinics.net/lists/linux-omap/msg119516.html

Tested-by: Tony Lindgren <tony@atomide.com>
Tested-by: Austin Schuh <austin@peloton-tech.com>
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
---
 drivers/gpio/gpio-omap.c | 55 ++++++++++++++++++++++++------------------------
 1 file changed, 27 insertions(+), 28 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index a254691..376827f 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -59,6 +59,7 @@ struct gpio_bank {
 	u32 level_mask;
 	u32 toggle_mask;
 	raw_spinlock_t lock;
+	raw_spinlock_t wa_lock;
 	struct gpio_chip chip;
 	struct clk *dbck;
 	u32 mod_usage;
@@ -649,8 +650,13 @@ static int omap_gpio_wake_enable(struct irq_data *d, unsigned int enable)
 {
 	struct gpio_bank *bank = omap_irq_data_get_bank(d);
 	unsigned offset = d->hwirq;
+	int ret;
+
+	ret = omap_set_gpio_wakeup(bank, offset, enable);
+	if (!ret)
+		ret = irq_set_irq_wake(bank->irq, enable);
 
-	return omap_set_gpio_wakeup(bank, offset, enable);
+	return ret;
 }
 
 static int omap_gpio_request(struct gpio_chip *chip, unsigned offset)
@@ -704,26 +710,21 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
  * line's interrupt handler has been run, we may miss some nested
  * interrupts.
  */
-static void omap_gpio_irq_handler(struct irq_desc *desc)
+static irqreturn_t omap_gpio_irq_handler(int irq, void *gpiobank)
 {
 	void __iomem *isr_reg = NULL;
 	u32 isr;
 	unsigned int bit;
-	struct gpio_bank *bank;
-	int unmasked = 0;
-	struct irq_chip *irqchip = irq_desc_get_chip(desc);
-	struct gpio_chip *chip = irq_desc_get_handler_data(desc);
+	struct gpio_bank *bank = gpiobank;
+	unsigned long wa_lock_flags;
 	unsigned long lock_flags;
 
-	chained_irq_enter(irqchip, desc);
-
-	bank = container_of(chip, struct gpio_bank, chip);
 	isr_reg = bank->base + bank->regs->irqstatus;
-	pm_runtime_get_sync(bank->dev);
-
 	if (WARN_ON(!isr_reg))
 		goto exit;
 
+	pm_runtime_get_sync(bank->dev);
+
 	while (1) {
 		u32 isr_saved, level_mask = 0;
 		u32 enabled;
@@ -745,13 +746,6 @@ static void omap_gpio_irq_handler(struct irq_desc *desc)
 
 		raw_spin_unlock_irqrestore(&bank->lock, lock_flags);
 
-		/* if there is only edge sensitive GPIO pin interrupts
-		configured, we could unmask GPIO bank interrupt immediately */
-		if (!level_mask && !unmasked) {
-			unmasked = 1;
-			chained_irq_exit(irqchip, desc);
-		}
-
 		if (!isr)
 			break;
 
@@ -772,18 +766,18 @@ static void omap_gpio_irq_handler(struct irq_desc *desc)
 
 			raw_spin_unlock_irqrestore(&bank->lock, lock_flags);
 
+			raw_spin_lock_irqsave(&bank->wa_lock, wa_lock_flags);
+
 			generic_handle_irq(irq_find_mapping(bank->chip.irqdomain,
 							    bit));
+
+			raw_spin_unlock_irqrestore(&bank->wa_lock,
+						   wa_lock_flags);
 		}
 	}
-	/* if bank has any level sensitive GPIO pin interrupt
-	configured, we must unmask the bank interrupt only after
-	handler(s) are executed in order to avoid spurious bank
-	interrupt */
 exit:
-	if (!unmasked)
-		chained_irq_exit(irqchip, desc);
 	pm_runtime_put(bank->dev);
+	return IRQ_HANDLED;
 }
 
 static unsigned int omap_gpio_irq_startup(struct irq_data *d)
@@ -1135,7 +1129,7 @@ static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
 	}
 
 	ret = gpiochip_irqchip_add(&bank->chip, irqc,
-				   irq_base, omap_gpio_irq_handler,
+				   irq_base, handle_bad_irq,
 				   IRQ_TYPE_NONE);
 
 	if (ret) {
@@ -1144,10 +1138,14 @@ static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
 		return -ENODEV;
 	}
 
-	gpiochip_set_chained_irqchip(&bank->chip, irqc,
-				     bank->irq, omap_gpio_irq_handler);
+	gpiochip_set_chained_irqchip(&bank->chip, irqc, bank->irq, NULL);
 
-	return 0;
+	ret = devm_request_irq(bank->dev, bank->irq, omap_gpio_irq_handler,
+			       0, dev_name(bank->dev), bank);
+	if (ret)
+		gpiochip_remove(&bank->chip);
+
+	return ret;
 }
 
 static const struct of_device_id omap_gpio_match[];
@@ -1229,6 +1227,7 @@ static int omap_gpio_probe(struct platform_device *pdev)
 		bank->set_dataout = omap_set_gpio_dataout_mask;
 
 	raw_spin_lock_init(&bank->lock);
+	raw_spin_lock_init(&bank->wa_lock);
 
 	/* Static mapping, never released */
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-- 
2.5.1


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [PATCH 0/2] convert to use generic irq handler
  2015-09-25 19:28 ` Grygorii Strashko
                   ` (2 preceding siblings ...)
  (?)
@ 2015-09-25 20:36 ` santosh.shilimkar
  -1 siblings, 0 replies; 21+ messages in thread
From: santosh.shilimkar @ 2015-09-25 20:36 UTC (permalink / raw)
  To: Grygorii Strashko, Linus Walleij, Alexandre Courbot, ssantosh, tony
  Cc: linux-omap, Austin Schuh, philipp, linux-rt-users, linux-gpio,
	linux-kernel

On 9/25/15 12:28 PM, Grygorii Strashko wrote:
> This patch series contains patches which fixes wrong APIs usage in atomic
> context on RT-kernel. The final goal is to make TI OMAP GPIO driver
> compatible with -RT kernel as much as possible.
>
> Patch 1: required to be compatible with -RT kernel, because PM runtime's
> irq_safe mode is incompatible with -RT.
> Patch 2: This patch converts TI OMAP GPIO driver to use generic irq
>   handler instead of chained IRQ handler. This way OMAP GPIO driver will be
>   compatible with RT-kernel where it will be forced thread IRQ handler
>   while in non-RT kernel it still will be executed in HW IRQ context.
>
> Boot, basic gpio functionality tested on:
>   dra7-evm, BeagleBone(white), am43xx-gpevm, am437x-sk
> Manually tested on dra7-evm including suspend/resume and wakeup.
>
> Links on RFC:
>   https://lkml.org/lkml/2015/8/18/161
>   https://lkml.org/lkml/2015/8/18/162
>
> Grygorii Strashko (2):
>    gpio: omap: move pm runtime in irq_chip.irq_bus_lock/sync_unlock
>    gpio: omap: convert to use generic irq handler
>
Acked-by: Santosh Shilimkar <ssantosh@kernel.org>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 1/2] gpio: omap: move pm runtime in irq_chip.irq_bus_lock/sync_unlock
  2015-09-25 19:28   ` Grygorii Strashko
  (?)
@ 2015-10-02 12:22   ` Linus Walleij
  -1 siblings, 0 replies; 21+ messages in thread
From: Linus Walleij @ 2015-10-02 12:22 UTC (permalink / raw)
  To: Grygorii Strashko
  Cc: Alexandre Courbot, Santosh Shilimkar, Tony Lindgren, Linux-OMAP,
	Austin Schuh, philipp, linux-rt-users, linux-gpio, linux-kernel

On Fri, Sep 25, 2015 at 12:28 PM, Grygorii Strashko
<grygorii.strashko@ti.com> wrote:

> The PM runtime API can't be used in atomic contex on -RT even if
> it's configured as irqsafe. As result, below error report can
> be seen when PM runtime API called from IRQ chip's callbacks
> irq_startup/irq_shutdown/irq_set_type, because they are
> protected by RAW spinlock:
>
> BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:917
> in_atomic(): 1, irqs_disabled(): 128, pid: 96, name: insmod
> 3 locks held by insmod/96:
>  #0:  (&dev->mutex){......}, at: [<c04752c8>] __driver_attach+0x54/0xa0
>  #1:  (&dev->mutex){......}, at: [<c04752d4>] __driver_attach+0x60/0xa0
>  #2:  (class){......}, at: [<c00a408c>] __irq_get_desc_lock+0x60/0xa4
> irq event stamp: 1834
> hardirqs last  enabled at (1833): [<c06ab2a4>] _raw_spin_unlock_irqrestore+0x88/0x90
> hardirqs last disabled at (1834): [<c06ab068>] _raw_spin_lock_irqsave+0x2c/0x64
> softirqs last  enabled at (0): [<c003d220>] copy_process.part.52+0x410/0x19d8
> softirqs last disabled at (0): [<  (null)>]   (null)
> Preemption disabled at:[<  (null)>]   (null)
>
> CPU: 1 PID: 96 Comm: insmod Tainted: G        W  O    4.1.3-rt3-00618-g57e2387-dirty #184
> Hardware name: Generic DRA74X (Flattened Device Tree)
> [<c00190f4>] (unwind_backtrace) from [<c0014734>] (show_stack+0x20/0x24)
> [<c0014734>] (show_stack) from [<c06a62ec>] (dump_stack+0x88/0xdc)
> [<c06a62ec>] (dump_stack) from [<c006ca44>] (___might_sleep+0x198/0x2a8)
> [<c006ca44>] (___might_sleep) from [<c06ab6d4>] (rt_spin_lock+0x30/0x70)
> [<c06ab6d4>] (rt_spin_lock) from [<c04815ac>] (__pm_runtime_resume+0x68/0xa4)
> [<c04815ac>] (__pm_runtime_resume) from [<c04123f4>] (omap_gpio_irq_type+0x188/0x1d8)
> [<c04123f4>] (omap_gpio_irq_type) from [<c00a64e4>] (__irq_set_trigger+0x68/0x130)
> [<c00a64e4>] (__irq_set_trigger) from [<c00a7bc4>] (irq_set_irq_type+0x44/0x6c)
> [<c00a7bc4>] (irq_set_irq_type) from [<c00abbf8>] (irq_create_of_mapping+0x120/0x174)
> [<c00abbf8>] (irq_create_of_mapping) from [<c0577b74>] (of_irq_get+0x48/0x58)
> [<c0577b74>] (of_irq_get) from [<c0540a14>] (i2c_device_probe+0x54/0x15c)
> [<c0540a14>] (i2c_device_probe) from [<c04750dc>] (driver_probe_device+0x184/0x2c8)
> [<c04750dc>] (driver_probe_device) from [<c0475310>] (__driver_attach+0x9c/0xa0)
> [<c0475310>] (__driver_attach) from [<c0473238>] (bus_for_each_dev+0x7c/0xb0)
> [<c0473238>] (bus_for_each_dev) from [<c0474af4>] (driver_attach+0x28/0x30)
> [<c0474af4>] (driver_attach) from [<c0474760>] (bus_add_driver+0x154/0x200)
> [<c0474760>] (bus_add_driver) from [<c0476348>] (driver_register+0x88/0x108)
> [<c0476348>] (driver_register) from [<c0541600>] (i2c_register_driver+0x3c/0x90)
> [<c0541600>] (i2c_register_driver) from [<bf003018>] (pcf857x_init+0x18/0x24 [gpio_pcf857x])
> [<bf003018>] (pcf857x_init [gpio_pcf857x]) from [<c000998c>] (do_one_initcall+0x128/0x1e8)
> [<c000998c>] (do_one_initcall) from [<c06a4220>] (do_init_module+0x6c/0x1bc)
> [<c06a4220>] (do_init_module) from [<c00dd0c8>] (load_module+0x18e8/0x21c4)
> [<c00dd0c8>] (load_module) from [<c00ddaa0>] (SyS_init_module+0xfc/0x158)
> [<c00ddaa0>] (SyS_init_module) from [<c000ff40>] (ret_fast_syscall+0x0/0x54)
>
> The IRQ chip interface defines only two callbacks which are executed in
> non-atomic contex - irq_bus_lock/irq_bus_sync_unlock, so lets move
> PM runtime calls there.
>
> Tested-by: Tony Lindgren <tony@atomide.com>
> Tested-by: Austin Schuh <austin@peloton-tech.com>
> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>

Patch applied with Santosh's ACK.

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/2] gpio: omap: convert to use generic irq handler
  2015-09-25 19:28   ` Grygorii Strashko
  (?)
@ 2015-10-02 20:17   ` Linus Walleij
  2015-10-02 22:40       ` Grygorii Strashko
  -1 siblings, 1 reply; 21+ messages in thread
From: Linus Walleij @ 2015-10-02 20:17 UTC (permalink / raw)
  To: Grygorii Strashko
  Cc: Alexandre Courbot, Santosh Shilimkar, Tony Lindgren, Linux-OMAP,
	Austin Schuh, philipp, linux-rt-users, linux-gpio, linux-kernel

On Fri, Sep 25, 2015 at 12:28 PM, Grygorii Strashko
<grygorii.strashko@ti.com> wrote:

> This patch converts TI OMAP GPIO driver to use generic irq handler
> instead of chained IRQ handler. This way OMAP GPIO driver will be
> compatible with RT kernel where it will be forced thread IRQ handler
> while in non-RT kernel it still will be executed in HW IRQ context.
> As part of this change the IRQ wakeup configuration is applied to
> GPIO Bank IRQ as it now will be under control of IRQ PM Core during
> suspend.
>
> There are also additional benefits:
>  - on-RT kernel there will be no complains any more about PM runtime usage
>    in atomic context  "BUG: sleeping function called from invalid context";
>  - GPIO bank IRQs will appear in /proc/interrupts and its usage statistic
>     will be  visible;
>  - GPIO bank IRQs could be configured through IRQ proc_fs interface and,
>    as result, could be a part of IRQ balancing process if needed;
>  - GPIO bank IRQs will be under control of IRQ PM Core during
>    suspend to RAM.
>
> Disadvantage:
>  - additional runtime overhed as call chain till
>    omap_gpio_irq_handler() will be longer now
>  - necessity to use wa_lock in omap_gpio_irq_handler() to W/A warning
>    in handle_irq_event_percpu()
>    WARNING: CPU: 1 PID: 35 at kernel/irq/handle.c:149 handle_irq_event_percpu+0x51c/0x638()
>
> This patch doesn't fully follows recommendations provided by Sebastian
> Andrzej Siewior [1], because It's required to go through and check all
> GPIO IRQ pin states as fast as possible and pass control to handle_level_irq
> or handle_edge_irq. handle_level_irq or handle_edge_irq will perform actions
> specific for IRQ triggering type and wakeup corresponding registered
> threaded IRQ handler (at least it's expected to be threaded).
> IRQs can be lost if handle_nested_irq() will be used, because excecution
> time of some pin specific GPIO IRQ handler can be very significant and
> require accessing ext. devices (I2C).
>
> Idea of such kind reworking was also discussed in [2].
>
> [1] http://www.spinics.net/lists/linux-omap/msg120665.html
> [2] http://www.spinics.net/lists/linux-omap/msg119516.html
>
> Tested-by: Tony Lindgren <tony@atomide.com>
> Tested-by: Austin Schuh <austin@peloton-tech.com>
> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>

Patch applied.

I'm thinking that we need some recommendations on how to write
IRQ handlers in order to be RT-compatible. Can you help me lining
up the requirements in Documentation/gpio/driver.txt?

I will write an RFC patch and let you write some additional text
to it in response then we can iterate it a bit.

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/2] gpio: omap: convert to use generic irq handler
  2015-10-02 20:17   ` Linus Walleij
@ 2015-10-02 22:40       ` Grygorii Strashko
  0 siblings, 0 replies; 21+ messages in thread
From: Grygorii Strashko @ 2015-10-02 22:40 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Alexandre Courbot, Santosh Shilimkar, Tony Lindgren, Linux-OMAP,
	Austin Schuh, philipp, linux-rt-users, linux-gpio, linux-kernel

On 10/02/2015 03:17 PM, Linus Walleij wrote:
> On Fri, Sep 25, 2015 at 12:28 PM, Grygorii Strashko
> <grygorii.strashko@ti.com> wrote:
>
>> This patch converts TI OMAP GPIO driver to use generic irq handler
>> instead of chained IRQ handler. This way OMAP GPIO driver will be
>> compatible with RT kernel where it will be forced thread IRQ handler
>> while in non-RT kernel it still will be executed in HW IRQ context.
>> As part of this change the IRQ wakeup configuration is applied to
>> GPIO Bank IRQ as it now will be under control of IRQ PM Core during
>> suspend.
>>
>> There are also additional benefits:
>>   - on-RT kernel there will be no complains any more about PM runtime usage
>>     in atomic context  "BUG: sleeping function called from invalid context";
>>   - GPIO bank IRQs will appear in /proc/interrupts and its usage statistic
>>      will be  visible;
>>   - GPIO bank IRQs could be configured through IRQ proc_fs interface and,
>>     as result, could be a part of IRQ balancing process if needed;
>>   - GPIO bank IRQs will be under control of IRQ PM Core during
>>     suspend to RAM.
>>
>> Disadvantage:
>>   - additional runtime overhed as call chain till
>>     omap_gpio_irq_handler() will be longer now
>>   - necessity to use wa_lock in omap_gpio_irq_handler() to W/A warning
>>     in handle_irq_event_percpu()
>>     WARNING: CPU: 1 PID: 35 at kernel/irq/handle.c:149 handle_irq_event_percpu+0x51c/0x638()
>>
>> This patch doesn't fully follows recommendations provided by Sebastian
>> Andrzej Siewior [1], because It's required to go through and check all
>> GPIO IRQ pin states as fast as possible and pass control to handle_level_irq
>> or handle_edge_irq. handle_level_irq or handle_edge_irq will perform actions
>> specific for IRQ triggering type and wakeup corresponding registered
>> threaded IRQ handler (at least it's expected to be threaded).
>> IRQs can be lost if handle_nested_irq() will be used, because excecution
>> time of some pin specific GPIO IRQ handler can be very significant and
>> require accessing ext. devices (I2C).
>>
>> Idea of such kind reworking was also discussed in [2].
>>
>> [1] http://www.spinics.net/lists/linux-omap/msg120665.html
>> [2] http://www.spinics.net/lists/linux-omap/msg119516.html
>>
>> Tested-by: Tony Lindgren <tony@atomide.com>
>> Tested-by: Austin Schuh <austin@peloton-tech.com>
>> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
>
> Patch applied.
>

Thanks.

> I'm thinking that we need some recommendations on how to write
> IRQ handlers in order to be RT-compatible. Can you help me lining
> up the requirements in Documentation/gpio/driver.txt?
>
> I will write an RFC patch and let you write some additional text
> to it in response then we can iterate it a bit.

Sure. I'll try to help.


-- 
regards,
-grygorii

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/2] gpio: omap: convert to use generic irq handler
@ 2015-10-02 22:40       ` Grygorii Strashko
  0 siblings, 0 replies; 21+ messages in thread
From: Grygorii Strashko @ 2015-10-02 22:40 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Alexandre Courbot, Santosh Shilimkar, Tony Lindgren, Linux-OMAP,
	Austin Schuh, philipp, linux-rt-users, linux-gpio, linux-kernel

On 10/02/2015 03:17 PM, Linus Walleij wrote:
> On Fri, Sep 25, 2015 at 12:28 PM, Grygorii Strashko
> <grygorii.strashko@ti.com> wrote:
>
>> This patch converts TI OMAP GPIO driver to use generic irq handler
>> instead of chained IRQ handler. This way OMAP GPIO driver will be
>> compatible with RT kernel where it will be forced thread IRQ handler
>> while in non-RT kernel it still will be executed in HW IRQ context.
>> As part of this change the IRQ wakeup configuration is applied to
>> GPIO Bank IRQ as it now will be under control of IRQ PM Core during
>> suspend.
>>
>> There are also additional benefits:
>>   - on-RT kernel there will be no complains any more about PM runtime usage
>>     in atomic context  "BUG: sleeping function called from invalid context";
>>   - GPIO bank IRQs will appear in /proc/interrupts and its usage statistic
>>      will be  visible;
>>   - GPIO bank IRQs could be configured through IRQ proc_fs interface and,
>>     as result, could be a part of IRQ balancing process if needed;
>>   - GPIO bank IRQs will be under control of IRQ PM Core during
>>     suspend to RAM.
>>
>> Disadvantage:
>>   - additional runtime overhed as call chain till
>>     omap_gpio_irq_handler() will be longer now
>>   - necessity to use wa_lock in omap_gpio_irq_handler() to W/A warning
>>     in handle_irq_event_percpu()
>>     WARNING: CPU: 1 PID: 35 at kernel/irq/handle.c:149 handle_irq_event_percpu+0x51c/0x638()
>>
>> This patch doesn't fully follows recommendations provided by Sebastian
>> Andrzej Siewior [1], because It's required to go through and check all
>> GPIO IRQ pin states as fast as possible and pass control to handle_level_irq
>> or handle_edge_irq. handle_level_irq or handle_edge_irq will perform actions
>> specific for IRQ triggering type and wakeup corresponding registered
>> threaded IRQ handler (at least it's expected to be threaded).
>> IRQs can be lost if handle_nested_irq() will be used, because excecution
>> time of some pin specific GPIO IRQ handler can be very significant and
>> require accessing ext. devices (I2C).
>>
>> Idea of such kind reworking was also discussed in [2].
>>
>> [1] http://www.spinics.net/lists/linux-omap/msg120665.html
>> [2] http://www.spinics.net/lists/linux-omap/msg119516.html
>>
>> Tested-by: Tony Lindgren <tony@atomide.com>
>> Tested-by: Austin Schuh <austin@peloton-tech.com>
>> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
>
> Patch applied.
>

Thanks.

> I'm thinking that we need some recommendations on how to write
> IRQ handlers in order to be RT-compatible. Can you help me lining
> up the requirements in Documentation/gpio/driver.txt?
>
> I will write an RFC patch and let you write some additional text
> to it in response then we can iterate it a bit.

Sure. I'll try to help.


-- 
regards,
-grygorii

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/2] gpio: omap: convert to use generic irq handler
  2015-10-02 22:40       ` Grygorii Strashko
  (?)
@ 2015-10-12  7:52       ` Thomas Gleixner
  2015-10-13 18:25           ` Grygorii Strashko
  -1 siblings, 1 reply; 21+ messages in thread
From: Thomas Gleixner @ 2015-10-12  7:52 UTC (permalink / raw)
  To: Grygorii Strashko
  Cc: Linus Walleij, Alexandre Courbot, Santosh Shilimkar,
	Tony Lindgren, Linux-OMAP, Austin Schuh, philipp, linux-rt-users,
	linux-gpio, linux-kernel

Grygorii,

can you please provide a patch set against 4.1-RT? That stuff rejects
left and right.

Thanks,

	tglx

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/2] gpio: omap: convert to use generic irq handler
  2015-10-12  7:52       ` Thomas Gleixner
@ 2015-10-13 18:25           ` Grygorii Strashko
  0 siblings, 0 replies; 21+ messages in thread
From: Grygorii Strashko @ 2015-10-13 18:25 UTC (permalink / raw)
  To: Thomas Gleixner, Dan Murphy
  Cc: Linus Walleij, Alexandre Courbot, Santosh Shilimkar,
	Tony Lindgren, Linux-OMAP, Austin Schuh, philipp, linux-rt-users,
	linux-gpio, linux-kernel

Hi Thomas,

On 10/12/2015 10:52 AM, Thomas Gleixner wrote:
> Grygorii,
> 
> can you please provide a patch set against 4.1-RT? That stuff rejects
> left and right.
> 

This is really not easy thing to do :( and I don't know how to do it the best way.

This patches are based on top of big set of other patches. As result we've back-ported
mostly all GPIO patches from upstream kernel to TI's 4.1 kernel to keep things
consistent and avoid complicated conflicts during back-porting of fixes.
The branch linux-4.1.y-rt is continuously merged in TI's 4.1 rt-kernel.

So, on top of linux-4.1.y there is below set of patches in TI's kernel now:
*bc6b549 gpio: omap: convert to use generic irq handler
*d8b79f8 gpio: omap: move pm runtime in irq_chip.irq_bus_lock/sync_unlock
c5d9d80 gpio: omap: fix static checker warning
8e3f97d gpio: omap: Fix GPIO numbering for deferred probe
a5fafaa gpio: omap: Fix gpiochip_add() handling for deferred probe
*a79afac gpio: omap: fix clk_prepare/unprepare usage
*e967fb8 gpio: omap: protect regs access in omap_gpio_irq_handler
7f66a45 gpio: omap: fix omap2_set_gpio_debounce
225b622 gpio: omap: switch to use platform_get_irq
4ad92d9 gpio: omap: remove wrong irq_domain_remove usage in probe
f76691a gpio: omap: Fix missing raw locks conversion
*97e1a2c gpio: omap: use raw locks for locking
7a74d02 ARM: OMAP2: Drop the concept of certain power domains not being able to lose context.
76281a5 gpio: omap: prevent module from being unloaded while in use
7aa88c9 gpio: omap: add missed spin_unlock_irqrestore in omap_gpio_irq_type
79d3bc2 gpio: omap: rework omap_gpio_irq_startup to handle current pin state properly
81dcc40 gpio: omap: rework omap_gpio_request to touch only gpio specific registers
e44665c gpio: omap: rework omap_x_irq_shutdown to touch only irqs specific registers
23c487f gpio: omap: fix error handling in omap_gpio_irq_type
b328dfc gpio: omap: fix omap_gpio_free to not clean up irq configuration
2966641 gpio: omap: Allow building as a loadable module

I'd very appreciate for any advice of how to better proceed with your request.
 - I can try to apply and re-send only patches marked by '*'
 - I can prepare branch with all above patches
 - smth. else


-- 
regards,
-grygorii

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/2] gpio: omap: convert to use generic irq handler
@ 2015-10-13 18:25           ` Grygorii Strashko
  0 siblings, 0 replies; 21+ messages in thread
From: Grygorii Strashko @ 2015-10-13 18:25 UTC (permalink / raw)
  To: Thomas Gleixner, Dan Murphy
  Cc: Linus Walleij, Alexandre Courbot, Santosh Shilimkar,
	Tony Lindgren, Linux-OMAP, Austin Schuh, philipp, linux-rt-users,
	linux-gpio, linux-kernel

Hi Thomas,

On 10/12/2015 10:52 AM, Thomas Gleixner wrote:
> Grygorii,
> 
> can you please provide a patch set against 4.1-RT? That stuff rejects
> left and right.
> 

This is really not easy thing to do :( and I don't know how to do it the best way.

This patches are based on top of big set of other patches. As result we've back-ported
mostly all GPIO patches from upstream kernel to TI's 4.1 kernel to keep things
consistent and avoid complicated conflicts during back-porting of fixes.
The branch linux-4.1.y-rt is continuously merged in TI's 4.1 rt-kernel.

So, on top of linux-4.1.y there is below set of patches in TI's kernel now:
*bc6b549 gpio: omap: convert to use generic irq handler
*d8b79f8 gpio: omap: move pm runtime in irq_chip.irq_bus_lock/sync_unlock
c5d9d80 gpio: omap: fix static checker warning
8e3f97d gpio: omap: Fix GPIO numbering for deferred probe
a5fafaa gpio: omap: Fix gpiochip_add() handling for deferred probe
*a79afac gpio: omap: fix clk_prepare/unprepare usage
*e967fb8 gpio: omap: protect regs access in omap_gpio_irq_handler
7f66a45 gpio: omap: fix omap2_set_gpio_debounce
225b622 gpio: omap: switch to use platform_get_irq
4ad92d9 gpio: omap: remove wrong irq_domain_remove usage in probe
f76691a gpio: omap: Fix missing raw locks conversion
*97e1a2c gpio: omap: use raw locks for locking
7a74d02 ARM: OMAP2: Drop the concept of certain power domains not being able to lose context.
76281a5 gpio: omap: prevent module from being unloaded while in use
7aa88c9 gpio: omap: add missed spin_unlock_irqrestore in omap_gpio_irq_type
79d3bc2 gpio: omap: rework omap_gpio_irq_startup to handle current pin state properly
81dcc40 gpio: omap: rework omap_gpio_request to touch only gpio specific registers
e44665c gpio: omap: rework omap_x_irq_shutdown to touch only irqs specific registers
23c487f gpio: omap: fix error handling in omap_gpio_irq_type
b328dfc gpio: omap: fix omap_gpio_free to not clean up irq configuration
2966641 gpio: omap: Allow building as a loadable module

I'd very appreciate for any advice of how to better proceed with your request.
 - I can try to apply and re-send only patches marked by '*'
 - I can prepare branch with all above patches
 - smth. else


-- 
regards,
-grygorii

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/2] gpio: omap: convert to use generic irq handler
  2015-10-13 18:25           ` Grygorii Strashko
  (?)
@ 2015-10-13 18:33           ` Thomas Gleixner
  2015-10-15 16:33               ` Grygorii Strashko
  -1 siblings, 1 reply; 21+ messages in thread
From: Thomas Gleixner @ 2015-10-13 18:33 UTC (permalink / raw)
  To: Grygorii Strashko
  Cc: Dan Murphy, Linus Walleij, Alexandre Courbot, Santosh Shilimkar,
	Tony Lindgren, Linux-OMAP, Austin Schuh, philipp, linux-rt-users,
	linux-gpio, linux-kernel

Grygorii,

On Tue, 13 Oct 2015, Grygorii Strashko wrote:
> I'd very appreciate for any advice of how to better proceed with your request.
>  - I can try to apply and re-send only patches marked by '*'
>  - I can prepare branch with all above patches

Please provide a branch on top of 4.1.10 which contains the whole
lot. I have a look at it and decide then how to go from there.

Thanks,

	tglx

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/2] gpio: omap: convert to use generic irq handler
  2015-10-13 18:33           ` Thomas Gleixner
@ 2015-10-15 16:33               ` Grygorii Strashko
  0 siblings, 0 replies; 21+ messages in thread
From: Grygorii Strashko @ 2015-10-15 16:33 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: Dan Murphy, Linus Walleij, Alexandre Courbot, Santosh Shilimkar,
	Tony Lindgren, Linux-OMAP, Austin Schuh, philipp, linux-rt-users,
	linux-gpio, linux-kernel

Hi Thomas,

On 10/13/2015 09:33 PM, Thomas Gleixner wrote:
> Grygorii,
>
> On Tue, 13 Oct 2015, Grygorii Strashko wrote:
>> I'd very appreciate for any advice of how to better proceed with your request.
>>   - I can try to apply and re-send only patches marked by '*'
>>   - I can prepare branch with all above patches
>
> Please provide a branch on top of 4.1.10 which contains the whole
> lot. I have a look at it and decide then how to go from there.

I've prepared branch linux-4.1.10-ti-gpio:
in git@git.ti.com:~gragst/ti-linux-kernel/gragsts-ti-linux-kernel.git

based on top of
  git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
  branch : linux-4.1.y
  commit : 27f1b7f Linux 4.1.10


Also, I've tried to merge it in linux-4.1.y-rt and found that merge can 
be done without merge conflicts if below patch is reverted:
"
    Revert "gpio: omap: use raw locks for locking"
    This reverts commit 26dc4f70eb09ff7d36b1e6cd720e65b3c69098ae
"

-- 
regards,
-grygorii

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/2] gpio: omap: convert to use generic irq handler
@ 2015-10-15 16:33               ` Grygorii Strashko
  0 siblings, 0 replies; 21+ messages in thread
From: Grygorii Strashko @ 2015-10-15 16:33 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: Dan Murphy, Linus Walleij, Alexandre Courbot, Santosh Shilimkar,
	Tony Lindgren, Linux-OMAP, Austin Schuh, philipp, linux-rt-users,
	linux-gpio, linux-kernel

Hi Thomas,

On 10/13/2015 09:33 PM, Thomas Gleixner wrote:
> Grygorii,
>
> On Tue, 13 Oct 2015, Grygorii Strashko wrote:
>> I'd very appreciate for any advice of how to better proceed with your request.
>>   - I can try to apply and re-send only patches marked by '*'
>>   - I can prepare branch with all above patches
>
> Please provide a branch on top of 4.1.10 which contains the whole
> lot. I have a look at it and decide then how to go from there.

I've prepared branch linux-4.1.10-ti-gpio:
in git@git.ti.com:~gragst/ti-linux-kernel/gragsts-ti-linux-kernel.git

based on top of
  git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
  branch : linux-4.1.y
  commit : 27f1b7f Linux 4.1.10


Also, I've tried to merge it in linux-4.1.y-rt and found that merge can 
be done without merge conflicts if below patch is reverted:
"
    Revert "gpio: omap: use raw locks for locking"
    This reverts commit 26dc4f70eb09ff7d36b1e6cd720e65b3c69098ae
"

-- 
regards,
-grygorii

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/2] gpio: omap: convert to use generic irq handler
  2015-10-15 16:33               ` Grygorii Strashko
  (?)
@ 2015-12-11 16:57               ` Sebastian Andrzej Siewior
  2015-12-12  8:30                   ` Grygorii Strashko
  -1 siblings, 1 reply; 21+ messages in thread
From: Sebastian Andrzej Siewior @ 2015-12-11 16:57 UTC (permalink / raw)
  To: Grygorii Strashko
  Cc: Thomas Gleixner, Dan Murphy, Linus Walleij, Alexandre Courbot,
	Santosh Shilimkar, Tony Lindgren, Linux-OMAP, Austin Schuh,
	philipp, linux-rt-users, linux-gpio, linux-kernel

* Grygorii Strashko | 2015-10-15 19:33:43 [+0300]:

>Hi Thomas,
>
>On 10/13/2015 09:33 PM, Thomas Gleixner wrote:
>>Grygorii,
>>
>>On Tue, 13 Oct 2015, Grygorii Strashko wrote:
>>>I'd very appreciate for any advice of how to better proceed with your request.
>>>  - I can try to apply and re-send only patches marked by '*'
>>>  - I can prepare branch with all above patches
>>
>>Please provide a branch on top of 4.1.10 which contains the whole
>>lot. I have a look at it and decide then how to go from there.
>
>I've prepared branch linux-4.1.10-ti-gpio:
>in git@git.ti.com:~gragst/ti-linux-kernel/gragsts-ti-linux-kernel.git

could you please provide a git URL for that?

>based on top of
> git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
> branch : linux-4.1.y
> commit : 27f1b7f Linux 4.1.10

Sebastian

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/2] gpio: omap: convert to use generic irq handler
  2015-12-11 16:57               ` Sebastian Andrzej Siewior
@ 2015-12-12  8:30                   ` Grygorii Strashko
  0 siblings, 0 replies; 21+ messages in thread
From: Grygorii Strashko @ 2015-12-12  8:30 UTC (permalink / raw)
  To: Sebastian Andrzej Siewior
  Cc: Thomas Gleixner, Dan Murphy, Linus Walleij, Alexandre Courbot,
	Santosh Shilimkar, Tony Lindgren, Linux-OMAP, Austin Schuh,
	philipp, linux-rt-users, linux-gpio, linux-kernel

On 12/11/2015 06:57 PM, Sebastian Andrzej Siewior wrote:
> * Grygorii Strashko | 2015-10-15 19:33:43 [+0300]:
>
>> Hi Thomas,
>>
>> On 10/13/2015 09:33 PM, Thomas Gleixner wrote:
>>> Grygorii,
>>>
>>> On Tue, 13 Oct 2015, Grygorii Strashko wrote:
>>>> I'd very appreciate for any advice of how to better proceed with your request.
>>>>   - I can try to apply and re-send only patches marked by '*'
>>>>   - I can prepare branch with all above patches
>>>
>>> Please provide a branch on top of 4.1.10 which contains the whole
>>> lot. I have a look at it and decide then how to go from there.
>>
>> I've prepared branch linux-4.1.10-ti-gpio:
>> in git@git.ti.com:~gragst/ti-linux-kernel/gragsts-ti-linux-kernel.git
>
> could you please provide a git URL for that?

git://git.ti.com/~gragst/ti-linux-kernel/gragsts-ti-linux-kernel.git

>> based on top of
>> git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
>> branch : linux-4.1.y
>> commit : 27f1b7f Linux 4.1.10
>


-- 
regards,
-grygorii

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/2] gpio: omap: convert to use generic irq handler
@ 2015-12-12  8:30                   ` Grygorii Strashko
  0 siblings, 0 replies; 21+ messages in thread
From: Grygorii Strashko @ 2015-12-12  8:30 UTC (permalink / raw)
  To: Sebastian Andrzej Siewior
  Cc: Thomas Gleixner, Dan Murphy, Linus Walleij, Alexandre Courbot,
	Santosh Shilimkar, Tony Lindgren, Linux-OMAP, Austin Schuh,
	philipp, linux-rt-users, linux-gpio, linux-kernel

On 12/11/2015 06:57 PM, Sebastian Andrzej Siewior wrote:
> * Grygorii Strashko | 2015-10-15 19:33:43 [+0300]:
>
>> Hi Thomas,
>>
>> On 10/13/2015 09:33 PM, Thomas Gleixner wrote:
>>> Grygorii,
>>>
>>> On Tue, 13 Oct 2015, Grygorii Strashko wrote:
>>>> I'd very appreciate for any advice of how to better proceed with your request.
>>>>   - I can try to apply and re-send only patches marked by '*'
>>>>   - I can prepare branch with all above patches
>>>
>>> Please provide a branch on top of 4.1.10 which contains the whole
>>> lot. I have a look at it and decide then how to go from there.
>>
>> I've prepared branch linux-4.1.10-ti-gpio:
>> in git@git.ti.com:~gragst/ti-linux-kernel/gragsts-ti-linux-kernel.git
>
> could you please provide a git URL for that?

git://git.ti.com/~gragst/ti-linux-kernel/gragsts-ti-linux-kernel.git

>> based on top of
>> git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
>> branch : linux-4.1.y
>> commit : 27f1b7f Linux 4.1.10
>


-- 
regards,
-grygorii

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH 2/2] gpio: omap: convert to use generic irq handler
  2015-12-12  8:30                   ` Grygorii Strashko
  (?)
@ 2015-12-22 15:27                   ` Sebastian Andrzej Siewior
  -1 siblings, 0 replies; 21+ messages in thread
From: Sebastian Andrzej Siewior @ 2015-12-22 15:27 UTC (permalink / raw)
  To: Grygorii Strashko
  Cc: Thomas Gleixner, Dan Murphy, Linus Walleij, Alexandre Courbot,
	Santosh Shilimkar, Tony Lindgren, Linux-OMAP, Austin Schuh,
	philipp, linux-rt-users, linux-gpio, linux-kernel

* Grygorii Strashko | 2015-12-12 10:30:10 [+0200]:

>git://git.ti.com/~gragst/ti-linux-kernel/gragsts-ti-linux-kernel.git

sucked in, thanks.

Sebastian

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2015-12-22 15:27 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-09-25 19:28 [PATCH 0/2] convert to use generic irq handler Grygorii Strashko
2015-09-25 19:28 ` Grygorii Strashko
2015-09-25 19:28 ` [PATCH 1/2] gpio: omap: move pm runtime in irq_chip.irq_bus_lock/sync_unlock Grygorii Strashko
2015-09-25 19:28   ` Grygorii Strashko
2015-10-02 12:22   ` Linus Walleij
2015-09-25 19:28 ` [PATCH 2/2] gpio: omap: convert to use generic irq handler Grygorii Strashko
2015-09-25 19:28   ` Grygorii Strashko
2015-10-02 20:17   ` Linus Walleij
2015-10-02 22:40     ` Grygorii Strashko
2015-10-02 22:40       ` Grygorii Strashko
2015-10-12  7:52       ` Thomas Gleixner
2015-10-13 18:25         ` Grygorii Strashko
2015-10-13 18:25           ` Grygorii Strashko
2015-10-13 18:33           ` Thomas Gleixner
2015-10-15 16:33             ` Grygorii Strashko
2015-10-15 16:33               ` Grygorii Strashko
2015-12-11 16:57               ` Sebastian Andrzej Siewior
2015-12-12  8:30                 ` Grygorii Strashko
2015-12-12  8:30                   ` Grygorii Strashko
2015-12-22 15:27                   ` Sebastian Andrzej Siewior
2015-09-25 20:36 ` [PATCH 0/2] " santosh.shilimkar

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.