netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Ursula Braun <ubraun@linux.ibm.com>,
	"David S . Miller" <davem@davemloft.net>,
	Sasha Levin <sashal@kernel.org>,
	linux-s390@vger.kernel.org, netdev@vger.kernel.org
Subject: [PATCH AUTOSEL 4.19 184/219] net/smc: fix sender_free computation
Date: Fri, 22 Nov 2019 00:48:36 -0500	[thread overview]
Message-ID: <20191122054911.1750-177-sashal@kernel.org> (raw)
In-Reply-To: <20191122054911.1750-1-sashal@kernel.org>

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

[ Upstream commit b8649efad879c69c7ab1f19ce8814fcabef1f72b ]

In some scenarios a separate consumer cursor update is necessary.
The decision is made in smc_tx_consumer_cursor_update(). The
sender_free computation could be wrong:

The rx confirmed cursor is always smaller than or equal to the
rx producer cursor. The parameters in the smc_curs_diff() call
have to be exchanged, otherwise sender_free might even be negative.

And if more data arrives local_rx_ctrl.prod might be updated, enabling
a cursor difference between local_rx_ctrl.prod and rx confirmed cursor
larger than the RMB size. This case is not covered by smc_curs_diff().
Thus function smc_curs_diff_large() is introduced here.

If a recvmsg() is processed in parallel, local_tx_ctrl.cons might
change during smc_cdc_msg_send. Make sure rx_curs_confirmed is updated
with the actually sent local_tx_ctrl.cons value.

Fixes: e82f2e31f559 ("net/smc: optimize consumer cursor updates")
Signed-off-by: Ursula Braun <ubraun@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 net/smc/smc_cdc.c |  5 +++--
 net/smc/smc_cdc.h | 26 +++++++++++++++++++++++++-
 net/smc/smc_tx.c  |  3 ++-
 3 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/net/smc/smc_cdc.c b/net/smc/smc_cdc.c
