mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2024-12-29 17:23:36 +00:00
net/smc: register loopback-ism into SMC-D device list
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: Wen Gu <guwen@linux.alibaba.com> Reviewed-by: Wenjia Zhang <wenjia@linux.ibm.com> Reviewed-and-tested-by: Jan Karcher <jaka@linux.ibm.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
c8df2d449f
commit
04791343d8
@ -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);
|
||||
|
||||
if (smcd->ops->supports_v2())
|
||||
smc_ism_set_v2_capable();
|
||||
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])
|
||||
/* 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);
|
||||
else
|
||||
list_add(&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",
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user