[PATCH v1] ibmvnic: remove excessive irqsave

Subsystems: ibm power sriov virtual nic device driver, linux for powerpc (32-bit and 64-bit), networking drivers, the rest

STALE2005d

3 messages, 3 authors, 2021-03-05 · open the first message on its own page

[PATCH v1] ibmvnic: remove excessive irqsave

From: angkery <hidden>
Date: 2021-03-05 16:40:50

From: Junlin Yang <redacted>

ibmvnic_remove locks multiple spinlocks while disabling interrupts:
spin_lock_irqsave(&adapter->state_lock, flags);
spin_lock_irqsave(&adapter->rwi_lock, flags);

As reported by coccinelle, the second _irqsave() overwrites the value
saved in 'flags' by the first _irqsave(),   therefore when the second
_irqrestore() comes,the value in 'flags' is not valid,the value saved
by the first _irqsave() has been lost.
This likely leads to IRQs remaining disabled. So remove the second
_irqsave():
spin_lock_irqsave(&adapter->state_lock, flags);
spin_lock(&adapter->rwi_lock);

Generated by: ./scripts/coccinelle/locks/flags.cocci
./drivers/net/ethernet/ibm/ibmvnic.c:5413:1-18:
ERROR: nested lock+irqsave that reuses flags from line 5404.

Fixes: 4a41c421f367 ("ibmvnic: serialize access to work queue on remove")
Signed-off-by: Junlin Yang <redacted>
---
Changes in v1:
	a.According to Christophe Leroy's explanation, update the commit information.
	b.Add fixes tags.

 drivers/net/ethernet/ibm/ibmvnic.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 2464c8a..a52668d 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -5408,9 +5408,9 @@ static void ibmvnic_remove(struct vio_dev *dev)
 	 * after setting state, so __ibmvnic_reset() which is called
 	 * from the flush_work() below, can make progress.
 	 */
-	spin_lock_irqsave(&adapter->rwi_lock, flags);
+	spin_lock(&adapter->rwi_lock);
 	adapter->state = VNIC_REMOVING;
-	spin_unlock_irqrestore(&adapter->rwi_lock, flags);
+	spin_unlock(&adapter->rwi_lock);
 
 	spin_unlock_irqrestore(&adapter->state_lock, flags);
 
-- 
1.9.1

Re: [PATCH v1] ibmvnic: remove excessive irqsave

From: patchwork-bot+netdevbpf@kernel.org
Date: 2021-03-05 21:11:41

Hello:

This patch was applied to netdev/net.git (refs/heads/master):

On Fri,  5 Mar 2021 16:48:39 +0800 you wrote:
From: Junlin Yang <redacted>

ibmvnic_remove locks multiple spinlocks while disabling interrupts:
spin_lock_irqsave(&adapter->state_lock, flags);
spin_lock_irqsave(&adapter->rwi_lock, flags);

As reported by coccinelle, the second _irqsave() overwrites the value
saved in 'flags' by the first _irqsave(),   therefore when the second
_irqrestore() comes,the value in 'flags' is not valid,the value saved
by the first _irqsave() has been lost.
This likely leads to IRQs remaining disabled. So remove the second
_irqsave():
spin_lock_irqsave(&adapter->state_lock, flags);
spin_lock(&adapter->rwi_lock);

[...]
Here is the summary with links:
  - [v1] ibmvnic: remove excessive irqsave
    https://git.kernel.org/netdev/net/c/69cdb7947adb

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html

Re: [PATCH v1] ibmvnic: remove excessive irqsave

From: Lijun Pan <hidden>
Date: 2021-03-05 22:50:33

