Commit f7a74457 authored by Wen Gu's avatar Wen Gu Committed by Zhengchao Shao
Browse files

net/smc: register loopback-ism into SMC-D device list

mainline inclusion
from mainline-v6.10-rc1
commit 04791343d858242dc2bd25e05be480ad1591e900
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/IACM52

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=04791343d858242dc2bd25e05be480ad1591e900



--------------------------------

After the loopback-ism device is ready, add it to the SMC-D device list
as an ISMv2 device, and always keep it at the beginning to ensure it is
preferred for providing a shortcut for data transfer within the same
kernel.

Signed-off-by: default avatarWen Gu <guwen@linux.alibaba.com>
Reviewed-by: default avatarWenjia Zhang <wenjia@linux.ibm.com>
Reviewed-and-tested-by: default avatarJan Karcher <jaka@linux.ibm.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Signed-off-by: default avatarZhengchao Shao <shaozhengchao@huawei.com>
parent ec6e1411
Loading
Loading
Loading
Loading
+21 −9
Original line number Diff line number Diff line
@@ -91,6 +91,11 @@ bool smc_ism_is_v2_capable(void)
	return smc_ism_v2_capable;
}

void smc_ism_set_v2_capable(void)
{
	smc_ism_v2_capable = true;
}

/* Set a connection using this DMBE. */
void smc_ism_set_conn(struct smc_connection *conn)
{
@@ -439,7 +444,7 @@ static struct smcd_dev *smcd_alloc_dev(struct device *parent, const char *name,
static void smcd_register_dev(struct ism_dev *ism)
{
	const struct smcd_ops *ops = ism_get_smcd_ops();
	struct smcd_dev *smcd;
	struct smcd_dev *smcd, *fentry;

	if (!ops)
		return;
@@ -454,16 +459,23 @@ static void smcd_register_dev(struct ism_dev *ism)
	if (smc_pnetid_by_dev_port(&ism->pdev->dev, 0, smcd->pnetid))
		smc_pnetid_by_table_smcd(smcd);

	mutex_lock(&smcd_dev_list.mutex);
	if (list_empty(&smcd_dev_list.list)) {
	if (smcd->ops->supports_v2())
			smc_ism_v2_capable = true;
	}
	/* sort list: devices without pnetid before devices with pnetid */
	if (smcd->pnetid[0])
		list_add_tail(&smcd->list, &smcd_dev_list.list);
		smc_ism_set_v2_capable();
	mutex_lock(&smcd_dev_list.mutex);
	/* sort list:
	 * - devices without pnetid before devices with pnetid;
	 * - loopback-ism always at the very beginning;
	 */
	if (!smcd->pnetid[0]) {
		fentry = list_first_entry_or_null(&smcd_dev_list.list,
						  struct smcd_dev, list);
		if (fentry && smc_ism_is_loopback(fentry))
			list_add(&smcd->list, &fentry->list);
		else
			list_add(&smcd->list, &smcd_dev_list.list);
	} else {
		list_add_tail(&smcd->list, &smcd_dev_list.list);
	}
	mutex_unlock(&smcd_dev_list.mutex);

	pr_warn_ratelimited("smc: adding smcd device %s with pnetid %.16s%s\n",
+1 −0
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ int smc_ism_signal_shutdown(struct smc_link_group *lgr);
void smc_ism_get_system_eid(u8 **eid);
u16 smc_ism_get_chid(struct smcd_dev *dev);
bool smc_ism_is_v2_capable(void);
void smc_ism_set_v2_capable(void);
int smc_ism_init(void);
void smc_ism_exit(void);
int smcd_nl_get_device(struct sk_buff *skb, struct netlink_callback *cb);
+13 −7
Original line number Diff line number Diff line
@@ -246,10 +246,12 @@ static int smcd_lo_register_dev(struct smc_lo_dev *ldev)
		return -ENOMEM;
	ldev->smcd = smcd;
	smcd->priv = ldev;

	/* TODO:
	 * register loopback-ism to smcd_dev list.
	 */
	smc_ism_set_v2_capable();
	mutex_lock(&smcd_dev_list.mutex);
	list_add(&smcd->list, &smcd_dev_list.list);
	mutex_unlock(&smcd_dev_list.mutex);
	pr_warn_ratelimited("smc: adding smcd device %s\n",
			    dev_name(&ldev->dev));
	return 0;
}

@@ -257,9 +259,13 @@ static void smcd_lo_unregister_dev(struct smc_lo_dev *ldev)
{
	struct smcd_dev *smcd = ldev->smcd;

	/* TODO:
	 * unregister loopback-ism from smcd_dev list.
	 */
	pr_warn_ratelimited("smc: removing smcd device %s\n",
			    dev_name(&ldev->dev));
	smcd->going_away = 1;
	smc_smcd_terminate_all(smcd);
	mutex_lock(&smcd_dev_list.mutex);
	list_del_init(&smcd->list);
	mutex_unlock(&smcd_dev_list.mutex);
	kfree(smcd->conn);
	kfree(smcd);
}