Commit f3674384 authored by Paolo Abeni's avatar Paolo Abeni
Browse files
parents a3b16198 c12b2704
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -1117,7 +1117,10 @@ static int smc_find_proposal_devices(struct smc_sock *smc,
	ini->check_smcrv2 = true;
	ini->smcrv2.saddr = smc->clcsock->sk->sk_rcv_saddr;
	if (!(ini->smcr_version & SMC_V2) ||
	    smc->clcsock->sk->sk_family != AF_INET ||
#if IS_ENABLED(CONFIG_IPV6)
	    (smc->clcsock->sk->sk_family == AF_INET6 &&
	     !ipv6_addr_v4mapped(&smc->clcsock->sk->sk_v6_rcv_saddr)) ||
#endif
	    !smc_clc_ueid_count() ||
	    smc_find_rdma_device(smc, ini))
		ini->smcr_version &= ~SMC_V2;
+5 −0
Original line number Diff line number Diff line
@@ -795,9 +795,14 @@ int smcr_link_init(struct smc_link_group *lgr, struct smc_link *lnk,
	if (lgr->smc_version == SMC_V2) {
		lnk->smcibdev = ini->smcrv2.ib_dev_v2;
		lnk->ibport = ini->smcrv2.ib_port_v2;
		lnk->wr_rx_sge_cnt = lnk->smcibdev->ibdev->attrs.max_recv_sge < 2 ? 1 : 2;
		lnk->wr_rx_buflen = smc_link_shared_v2_rxbuf(lnk) ?
			SMC_WR_BUF_SIZE : SMC_WR_BUF_V2_SIZE;
	} else {
		lnk->smcibdev = ini->ib_dev;
		lnk->ibport = ini->ib_port;
		lnk->wr_rx_sge_cnt = 1;
		lnk->wr_rx_buflen = SMC_WR_BUF_SIZE;
	}
	get_device(&lnk->smcibdev->ibdev->dev);
	atomic_inc(&lnk->smcibdev->lnk_cnt);
+10 −1
Original line number Diff line number Diff line
@@ -122,10 +122,14 @@ struct smc_link {
	} ____cacheline_aligned_in_smp;
	struct completion	tx_ref_comp;

	struct smc_wr_buf	*wr_rx_bufs;	/* WR recv payload buffers */
	u8			*wr_rx_bufs;	/* WR recv payload buffers */
	struct ib_recv_wr	*wr_rx_ibs;	/* WR recv meta data */
	struct ib_sge		*wr_rx_sges;	/* WR recv scatter meta data */
	/* above three vectors have wr_rx_cnt elements and use the same index */
	int			wr_rx_sge_cnt; /* rx sge, V1 is 1, V2 is either 2 or 1 */
	int			wr_rx_buflen;	/* buffer len for the first sge, len for the
						 * second sge is lgr shared if rx sge is 2.
						 */
	dma_addr_t		wr_rx_dma_addr;	/* DMA address of wr_rx_bufs */
	dma_addr_t		wr_rx_v2_dma_addr; /* DMA address of v2 rx buf*/
	u64			wr_rx_id;	/* seq # of last recv WR */
@@ -506,6 +510,11 @@ static inline bool smc_link_active(struct smc_link *lnk)
	return lnk->state == SMC_LNK_ACTIVE;
}

static inline bool smc_link_shared_v2_rxbuf(struct smc_link *lnk)
{
	return lnk->wr_rx_sge_cnt > 1;
}

static inline void smc_gid_be16_convert(__u8 *buf, u8 *gid_raw)
{
	sprintf(buf, "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x",
+1 −2
Original line number Diff line number Diff line
@@ -662,7 +662,6 @@ void smc_ib_destroy_queue_pair(struct smc_link *lnk)
/* create a queue pair within the protection domain for a link */
int smc_ib_create_queue_pair(struct smc_link *lnk)
{
	int sges_per_buf = (lnk->lgr->smc_version == SMC_V2) ? 2 : 1;
	struct ib_qp_init_attr qp_attr = {
		.event_handler = smc_ib_qp_event_handler,
		.qp_context = lnk,
@@ -676,7 +675,7 @@ int smc_ib_create_queue_pair(struct smc_link *lnk)
			.max_send_wr = SMC_WR_BUF_CNT * 3,
			.max_recv_wr = SMC_WR_BUF_CNT * 3,
			.max_send_sge = SMC_IB_MAX_SEND_SGE,
			.max_recv_sge = sges_per_buf,
			.max_recv_sge = lnk->wr_rx_sge_cnt,
			.max_inline_data = 0,
		},
		.sq_sig_type = IB_SIGNAL_REQ_WR,
+15 −6
Original line number Diff line number Diff line
@@ -997,13 +997,14 @@ static int smc_llc_cli_conf_link(struct smc_link *link,
}

static void smc_llc_save_add_link_rkeys(struct smc_link *link,
					struct smc_link *link_new)
					struct smc_link *link_new,
					u8 *llc_msg)
{
	struct smc_llc_msg_add_link_v2_ext *ext;
	struct smc_link_group *lgr = link->lgr;
	int max, i;

	ext = (struct smc_llc_msg_add_link_v2_ext *)((u8 *)lgr->wr_rx_buf_v2 +
	ext = (struct smc_llc_msg_add_link_v2_ext *)(llc_msg +
						     SMC_WR_TX_SIZE);
	max = min_t(u8, ext->num_rkeys, SMC_LLC_RKEYS_PER_MSG_V2);
	down_write(&lgr->rmbs_lock);
@@ -1098,7 +1099,9 @@ int smc_llc_cli_add_link(struct smc_link *link, struct smc_llc_qentry *qentry)
	if (rc)
		goto out_clear_lnk;
	if (lgr->smc_version == SMC_V2) {
		smc_llc_save_add_link_rkeys(link, lnk_new);
		u8 *llc_msg = smc_link_shared_v2_rxbuf(link) ?
			(u8 *)lgr->wr_rx_buf_v2 : (u8 *)llc;
		smc_llc_save_add_link_rkeys(link, lnk_new, llc_msg);
	} else {
		rc = smc_llc_cli_rkey_exchange(link, lnk_new);
		if (rc) {
@@ -1498,7 +1501,9 @@ int smc_llc_srv_add_link(struct smc_link *link,
	if (rc)
		goto out_err;
	if (lgr->smc_version == SMC_V2) {
		smc_llc_save_add_link_rkeys(link, link_new);
		u8 *llc_msg = smc_link_shared_v2_rxbuf(link) ?
			(u8 *)lgr->wr_rx_buf_v2 : (u8 *)add_llc;
		smc_llc_save_add_link_rkeys(link, link_new, llc_msg);
	} else {
		rc = smc_llc_srv_rkey_exchange(link, link_new);
		if (rc)
@@ -1807,8 +1812,12 @@ static void smc_llc_rmt_delete_rkey(struct smc_link_group *lgr)
	if (lgr->smc_version == SMC_V2) {
		struct smc_llc_msg_delete_rkey_v2 *llcv2;

		if (smc_link_shared_v2_rxbuf(link)) {
			memcpy(lgr->wr_rx_buf_v2, llc, sizeof(*llc));
			llcv2 = (struct smc_llc_msg_delete_rkey_v2 *)lgr->wr_rx_buf_v2;
		} else {
			llcv2 = (struct smc_llc_msg_delete_rkey_v2 *)llc;
		}
		llcv2->num_inval_rkeys = 0;

		max = min_t(u8, llcv2->num_rkeys, SMC_LLC_RKEYS_PER_MSG_V2);
Loading