index ed5dcf03fe0b6..8f691b5a44ddf 100644
--- a/net/smc/smc_cdc.c
+++ b/net/smc/smc_cdc.c
@@ -96,6 +96,7 @@ int smc_cdc_msg_send(struct smc_connection *conn,
 		     struct smc_wr_buf *wr_buf,
 		     struct smc_cdc_tx_pend *pend)
 {
+	union smc_host_cursor cfed;
 	struct smc_link *link;
 	int rc;
 
@@ -107,10 +108,10 @@ int smc_cdc_msg_send(struct smc_connection *conn,
 	conn->local_tx_ctrl.seqno = conn->tx_cdc_seq;
 	smc_host_msg_to_cdc((struct smc_cdc_msg *)wr_buf,
 			    &conn->local_tx_ctrl, conn);
+	smc_curs_copy(&cfed, &((struct smc_host_cdc_msg *)wr_buf)->cons, conn);
 	rc = smc_wr_tx_send(link, (struct smc_wr_tx_pend_priv *)pend);
 	if (!rc)
-		smc_curs_copy(&conn->rx_curs_confirmed,
-			      &conn->local_tx_ctrl.cons, conn);
+		smc_curs_copy(&conn->rx_curs_confirmed, &cfed, conn);
 
 	return rc;
 }
diff --git a/net/smc/smc_cdc.h b/net/smc/smc_cdc.h
index 934df4473a7ce..2377a51772d51 100644
--- a/net/smc/smc_cdc.h
+++ b/net/smc/smc_cdc.h
@@ -135,7 +135,9 @@ static inline void smc_curs_copy_net(union smc_cdc_cursor *tgt,
 #endif
 }
 
-/* calculate cursor difference between old and new, where old <= new */
+/* calculate cursor difference between old and new, where old <= new and
+ * difference cannot exceed size
+ */
 static inline int smc_curs_diff(unsigned int size,
 				union smc_host_cursor *old,
 				union smc_host_cursor *new)
@@ -160,6 +162,28 @@ static inline int smc_curs_comp(unsigned int size,
 	return smc_curs_diff(size, old, new);
 }
 
+/* calculate cursor difference between old and new, where old <= new and
+ * difference may exceed size
+ */
+static inline int smc_curs_diff_large(unsigned int size,
+				      union smc_host_cursor *old,
+				      union smc_host_cursor *new)
+{
+	if (old->wrap < new->wrap)
+		return min_t(int,
+			     (size - old->count) + new->count +
+			     (new->wrap - old->wrap - 1) * size,
+			     size);
+
+	if (old->wrap > new->wrap) /* wrap has switched from 0xffff to 0x0000 */
+		return min_t(int,
+			     (size - old->count) + new->count +
+			     (new->wrap + 0xffff - old->wrap) * size,
+			     size);
+
+	return max_t(int, 0, (new->count - old->count));
+}
+
 static inline void smc_host_cursor_to_cdc(union smc_cdc_cursor *peer,
 					  union smc_host_cursor *local,
 					  struct smc_connection *conn)
diff --git a/net/smc/smc_tx.c b/net/smc/smc_tx.c
index f1f621675db01..0ecbbdc337b82 100644
--- a/net/smc/smc_tx.c
+++ b/net/smc/smc_tx.c
@@ -595,7 +595,8 @@ void smc_tx_consumer_update(struct smc_connection *conn, bool force)
 	if (to_confirm > conn->rmbe_update_limit) {
 		smc_curs_copy(&prod, &conn->local_rx_ctrl.prod, conn);
 		sender_free = conn->rmb_desc->len -
-			      smc_curs_diff(conn->rmb_desc->len, &prod, &cfed);
+			      smc_curs_diff_large(conn->rmb_desc->len,
+						  &cfed, &prod);
 	}
 
 	if (conn->local_rx_ctrl.prod_flags.cons_curs_upd_req ||
-- 
2.20.1


  parent reply	other threads:[~2019-11-22  6:20 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20191122054911.1750-1-sashal@kernel.org>
2019-11-22  5:46 ` [PATCH AUTOSEL 4.19 044/219] mwifiex: fix potential NULL dereference and use after free Sasha Levin
2019-11-22  5:46 ` [PATCH AUTOSEL 4.19 045/219] mwifiex: debugfs: correct histogram spacing, formatting Sasha Levin
2019-11-22  5:46 ` [PATCH AUTOSEL 4.19 046/219] brcmfmac: set F2 watermark to 256 for 4373 Sasha Levin
2019-11-22  5:46 ` [PATCH AUTOSEL 4.19 047/219] brcmfmac: set SDIO F1 MesBusyCtrl for CYW4373 Sasha Levin
2019-11-22  5:46 ` [PATCH AUTOSEL 4.19 048/219] rtl818x: fix potential use after free Sasha Levin
2019-11-22  5:46 ` [PATCH AUTOSEL 4.19 059/219] iwlwifi: move iwl_nvm_check_version() into dvm Sasha Levin
2019-11-22  5:46 ` [PATCH AUTOSEL 4.19 060/219] iwlwifi: mvm: force TCM re-evaluation on TCM resume Sasha Levin
2019-11-22  5:46 ` [PATCH AUTOSEL 4.19 061/219] iwlwifi: pcie: fix erroneous print Sasha Levin
2019-11-22  5:46 ` [PATCH AUTOSEL 4.19 062/219] iwlwifi: pcie: set cmd_len in the correct place Sasha Levin
2019-11-22  5:46 ` [PATCH AUTOSEL 4.19 067/219] VSOCK: bind to random port for VMADDR_PORT_ANY Sasha Levin
2019-11-22  5:46 ` [PATCH AUTOSEL 4.19 087/219] net/mlx5: Continue driver initialization despite debugfs failure Sasha Levin
2019-11-22  5:47 ` [PATCH AUTOSEL 4.19 088/219] netfilter: nf_nat_sip: fix RTP/RTCP source port translations Sasha Levin
2019-11-22  5:47 ` [PATCH AUTOSEL 4.19 090/219] bnxt_en: Return linux standard errors in bnxt_ethtool.c Sasha Levin
2019-11-22  5:47 ` [PATCH AUTOSEL 4.19 091/219] bnxt_en: Save ring statistics before reset Sasha Levin
2019-11-22  5:47 ` [PATCH AUTOSEL 4.19 092/219] bnxt_en: query force speeds before disabling autoneg mode Sasha Levin
2019-11-22  5:47 ` [PATCH AUTOSEL 4.19 105/219] vxlan: Fix error path in __vxlan_dev_create() Sasha Levin
2019-11-22  5:47 ` [PATCH AUTOSEL 4.19 115/219] brcmfmac: Fix access point mode Sasha Levin
2019-11-22  5:47 ` [PATCH AUTOSEL 4.19 116/219] ath6kl: Only use match sets when firmware supports it Sasha Levin
2019-11-22  5:47 ` [PATCH AUTOSEL 4.19 117/219] ath6kl: Fix off by one error in scan completion Sasha Levin
2019-11-22  5:47 ` [PATCH AUTOSEL 4.19 130/219] bpf/cpumap: make sure frame_size for build_skb is aligned if headroom isn't Sasha Levin
2019-11-22  5:47 ` [PATCH AUTOSEL 4.19 138/219] net/netlink_compat: Fix a missing check of nla_parse_nested Sasha Levin
2019-11-22  5:47 ` [PATCH AUTOSEL 4.19 139/219] net/net_namespace: Check the return value of register_pernet_subsys() Sasha Levin
2019-11-22  5:47 ` [PATCH AUTOSEL 4.19 140/219] libceph: drop last_piece logic from write_partial_message_data() Sasha Levin
2019-11-22 14:00   ` Ilya Dryomov
2019-12-01 14:34     ` Sasha Levin
2019-11-22  5:47 ` [PATCH AUTOSEL 4.19 145/219] net: (cpts) fix a missing check of clk_prepare Sasha Levin
2019-11-22  5:47 ` [PATCH AUTOSEL 4.19 146/219] net: stmicro: " Sasha Levin
2019-11-22  5:47 ` [PATCH AUTOSEL 4.19 147/219] net: dsa: bcm_sf2: Propagate error value from mdio_write Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 148/219] atl1e: checking the status of atl1e_write_phy_reg Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 149/219] tipc: fix a missing check of genlmsg_put Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 150/219] net: marvell: fix a missing check of acpi_match_device Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 151/219] net/wan/fsl_ucc_hdlc: Avoid double free in ucc_hdlc_probe() Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 158/219] netfilter: nf_tables: fix a missing check of nla_put_failure Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 159/219] xprtrdma: Prevent leak of rpcrdma_rep objects Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 170/219] tipc: fix memory leak in tipc_nl_compat_publ_dump Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 171/219] net/core/neighbour: tell kmemleak about hash tables Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 174/219] net/core/neighbour: fix kmemleak minimal reference count for " Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 177/219] sfc: suppress duplicate nvmem partition types in efx_ef10_mtd_probe Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 178/219] ip_tunnel: Make none-tunnel-dst tunnel port work with lwtunnel Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 179/219] decnet: fix DN_IFREQ_SIZE Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 180/219] net/smc: prevent races between smc_lgr_terminate() and smc_conn_free() Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 181/219] net/smc: don't wait for send buffer space when data was already sent Sasha Levin
2019-11-22  5:48 ` Sasha Levin [this message]
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 186/219] net/smc: fix byte_order for rx_curs_confirmed Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 187/219] tipc: fix skb may be leaky in tipc_link_input Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 189/219] sfc: initialise found bitmap in efx_ef10_mtd_probe Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 190/219] geneve: change NET_UDP_TUNNEL dependency to select Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 191/219] net: fix possible overflow in __sk_mem_raise_allocated() Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 192/219] net: ip_gre: do not report erspan_ver for gre or gretap Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 193/219] net: ip6_gre: do not report erspan_ver for ip6gre or ip6gretap Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 194/219] sctp: don't compare hb_timer expire date before starting it Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 195/219] bpf: decrease usercnt if bpf_map_new_fd() fails in bpf_map_get_fd_by_id() Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 197/219] net: dev: Use unsigned integer as an argument to left-shift Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 199/219] bpf: drop refcount if bpf_map_new_fd() fails in map_create() Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 200/219] net: hns3: Change fw error code NOT_EXEC to NOT_SUPPORTED Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 201/219] net: hns3: fix PFC not setting problem for DCB module Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 202/219] net: hns3: fix an issue for hclgevf_ae_get_hdev Sasha Levin
2019-11-22  5:48 ` [PATCH AUTOSEL 4.19 203/219] net: hns3: fix an issue for hns3_update_new_int_gl Sasha Levin
2019-11-22  5:49 ` [PATCH AUTOSEL 4.19 218/219] xdp: fix cpumap redirect SKB creation bug Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191122054911.1750-177-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=davem@davemloft.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=ubraun@linux.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).