]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
staging: unisys: visorbus: visorchannel: Refactor locking code to be statically deter...
authorCathal Mullaney <chuckleberryfinn@gmail.com>
Wed, 19 Oct 2016 21:43:25 +0000 (22:43 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 25 Oct 2016 08:53:27 +0000 (10:53 +0200)
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>
Tested-by: David Kershner <david.kershner@unisys.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/unisys/visorbus/visorchannel.c

index a1381eb816748c7e6f055ae9780aa3b27cc53323..a41115733a50d6bd3e88fcc2a944927f9729eab4 100644 (file)
@@ -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;
+       bool rc;
+       unsigned long flags;
 
-       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;
 }