Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1503963 > unrolled thread

[PATCH] staging: unisys: visorbus: visorchannel: Refactor locking code to be statically deterministic.

Started byCathal Mullaney <chuckleberryfinn@gmail.com>
First post2016-10-19 17:50 +0200
Last post2016-10-20 05:20 +0200
Articles 6 — 4 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] staging: unisys: visorbus: visorchannel: Refactor locking code to be statically deterministic. Cathal Mullaney <chuckleberryfinn@gmail.com> - 2016-10-19 17:50 +0200
    RE: [PATCH] staging: unisys: visorbus: visorchannel: Refactor locking  code to be statically deterministic. "Sell, Timothy C" <Timothy.Sell@unisys.com> - 2016-10-19 22:40 +0200
      Re: [PATCH] staging: unisys: visorbus: visorchannel: Refactor  locking code to be statically deterministic. Chuckleberryfinn <chuckleberryfinn@gmail.com> - 2016-10-20 00:00 +0200
    [PATCH v2] staging: unisys: visorbus: visorchannel: Refactor locking code to be statically deterministic. Cathal Mullaney <chuckleberryfinn@gmail.com> - 2016-10-19 23:50 +0200
      RE: [PATCH v2] staging: unisys: visorbus: visorchannel: Refactor  locking code to be statically deterministic. "Kershner, David A" <David.Kershner@unisys.com> - 2016-10-20 04:40 +0200
        RE: [PATCH v2] staging: unisys: visorbus: visorchannel: Refactor  locking code to be statically deterministic. "Sell, Timothy C" <Timothy.Sell@unisys.com> - 2016-10-20 05:20 +0200

#1503963 — [PATCH] staging: unisys: visorbus: visorchannel: Refactor locking code to be statically deterministic.

FromCathal Mullaney <chuckleberryfinn@gmail.com>
Date2016-10-19 17:50 +0200
Subject[PATCH] staging: unisys: visorbus: visorchannel: Refactor locking code to be statically deterministic.
Message-ID<su1hU-3b7-31@gated-at.bofh.it>
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

[toc] | [next] | [standalone]


#1504325 — RE: [PATCH] staging: unisys: visorbus: visorchannel: Refactor locking code to be statically deterministic.

