public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] staging: unisys: visorbus: visorchannel: Refactor locking code to be statically deterministic.
@ 2016-10-19 11:30 Cathal Mullaney
  2016-10-19 17:00 ` Sell, Timothy C
  2016-10-19 21:43 ` [PATCH v2] " Cathal Mullaney
  0 siblings, 2 replies; 6+ messages in thread
From: Cathal Mullaney @ 2016-10-19 11:30 UTC (permalink / raw)
  To: david.kershner
  Cc: gregkh, sparmaintainer, devel, linux-kernel, Cathal Mullaney

This patch makes locking in visorchannel_signalempty statically deterministic.
As a result this patch fixes the sparse warning:
Context imbalance in 'visorchannel_signalempty' - different lock contexts for basic block.

The logic of the locking code doesn't change but the layout of the original code is "frowned upon"
according to mails on sparse context checking.
Refactoring removes the warning and makes the code more readable.

Signed-off-by: Cathal Mullaney <chuckleberryfinn@gmail.com>
---
 drivers/staging/unisys/visorbus/visorchannel.c | 26 +++++++++++++++++---------
 1 file changed, 17 insertions(+), 9 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorchannel.c b/drivers/staging/unisys/visorbus/visorchannel.c
index a1381eb..1eea5d8 100644
--- a/drivers/staging/unisys/visorbus/visorchannel.c
+++ b/drivers/staging/unisys/visorbus/visorchannel.c
@@ -300,22 +300,30 @@ EXPORT_SYMBOL_GPL(visorchannel_signalremove);
  * Return: boolean indicating whether any messages in the designated
  *         channel/queue are present
  */
+
+static bool
+queue_empty(struct visorchannel *channel, u32 queue)
+{
+	struct signal_queue_header sig_hdr;
+
+	if (sig_read_header(channel, queue, &sig_hdr))
+		return true;
+
+	return (sig_hdr.head == sig_hdr.tail);
+}
+
 bool
 visorchannel_signalempty(struct visorchannel *channel, u32 queue)
 {
 	unsigned long flags = 0;
-	struct signal_queue_header sig_hdr;
 	bool rc = false;
 
-	if (channel->needs_lock)
-		spin_lock_irqsave(&channel->remove_lock, flags);
+	if (!channel->needs_lock)
+		return queue_empty(channel, queue);
 
-	if (sig_read_header(channel, queue, &sig_hdr))
-		rc = true;
-	if (sig_hdr.head == sig_hdr.tail)
-		rc = true;
-	if (channel->needs_lock)
-		spin_unlock_irqrestore(&channel->remove_lock, flags);
+	spin_lock_irqsave(&channel->remove_lock, flags);
+	rc = queue_empty(channel, queue);
+	spin_unlock_irqrestore(&channel->remove_lock, flags);
 
 	return rc;
 }
-- 
2.7.4

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

end of thread, other threads:[~2016-10-20  3:10 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-10-19 11:30 [PATCH] staging: unisys: visorbus: visorchannel: Refactor locking code to be statically deterministic Cathal Mullaney
2016-10-19 17:00 ` Sell, Timothy C
2016-10-19 21:56   ` Chuckleberryfinn
2016-10-19 21:43 ` [PATCH v2] " Cathal Mullaney
2016-10-20  0:04   ` Kershner, David A
2016-10-20  3:10     ` Sell, Timothy C

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox