Patch "s390/cio: fix accidental interrupt enabling during resume" has been added to the 4.8-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
s390/cio: fix accidental interrupt enabling during resume
to the 4.8-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:
s390-cio-fix-accidental-interrupt-enabling-during-resume.patch
and it can be found in the queue-4.8 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
d53c51f26145657aa7c55fa396f93677e613548dMon Sep 17 00:00:00 2001
From: Sebastian Ott <[email protected]>
Date: Wed, 28 Sep 2016 13:36:19 +0200
Subject: s390/cio: fix accidental interrupt enabling during resume
From: Sebastian Ott <[email protected]>
commit d53c51f26145657aa7c55fa396f93677e613548d upstream.
Since commit 9f3d6d7 chsc_get_channel_measurement_chars is called with interrupts disabled during resume from hibernate. Since this function used spin_unlock_irq, interrupts have been enabled accidentally. Fix this by using the irqsave variant.
Since we can't guarantee the IRQ-enablement state for all (future/ external) callers, change the locking in related functions to prevent similar bugs in the future.
--- drivers/s390/cio/chsc.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-)
drivers/s390/cio/chsc.c +12 -8
@@ -95,12 +95,13 @@ struct chsc_ssd_area {int chsc_get_ssd_info (struct subchannel_id schid,struct chsc_ssd_info *ssd) {struct chsc_ssd_area *ssd_area; +unsigned long flags;int ccode;int ret;int i;int mask; -spin_lock_irq (&chsc_page_lock); +spin_lock_irqsave (&chsc_page_lock, flags);memset (chsc_page,0 ,PAGE_SIZE ); ssd_area = chsc_page; ssd_area->request.length =0x0010 ;
@@ -144,7 +145,7 @@ int chsc_get_ssd_info(struct subchannel_ ssd->fla[i] = ssd_area->fla[i]; } out: -spin_unlock_irq (&chsc_page_lock); +spin_unlock_irqrestore (&chsc_page_lock, flags);return ret; }
@@ -832,9 +833,10 @@ int __chsc_do_secm(struct channel_subsys u32 fmt : 4; u32 :16 ; } __attribute__ ((packed)) *secm_area; +unsigned long flags;int ret, ccode; -spin_lock_irq (&chsc_page_lock); +spin_lock_irqsave (&chsc_page_lock, flags);memset (chsc_page,0 ,PAGE_SIZE ); secm_area = chsc_page; secm_area->request.length =0x0050 ;
@@ -864,7 +866,7 @@ int __chsc_do_secm(struct channel_subsysCIO_CRW_EVENT (2 ,"chsc: secm failed (rc=%04x)\n" , secm_area->response.code); out: -spin_unlock_irq (&chsc_page_lock); +spin_unlock_irqrestore (&chsc_page_lock, flags);return ret; }
@@ -992,6 +994,7 @@ chsc_initialize_cmg_chars(struct channelint chsc_get_channel_measurement_chars (struct channel_path *chp) { +unsigned long flags;int ccode, ret;struct {
@@ -1021,7 +1024,7 @@ int chsc_get_channel_measurement_chars(sif (!css_chsc_characteristics.scmc || !css_chsc_characteristics.secm)return -EINVAL ; -spin_lock_irq (&chsc_page_lock); +spin_lock_irqsave (&chsc_page_lock, flags);memset (chsc_page,0 ,PAGE_SIZE ); scmc_area = chsc_page; scmc_area->request.length =0x0010 ;
@@ -1053,7 +1056,7 @@ int chsc_get_channel_measurement_chars(schsc_initialize_cmg_chars (chp, scmc_area->cmcv, (struct cmg_chars *) &scmc_area->data); out: -spin_unlock_irq (&chsc_page_lock); +spin_unlock_irqrestore (&chsc_page_lock, flags);return ret; }
@@ -1134,6 +1137,7 @@ struct css_chsc_char css_chsc_characteriint __init chsc_determine_css_characteristics (void ) { +unsigned long flags;int result;struct {struct chsc_header request;
@@ -1146,7 +1150,7 @@ chsc_determine_css_characteristics(void)u32 chsc_char[508 ]; } __attribute__ ((packed)) *scsc_area; -spin_lock_irq (&chsc_page_lock); +spin_lock_irqsave (&chsc_page_lock, flags);memset (chsc_page,0 ,PAGE_SIZE ); scsc_area = chsc_page; scsc_area->request.length =0x0010 ;
@@ -1168,7 +1172,7 @@ chsc_determine_css_characteristics(void)CIO_CRW_EVENT (2 ,"chsc: scsc failed (rc=%04x)\n" , scsc_area->response.code); exit: -spin_unlock_irq (&chsc_page_lock); +spin_unlock_irqrestore (&chsc_page_lock, flags);return result; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.8/s390-cio-fix-accidental-interrupt-enabling-during-resume.patch