From"Sell, Timothy C" <Timothy.Sell@unisys.com>
Date2016-10-19 22:40 +0200
SubjectRE: [PATCH] staging: unisys: visorbus: visorchannel: Refactor locking code to be statically deterministic.
Message-ID<su5Ox-6he-15@gated-at.bofh.it>
In reply to#1503963
On Wednesday, October 19, 2016 7:31 AM, Cathal Mullaney wrote:
> 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 @@
> ---
>  bool
>  visorchannel_signalempty(struct visorchannel *channel, u32 queue)
>  {
>  	unsigned long flags = 0;
> -	struct signal_queue_header sig_hdr;
>  	bool rc = false;

It appears as if you no longer need to initialize 'rc' above.

Although this is NOT caused by your patch, it also looks like 'flags'
is being unnecessarily initialized.  You may want to fix that too
while you're in the neighborhood.

(Kernel folks seem to frown on unnecessary variable initializations.)

> 
> -	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

Besides that, your patch looks good to me.  Thanks.

- Tim Sell

[toc] | [prev] | [next] | [standalone]


#1504358 — Re: [PATCH] staging: unisys: visorbus: visorchannel: Refactor locking code to be statically deterministic.

FromChuckleberryfinn <chuckleberryfinn@gmail.com>
Date2016-10-20 00:00 +0200
SubjectRe: [PATCH] staging: unisys: visorbus: visorchannel: Refactor locking code to be statically deterministic.
Message-ID<su73X-6Yk-3@gated-at.bofh.it>
In reply to#1504325
On Wed, Oct 19, 2016 at 05:00:53PM +0000, Sell, Timothy C wrote:
> On Wednesday, October 19, 2016 7:31 AM, Cathal Mullaney wrote:
> > 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 @@
> > ---
> >  bool
> >  visorchannel_signalempty(struct visorchannel *channel, u32 queue)
> >  {
> >  	unsigned long flags = 0;
> > -	struct signal_queue_header sig_hdr;
> >  	bool rc = false;
> 
> It appears as if you no longer need to initialize 'rc' above.
> 
> Although this is NOT caused by your patch, it also looks like 'flags'
> is being unnecessarily initialized.  You may want to fix that too
> while you're in the neighborhood.
> 
> (Kernel folks seem to frown on unnecessary variable initializations.)
> 
> > 
> > -	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
> 
> Besides that, your patch looks good to me.  Thanks.
> 
> - Tim Sell
>

Thanks for your feedback Tim.
Submitted v2 with the suggested updates.
Thanks again.

Kind regards,
Cathal

[toc] | [prev] | [next] | [standalone]


#1504356 — [PATCH v2] staging: unisys: visorbus: visorchannel: Refactor locking code to be statically deterministic.

FromCathal Mullaney <chuckleberryfinn@gmail.com>
Date2016-10-19 23:50 +0200
Subject[PATCH v2] staging: unisys: visorbus: visorchannel: Refactor locking code to be statically deterministic.
Message-ID<su6Uh-6V4-13@gated-at.bofh.it>
In reply to#1503963
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>
---
V2: Removed unnecessary variable initialization, as suggested by Tim Sell <Timothy.Sell@unisys.com>.

 drivers/staging/unisys/visorbus/visorchannel.c | 30 ++++++++++++++++----------
 1 file changed, 19 insertions(+), 11 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorchannel.c b/drivers/staging/unisys/visorbus/visorchannel.c
index a1381eb..a411157 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;
+	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;
 }
-- 
2.7.4

[toc] | [prev] | [next] | [standalone]


#1504464 — RE: [PATCH v2] staging: unisys: visorbus: visorchannel: Refactor locking code to be statically deterministic.

From"Kershner, David A" <David.Kershner@unisys.com>
Date2016-10-20 04:40 +0200
SubjectRE: [PATCH v2] staging: unisys: visorbus: visorchannel: Refactor locking code to be statically deterministic.
Message-ID<subqW-1tl-9@gated-at.bofh.it>
In reply to#1504356
> -----Original Message-----
> From: Cathal Mullaney [mailto:chuckleberryfinn@gmail.com]
> Subject: [PATCH v2] staging: unisys: visorbus: visorchannel: Refactor locking
> code to be statically deterministic.
> 
> 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>

> ---
> V2: Removed unnecessary variable initialization, as suggested by Tim Sell
> <Timothy.Sell@unisys.com>.
> 
>  drivers/staging/unisys/visorbus/visorchannel.c | 30 ++++++++++++++++----
> ------

[toc] | [prev] | [next] | [standalone]


#1504484 — RE: [PATCH v2] staging: unisys: visorbus: visorchannel: Refactor locking code to be statically deterministic.

From"Sell, Timothy C" <Timothy.Sell@unisys.com>
Date2016-10-20 05:20 +0200
SubjectRE: [PATCH v2] staging: unisys: visorbus: visorchannel: Refactor locking code to be statically deterministic.
Message-ID<suc3D-1Vt-3@gated-at.bofh.it>
In reply to#1504464
> -----Original Message-----
> From: Kershner, David A
> Sent: Wednesday, October 19, 2016 8:04 PM
> To: Cathal Mullaney <chuckleberryfinn@gmail.com>

> Subject: RE: [PATCH v2] staging: unisys: visorbus: visorchannel: Refactor
> locking code to be statically deterministic.
> 
> > -----Original Message-----
> > From: Cathal Mullaney [mailto:chuckleberryfinn@gmail.com]
> > Subject: [PATCH v2] staging: unisys: visorbus: visorchannel: Refactor locking
> > code to be statically deterministic.
> >
> > 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>
> 
> > ---
> > V2: Removed unnecessary variable initialization, as suggested by Tim Sell
> > <Timothy.Sell@unisys.com>.
> >
> >  drivers/staging/unisys/visorbus/visorchannel.c | 30 ++++++++++++++++--
> --
> > ------

Thanks for the quick turnaround, folks.
v2 looks great to me.

- Tim Sell

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web