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


Groups > linux.kernel > #1605514 > unrolled thread

[PATCH 1/3] mailbox: always wait in mbox_send_message for blocking Tx mode

Started bySudeep Holla <sudeep.holla@arm.com>
First post2017-03-21 12:40 +0100
Last post2017-03-21 12:40 +0100
Articles 3 — 1 participant

Back to article view | Back to linux.kernel


Contents

  [PATCH 1/3] mailbox: always wait in mbox_send_message for blocking Tx mode Sudeep Holla <sudeep.holla@arm.com> - 2017-03-21 12:40 +0100
    [PATCH 2/3] mailbox: skip complete wait event if timer expired Sudeep Holla <sudeep.holla@arm.com> - 2017-03-21 12:40 +0100
    [PATCH 3/3] mailbox: handle empty message in tx_tick Sudeep Holla <sudeep.holla@arm.com> - 2017-03-21 12:40 +0100

#1605514 — [PATCH 1/3] mailbox: always wait in mbox_send_message for blocking Tx mode

FromSudeep Holla <sudeep.holla@arm.com>
Date2017-03-21 12:40 +0100
Subject[PATCH 1/3] mailbox: always wait in mbox_send_message for blocking Tx mode
Message-ID<tnqiR-2Gb-5@gated-at.bofh.it>
There exists a race when msg_submit return immediately as there was an
active request being processed which may have completed just before it's
checked again in mbox_send_message. This will result in return to the
caller without waiting in mbox_send_message even when it's blocking Tx.

This patch fixes the issue by waiting for the completion always if Tx
is in blocking mode.

Fixes: 2b6d83e2b8b7 ("mailbox: Introduce framework for mailbox")
Cc: Jassi Brar <jassisinghbrar@gmail.com>
Reported-by: Alexey Klimov <alexey.klimov@arm.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
---
 drivers/mailbox/mailbox.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Hi Jassi,

Here are fixes for few issues we encountered when dealing with multiple
requests on multiple channels simultaneously.

Regards,
Sudeep

diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c
index 4671f8a12872..160d6640425a 100644
--- a/drivers/mailbox/mailbox.c
+++ b/drivers/mailbox/mailbox.c
@@ -260,7 +260,7 @@ int mbox_send_message(struct mbox_chan *chan, void *mssg)

 	msg_submit(chan);

-	if (chan->cl->tx_block && chan->active_req) {
+	if (chan->cl->tx_block) {
 		unsigned long wait;
 		int ret;

--
2.7.4

[toc] | [next] | [standalone]


#1605515 — [PATCH 2/3] mailbox: skip complete wait event if timer expired

FromSudeep Holla <sudeep.holla@arm.com>
Date2017-03-21 12:40 +0100
Subject[PATCH 2/3] mailbox: skip complete wait event if timer expired
Message-ID<tnqiR-2Gb-7@gated-at.bofh.it>
In reply to#1605514
If a wait_for_completion_timeout() call returns due to a timeout,
complete() can get called after returning from the wait which is
incorrect and can cause subsequent transmissions on a channel to fail.
Since the wait_for_completion_timeout() sees the completion variable
is non-zero caused by the erroneous/spurious complete() call, and
it immediately returns without waiting for the time as expected by the
client.

This patch fixes the issue by skipping complete() call for the timer
expiry.

Fixes: 2b6d83e2b8b7 ("mailbox: Introduce framework for mailbox")
Cc: Jassi Brar <jassisinghbrar@gmail.com>
Reported-by: Alexey Klimov <alexey.klimov@arm.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
---
 drivers/mailbox/mailbox.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c
index 160d6640425a..2ed7fa681ecb 100644
--- a/drivers/mailbox/mailbox.c
+++ b/drivers/mailbox/mailbox.c
@@ -107,7 +107,7 @@ static void tx_tick(struct mbox_chan *chan, int r)
 	if (mssg && chan->cl->tx_done)
 		chan->cl->tx_done(chan->cl, mssg, r);
 
-	if (chan->cl->tx_block)
+	if (r != -ETIME && chan->cl->tx_block)
 		complete(&chan->tx_complete);
 }
 
@@ -271,8 +271,8 @@ int mbox_send_message(struct mbox_chan *chan, void *mssg)
 
 		ret = wait_for_completion_timeout(&chan->tx_complete, wait);
 		if (ret == 0) {
-			t = -EIO;
-			tx_tick(chan, -EIO);
+			t = -ETIME;
+			tx_tick(chan, t);
 		}
 	}
 
-- 
2.7.4

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


#1605518 — [PATCH 3/3] mailbox: handle empty message in tx_tick

FromSudeep Holla <sudeep.holla@arm.com>
Date2017-03-21 12:40 +0100
Subject[PATCH 3/3] mailbox: handle empty message in tx_tick
Message-ID<tnqiS-2Gb-25@gated-at.bofh.it>
In reply to#1605514
We already check if the message is empty before calling the client
tx_done callback. Calling completion on a wait event is also invalid
if the message is empty.

This patch moves the existing empty message check earlier.

Fixes: 2b6d83e2b8b7 ("mailbox: Introduce framework for mailbox")
Cc: Jassi Brar <jassisinghbrar@gmail.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
---
 drivers/mailbox/mailbox.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c
index 2ed7fa681ecb..5ef014241212 100644
--- a/drivers/mailbox/mailbox.c
+++ b/drivers/mailbox/mailbox.c
@@ -103,8 +103,11 @@ static void tx_tick(struct mbox_chan *chan, int r)
 	/* Submit next message */
 	msg_submit(chan);
 
+	if (!mssg)
+		return;
+
 	/* Notify the client */
-	if (mssg && chan->cl->tx_done)
+	if (chan->cl->tx_done)
 		chan->cl->tx_done(chan->cl, mssg, r);
 
 	if (r != -ETIME && chan->cl->tx_block)
-- 
2.7.4

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web