netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net 0/3] net/smc: fixes for -net
@ 2019-10-09  8:04 Karsten Graul
  2019-10-09  8:04 ` [PATCH net 1/3] net/smc: fix SMCD link group creation with VLAN id Karsten Graul
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Karsten Graul @ 2019-10-09  8:04 UTC (permalink / raw)
  To: davem; +Cc: netdev, linux-s390, gor, heiko.carstens, raspl, ubraun

Fixes for -net, more info in commit logs.

Karsten Graul (2):
  net/smc: receive returns without data
  net/smc: receive pending data after RCV_SHUTDOWN

Ursula Braun (1):
  net/smc: fix SMCD link group creation with VLAN id

 net/smc/smc_core.c |  5 ++++-
 net/smc/smc_rx.c   | 29 +++++++++++++++++++++--------
 2 files changed, 25 insertions(+), 9 deletions(-)

-- 
2.17.1


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

* [PATCH net 1/3] net/smc: fix SMCD link group creation with VLAN id
  2019-10-09  8:04 [PATCH net 0/3] net/smc: fixes for -net Karsten Graul
@ 2019-10-09  8:04 ` Karsten Graul
  2019-10-09  8:04 ` [PATCH net 2/3] net/smc: receive returns without data Karsten Graul
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Karsten Graul @ 2019-10-09  8:04 UTC (permalink / raw)
  To: davem; +Cc: netdev, linux-s390, gor, heiko.carstens, raspl, ubraun

From: Ursula Braun <ubraun@linux.ibm.com>

If creation of an SMCD link group with VLAN id fails, the initial
smc_ism_get_vlan() step has to be reverted as well.

Signed-off-by: Ursula Braun <ubraun@linux.ibm.com>
Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
---
 net/smc/smc_core.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c
index 4ca50ddf8d16..88556f0251ab 100644
--- a/net/smc/smc_core.c
+++ b/net/smc/smc_core.c
@@ -213,7 +213,7 @@ static int smc_lgr_create(struct smc_sock *smc, struct smc_init_info *ini)
 	lgr = kzalloc(sizeof(*lgr), GFP_KERNEL);
 	if (!lgr) {
 		rc = SMC_CLC_DECL_MEM;
-		goto out;
+		goto ism_put_vlan;
 	}
 	lgr->is_smcd = ini->is_smcd;
 	lgr->sync_err = 0;
@@ -289,6 +289,9 @@ static int smc_lgr_create(struct smc_sock *smc, struct smc_init_info *ini)
 	smc_llc_link_clear(lnk);
 free_lgr:
 	kfree(lgr);
+ism_put_vlan:
+	if (ini->is_smcd && ini->vlan_id)
+		smc_ism_put_vlan(ini->ism_dev, ini->vlan_id);
 out:
 	if (rc < 0) {
 		if (rc == -ENOMEM)
-- 
2.17.1


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

* [PATCH net 2/3] net/smc: receive returns without data
  2019-10-09  8:04 [PATCH net 0/3] net/smc: fixes for -net Karsten Graul
  2019-10-09  8:04 ` [PATCH net 1/3] net/smc: fix SMCD link group creation with VLAN id Karsten Graul