<html><head></head><body dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;"><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;"><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;"><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Mar 5, 2021, at 2:48 AM, angkery &lt;<a href="mailto:angkery@163.com" class="">angkery@163.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">From: Junlin Yang &lt;<a href="mailto:yangjunlin@yulong.com" class="">yangjunlin@yulong.com</a>&gt;<br class=""><br class="">ibmvnic_remove locks multiple spinlocks while disabling interrupts:<br class="">spin_lock_irqsave(&amp;adapter-&gt;state_lock, flags);<br class="">spin_lock_irqsave(&amp;adapter-&gt;rwi_lock, flags);<br class=""><br class="">As reported by coccinelle, the second _irqsave() overwrites the value<br class="">saved in 'flags' by the first _irqsave(), &nbsp;&nbsp;therefore when the second<br class="">_irqrestore() comes,the value in 'flags' is not valid,the value saved<br class="">by the first _irqsave() has been lost.<br class="">This likely leads to IRQs remaining disabled. So remove the second<br class="">_irqsave():<br class="">spin_lock_irqsave(&amp;adapter-&gt;state_lock, flags);<br class="">spin_lock(&amp;adapter-&gt;rwi_lock);<br class=""><br class="">Generated by: ./scripts/coccinelle/locks/flags.cocci<br class="">./drivers/net/ethernet/ibm/ibmvnic.c:5413:1-18:<br class="">ERROR: nested lock+irqsave that reuses flags from line 5404.<br class=""><br class="">Fixes: 4a41c421f367 ("ibmvnic: serialize access to work queue on remove")<br class="">Signed-off-by: Junlin Yang &lt;<a href="mailto:yangjunlin@yulong.com" class="">yangjunlin@yulong.com</a>&gt;<br class="">---<br class=""></div></div></blockquote><div><br class=""></div><div>Acked-by: Lijun Pan &lt;<a href="mailto:ljp@linux.ibm" class="">ljp@linux.ibm</a>.com&gt;</div><br class=""><blockquote type="cite" class=""><div class=""><div class="">Changes in v1:<br class=""><span class="Apple-tab-span" style="white-space:pre">	</span>a.According to Christophe Leroy's explanation, update the commit information.<br class=""><span class="Apple-tab-span" style="white-space:pre">	</span>b.Add fixes tags.<br class=""><br class=""> drivers/net/ethernet/ibm/ibmvnic.c | 4 ++--<br class=""> 1 file changed, 2 insertions(+), 2 deletions(-)<br class=""><br class="">diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c<br class="">index 2464c8a..a52668d 100644<br class="">--- a/drivers/net/ethernet/ibm/ibmvnic.c<br class="">+++ b/drivers/net/ethernet/ibm/ibmvnic.c<br class="">@@ -5408,9 +5408,9 @@ static void ibmvnic_remove(struct vio_dev *dev)<br class=""> <span class="Apple-tab-span" style="white-space:pre">	</span> * after setting state, so __ibmvnic_reset() which is called<br class=""> <span class="Apple-tab-span" style="white-space:pre">	</span> * from the flush_work() below, can make progress.<br class=""> <span class="Apple-tab-span" style="white-space:pre">	</span> */<br class="">-<span class="Apple-tab-span" style="white-space:pre">	</span>spin_lock_irqsave(&amp;adapter-&gt;rwi_lock, flags);<br class="">+<span class="Apple-tab-span" style="white-space:pre">	</span>spin_lock(&amp;adapter-&gt;rwi_lock);<br class=""> <span class="Apple-tab-span" style="white-space:pre">	</span>adapter-&gt;state = VNIC_REMOVING;<br class="">-<span class="Apple-tab-span" style="white-space:pre">	</span>spin_unlock_irqrestore(&amp;adapter-&gt;rwi_lock, flags);<br class="">+<span class="Apple-tab-span" style="white-space:pre">	</span>spin_unlock(&amp;adapter-&gt;rwi_lock);<br class=""><br class=""> <span class="Apple-tab-span" style="white-space:pre">	</span>spin_unlock_irqrestore(&amp;adapter-&gt;state_lock, flags);<br class=""><br class="">-- <br class="">1.9.1<br class=""><br class=""><br class=""></div></div></blockquote></div><br class=""></div></div></div></body></html>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help