Patch "powerpc/rtas: Introduce rtas_get_sensor_fast() for IRQ handlers" has been added to the 3.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
powerpc/rtas: Introduce rtas_get_sensor_fast() for IRQ handlers
to the 3.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
powerpc-rtas-introduce-rtas_get_sensor_fast-for-irq-handlers.patch
and it can be found in the queue-3.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
1c2cb594441d02815d304cccec9742ff5c707495Mon Sep 17 00:00:00 2001
From: Thomas Huth <[email protected]>
Date: Fri, 17 Jul 2015 12:46:58 +0200
Subject: powerpc/rtas: Introduce rtas_get_sensor_fast() for IRQ handlers
From: Thomas Huth <[email protected]>
commit 1c2cb594441d02815d304cccec9742ff5c707495 upstream.
The EPOW interrupt handler uses rtas_get_sensor(), which in turn uses rtas_busy_delay() to wait for RTAS becoming ready in case it is necessary. But rtas_busy_delay() is annotated with might_sleep() and thus may not be used by interrupts handlers like the EPOW handler! This leads to the following BUG when CONFIG_DEBUG_ATOMIC_SLEEP is enabled:
BUG: sleeping function called from invalid context at arch/powerpc/kernel/rtas.c:496 in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: swapper/1 CPU: 1 PID: 0 Comm: swapper/1 Not tainted 4.2.0-rc2-thuth #6 Call Trace: [c00000007ffe7b90] [c000000000807670] dump_stack+0xa0/0xdc (unreliable) [c00000007ffe7bc0] [c0000000000e1f14] ___might_sleep+0x134/0x180 [c00000007ffe7c20] [c00000000002aec0] rtas_busy_delay+0x30/0xd0 [c00000007ffe7c50] [c00000000002bde4] rtas_get_sensor+0x74/0xe0 [c00000007ffe7ce0] [c000000000083264] ras_epow_interrupt+0x44/0x450 [c00000007ffe7d90] [c000000000120260] handle_irq_event_percpu+0xa0/0x300 [c00000007ffe7e70] [c000000000120524] handle_irq_event+0x64/0xc0 [c00000007ffe7eb0] [c000000000124dbc] handle_fasteoi_irq+0xec/0x260 [c00000007ffe7ef0] [c00000000011f4f0] generic_handle_irq+0x50/0x80 [c00000007ffe7f20] [c000000000010f3c] __do_irq+0x8c/0x200 [c00000007ffe7f90] [c0000000000236cc] call_do_irq+0x14/0x24 [c00000007e6f39e0] [c000000000011144] do_IRQ+0x94/0x110 [c00000007e6f3a30] [c000000000002594] hardware_interrupt_common+0x114/0x180
Fix this issue by introducing a new rtas_get_sensor_fast() function that does not use rtas_busy_delay() - and thus can only be used for sensors that do not cause a BUSY condition - known as "fast" sensors.
The EPOW sensor is defined to be "fast" in sPAPR - mpe.
--- arch/powerpc/include/asm/rtas.h | 1 + arch/powerpc/kernel/rtas.c | 17 +++++++++++++++++ arch/powerpc/platforms/pseries/ras.c | 3 ++- 3 files changed, 20 insertions(+), 1 deletion(-)
arch/powerpc/include/asm/rtas.h +1 -0
@@ -255,6 +255,7 @@ extern void rtas_power_off(void);extern void rtas_halt (void );extern void rtas_os_term (char *str);extern int rtas_get_sensor (int sensor,int index,int *state); +extern int rtas_get_sensor_fast (int sensor,int index,int *state);extern int rtas_get_power_level (int powerdomain,int *level);extern int rtas_set_power_level (int powerdomain,int level,int *setlevel);extern bool rtas_indicator_present (int token,int *maxindex);
arch/powerpc/kernel/rtas.c +17 -0
@@ -584,6 +584,23 @@ int rtas_get_sensor(int sensor, int inde }EXPORT_SYMBOL (rtas_get_sensor); +int rtas_get_sensor_fast (int sensor,int index,int *state) +{ +int token =rtas_token ("get-sensor-state" ); +int rc; + +if (token ==RTAS_UNKNOWN_SERVICE ) +return -ENOENT ; + + rc =rtas_call (token,2 ,2 , state, sensor, index); +WARN_ON (rc ==RTAS_BUSY || (rc >=RTAS_EXTENDED_DELAY_MIN && + rc <=RTAS_EXTENDED_DELAY_MAX )); + +if (rc <0 ) +return rtas_error_rc (rc); +return rc; +} +bool rtas_indicator_present (int token,int *maxindex) {int proplen, count, i;
arch/powerpc/platforms/pseries/ras.c +2 -1
@@ -187,7 +187,8 @@ static irqreturn_t ras_epow_interrupt(inint state;int critical; - status =rtas_get_sensor (EPOW_SENSOR_TOKEN ,EPOW_SENSOR_INDEX , &state); + status =rtas_get_sensor_fast (EPOW_SENSOR_TOKEN ,EPOW_SENSOR_INDEX , + &state);if (state >3 ) critical =1 ;/* Time Critical */
Patches currently in stable-queue which might be from [email protected] are
queue-3.14/powerpc-rtas-introduce-rtas_get_sensor_fast-for-irq-handlers.patch