@ 2019-10-09  8:04 ` Karsten Graul
  2019-10-09  8:04 ` [PATCH net 3/3] net/smc: receive pending data after RCV_SHUTDOWN Karsten Graul
  2019-10-10  2:02 ` [PATCH net 0/3] net/smc: fixes for -net Jakub Kicinski
  3 siblings, 0 replies; 5+ messages in thread
From: Karsten Graul @ 2019-10-09  8:04 UTC (permalink / raw)
  To: davem; +Cc: netdev, linux-s390, gor, heiko.carstens, raspl, ubraun

smc_cdc_rxed_any_close_or_senddone() is used as an end condition for the
receive loop. This conflicts with smc_cdc_msg_recv_action() which could
run in parallel and set the bits checked by
smc_cdc_rxed_any_close_or_senddone() before the receive is processed.
In that case we could return from receive with no data, although data is
available. The same applies to smc_rx_wait().
Fix this by checking for RCV_SHUTDOWN only, which is set in
smc_cdc_msg_recv_action() after the receive was actually processed.

Reviewed-by: Ursula Braun <ubraun@linux.ibm.com>
Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
---
 net/smc/smc_rx.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/net/smc/smc_rx.c b/net/smc/smc_rx.c
index 413a6abf227e..000002642288 100644
--- a/net/smc/smc_rx.c
+++ b/net/smc/smc_rx.c
@@ -211,8 +211,7 @@ int smc_rx_wait(struct smc_sock *smc, long *timeo,
 	rc = sk_wait_event(sk, timeo,
 			   sk->sk_err ||
 			   sk->sk_shutdown & RCV_SHUTDOWN ||
-			   fcrit(conn) ||
-			   smc_cdc_rxed_any_close_or_senddone(conn),
+			   fcrit(conn),
 			   &wait);
 	remove_wait_queue(sk_sleep(sk), &wait);
 	sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk);
@@ -310,7 +309,6 @@ int smc_rx_recvmsg(struct smc_sock *smc, struct msghdr *msg,
 			smc_rx_update_cons(smc, 0);
 
 		if (sk->sk_shutdown & RCV_SHUTDOWN ||
-		    smc_cdc_rxed_any_close_or_senddone(conn) ||
 		    conn->local_tx_ctrl.conn_state_flags.peer_conn_abort)
 			break;
 
-- 
2.17.1


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

* [PATCH net 3/3] net/smc: receive pending data after RCV_SHUTDOWN
  2019-10-09  8:04 [PATCH net 0/3] net/smc: fixes for -net Karsten Graul
  2019-10-09  8:04 ` [PATCH net 1/3] net/smc: fix SMCD link group creation with VLAN id Karsten Graul
  2019-10-09  8:04 ` [PATCH net 2/3] net/smc: receive returns without data Karsten Graul
@ 2019-10-09  8:04 ` Karsten Graul
  2019-10-10  2:02 ` [PATCH net 0/3] net/smc: fixes for -net Jakub Kicinski
  3 siblings, 0 replies; 5+ messages in thread
From: Karsten Graul @ 2019-10-09  8:04 UTC (permalink / raw)
  To: davem; +Cc: netdev, linux-s390, gor, heiko.carstens, raspl, ubraun

smc_rx_recvmsg() first checks if data is available, and then if
RCV_SHUTDOWN is set. There is a race when smc_cdc_msg_recv_action() runs
in between these 2 checks, receives data and sets RCV_SHUTDOWN.
In that case smc_rx_recvmsg() would return from receive without to
process the available data.
Fix that with a final check for data available if RCV_SHUTDOWN is set.
Move the check for data into a function and call it twice.
And use the existing helper smc_rx_data_available().

Reviewed-by: Ursula Braun <ubraun@linux.ibm.com>
Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
---
 net/smc/smc_rx.c | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/net/smc/smc_rx.c b/net/smc/smc_rx.c
index 000002642288..97e8369002d7 100644
--- a/net/smc/smc_rx.c
+++ b/net/smc/smc_rx.c
@@ -261,6 +261,18 @@ static int smc_rx_recv_urg(struct smc_sock *smc, struct msghdr *msg, int len,
 	return -EAGAIN;
 }
 
+static bool smc_rx_recvmsg_data_available(struct smc_sock *smc)
+{
+	struct smc_connection *conn = &smc->conn;
+
+	if (smc_rx_data_available(conn))
+		return true;
+	else if (conn->urg_state == SMC_URG_VALID)
+		/* we received a single urgent Byte - skip */
+		smc_rx_update_cons(smc, 0);
+	return false;
+}
+
 /* smc_rx_recvmsg - receive data from RMBE
  * @msg:	copy data to receive buffer
  * @pipe:	copy data to pipe if set - indicates splice() call
@@ -302,15 +314,18 @@ int smc_rx_recvmsg(struct smc_sock *smc, struct msghdr *msg,
 		if (read_done >= target || (pipe && read_done))
 			break;
 
-		if (atomic_read(&conn->bytes_to_rcv))
+		if (smc_rx_recvmsg_data_available(smc))
 			goto copy;
-		else if (conn->urg_state == SMC_URG_VALID)
-			/* we received a single urgent Byte - skip */
-			smc_rx_update_cons(smc, 0);
 
 		if (sk->sk_shutdown & RCV_SHUTDOWN ||
-		    conn->local_tx_ctrl.conn_state_flags.peer_conn_abort)
+		    conn->local_tx_ctrl.conn_state_flags.peer_conn_abort) {
+			/* smc_cdc_msg_recv_action() could have run after
+			 * above smc_rx_recvmsg_data_available()
+			 */
+			if (smc_rx_recvmsg_data_available(smc))
+				goto copy;
 			break;
+		}
 
 		if (read_done) {
 			if (sk->sk_err ||
-- 
2.17.1


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

* Re: [PATCH net 0/3] net/smc: fixes for -net
  2019-10-09  8:04 [PATCH net 0/3] net/smc: fixes for -net Karsten Graul
                   ` (2 preceding siblings ...)
  2019-10-09  8:04 ` [PATCH net 3/3] net/smc: receive pending data after RCV_SHUTDOWN Karsten Graul
@ 2019-10-10  2:02 ` Jakub Kicinski
  3 siblings, 0 replies; 5+ messages in thread
From: Jakub Kicinski @ 2019-10-10  2:02 UTC (permalink / raw)
  To: Karsten Graul
  Cc: davem, netdev, linux-s390, gor, heiko.carstens, raspl, ubraun

On Wed,  9 Oct 2019 10:04:38 +0200, Karsten Graul wrote:
> Fixes for -net, more info in commit logs.

Please write a sentence or two describing the nature of the fixes.
This message ends up in merge commits in the tree, pointing at the
commits themselves is unhelpful.

Please provide Fixes tags pointing at the commit which introduced the
bug in all of the patches.

Thank you.

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

end of thread, other threads:[~2019-10-10  2:04 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-09  8:04 [PATCH net 0/3] net/smc: fixes for -net Karsten Graul
2019-10-09  8:04 ` [PATCH net 1/3] net/smc: fix SMCD link group creation with VLAN id Karsten Graul
2019-10-09  8:04 ` [PATCH net 2/3] net/smc: receive returns without data Karsten Graul
2019-10-09  8:04 ` [PATCH net 3/3] net/smc: receive pending data after RCV_SHUTDOWN Karsten Graul
2019-10-10  2:02 ` [PATCH net 0/3] net/smc: fixes for -net Jakub Kicinski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).