mirror of
https://github.com/torvalds/linux
synced 2024-10-15 15:59:15 +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;
|
return smc_ism_v2_capable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void smc_ism_set_v2_capable(void)
|
||||||
|
{
|
||||||
|
smc_ism_v2_capable = true;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set a connection using this DMBE. */
|
/* Set a connection using this DMBE. */
|
||||||
void smc_ism_set_conn(struct smc_connection *conn)
|
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)
|
static void smcd_register_dev(struct ism_dev *ism)
|
||||||
{
|
{
|
||||||
const struct smcd_ops *ops = ism_get_smcd_ops();
|
const struct smcd_ops *ops = ism_get_smcd_ops();
|
||||||
struct smcd_dev *smcd;
|
struct smcd_dev *smcd, *fentry;
|
||||||
|
|
||||||
if (!ops)
|
if (!ops)
|
||||||
return;
|
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))
|
if (smc_pnetid_by_dev_port(&ism->pdev->dev, 0, smcd->pnetid))
|
||||||
smc_pnetid_by_table_smcd(smcd);
|
smc_pnetid_by_table_smcd(smcd);
|
||||||
|
|
||||||
|
if (smcd->ops->supports_v2())
|
||||||
|
smc_ism_set_v2_capable();
|
||||||
mutex_lock(&smcd_dev_list.mutex);
|
mutex_lock(&smcd_dev_list.mutex);
|
||||||
if (list_empty(&smcd_dev_list.list)) {
|
/* sort list:
|
||||||
if (smcd->ops->supports_v2())
|
* - devices without pnetid before devices with pnetid;
|
||||||
smc_ism_v2_capable = true;
|
* - loopback-ism always at the very beginning;
|
||||||
}
|
*/
|
||||||
/* sort list: devices without pnetid before devices with pnetid */
|
if (!smcd->pnetid[0]) {
|
||||||
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);
|
list_add_tail(&smcd->list, &smcd_dev_list.list);
|
||||||
else
|
}
|
||||||
list_add(&smcd->list, &smcd_dev_list.list);
|
|
||||||
mutex_unlock(&smcd_dev_list.mutex);
|
mutex_unlock(&smcd_dev_list.mutex);
|
||||||
|
|
||||||
pr_warn_ratelimited("smc: adding smcd device %s with pnetid %.16s%s\n",
|
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);
|
void smc_ism_get_system_eid(u8 **eid);
|
||||||
u16 smc_ism_get_chid(struct smcd_dev *dev);
|
u16 smc_ism_get_chid(struct smcd_dev *dev);
|
||||||
bool smc_ism_is_v2_capable(void);
|
bool smc_ism_is_v2_capable(void);
|
||||||
|
void smc_ism_set_v2_capable(void);
|
||||||
int smc_ism_init(void);
|
int smc_ism_init(void);
|
||||||
void smc_ism_exit(void);
|
void smc_ism_exit(void);
|
||||||
int smcd_nl_get_device(struct sk_buff *skb, struct netlink_callback *cb);
|
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;
|
return -ENOMEM;
|
||||||
ldev->smcd = smcd;
|
ldev->smcd = smcd;
|
||||||
smcd->priv = ldev;
|
smcd->priv = ldev;
|
||||||
|
smc_ism_set_v2_capable();
|
||||||
/* TODO:
|
mutex_lock(&smcd_dev_list.mutex);
|
||||||
* register loopback-ism to smcd_dev list.
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -257,9 +259,13 @@ static void smcd_lo_unregister_dev(struct smc_lo_dev *ldev)
|
||||||
{
|
{
|
||||||
struct smcd_dev *smcd = ldev->smcd;
|
struct smcd_dev *smcd = ldev->smcd;
|
||||||
|
|
||||||
/* TODO:
|
pr_warn_ratelimited("smc: removing smcd device %s\n",
|
||||||
* unregister loopback-ism from smcd_dev list.
|
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->conn);
|
||||||
kfree(smcd);
|
kfree(smcd);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue