mirror of
https://github.com/armbian/linux-cix.git
synced 2026-01-06 12:30:45 -08:00
net/smc: add operations to merge sndbuf with peer DMB
[ Upstream commit 4398888268582cb51b69c6ee94f551bb8d37d12f ]
In some scenarios using Emulated-ISM device, sndbuf can share the same
physical memory region with peer DMB to avoid data copy from one side
to the other. In such case the sndbuf is only a descriptor that
describes the shared memory and does not actually occupy memory, it's
more like a ghost buffer.
+----------+ +----------+
| socket A | | socket B |
+----------+ +----------+
| |
+--------+ +--------+
| sndbuf | | DMB |
| desc | | desc |
+--------+ +--------+
| |
| +----v-----+
+--------------------------> memory |
+----------+
So here introduces three new SMC-D device operations to check if this
feature is supported by device, and to {attach|detach} ghost sndbuf to
peer DMB. For now only loopback-ism supports this.
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>
Stable-dep-of: 0541db8ee32c ("net/smc: initialize close_work early to avoid warning")
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
988b81020a
commit
fe7ef3a10c
@@ -79,6 +79,9 @@ struct smcd_ops {
|
||||
int (*reset_vlan_required)(struct smcd_dev *dev);
|
||||
int (*signal_event)(struct smcd_dev *dev, struct smcd_gid *rgid,
|
||||
u32 trigger_irq, u32 event_code, u64 info);
|
||||
int (*support_dmb_nocopy)(struct smcd_dev *dev);
|
||||
int (*attach_dmb)(struct smcd_dev *dev, struct smcd_dmb *dmb);
|
||||
int (*detach_dmb)(struct smcd_dev *dev, u64 token);
|
||||
};
|
||||
|
||||
struct smcd_dev {
|
||||
|
||||
@@ -228,6 +228,46 @@ int smc_ism_register_dmb(struct smc_link_group *lgr, int dmb_len,
|
||||
#endif
|
||||
}
|
||||
|
||||
bool smc_ism_support_dmb_nocopy(struct smcd_dev *smcd)
|
||||
{
|
||||
/* for now only loopback-ism supports
|
||||
* merging sndbuf with peer DMB to avoid
|
||||
* data copies between them.
|
||||
*/
|
||||
return (smcd->ops->support_dmb_nocopy &&
|
||||
smcd->ops->support_dmb_nocopy(smcd));
|
||||
}
|
||||
|
||||
int smc_ism_attach_dmb(struct smcd_dev *dev, u64 token,
|
||||
struct smc_buf_desc *dmb_desc)
|
||||
{
|
||||
struct smcd_dmb dmb;
|
||||
int rc = 0;
|
||||
|
||||
if (!dev->ops->attach_dmb)
|
||||
return -EINVAL;
|
||||
|
||||
memset(&dmb, 0, sizeof(dmb));
|
||||
dmb.dmb_tok = token;
|
||||
rc = dev->ops->attach_dmb(dev, &dmb);
|
||||
if (!rc) {
|
||||
dmb_desc->sba_idx = dmb.sba_idx;
|
||||
dmb_desc->token = dmb.dmb_tok;
|
||||
dmb_desc->cpu_addr = dmb.cpu_addr;
|
||||
dmb_desc->dma_addr = dmb.dma_addr;
|
||||
dmb_desc->len = dmb.dmb_len;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
int smc_ism_detach_dmb(struct smcd_dev *dev, u64 token)
|
||||
{
|
||||
if (!dev->ops->detach_dmb)
|
||||
return -EINVAL;
|
||||
|
||||
return dev->ops->detach_dmb(dev, token);
|
||||
}
|
||||
|
||||
static int smc_nl_handle_smcd_dev(struct smcd_dev *smcd,
|
||||
struct sk_buff *skb,
|
||||
struct netlink_callback *cb)
|
||||
|
||||
@@ -41,6 +41,10 @@ int smc_ism_put_vlan(struct smcd_dev *dev, unsigned short vlan_id);
|
||||
int smc_ism_register_dmb(struct smc_link_group *lgr, int buf_size,
|
||||
struct smc_buf_desc *dmb_desc);
|
||||
int smc_ism_unregister_dmb(struct smcd_dev *dev, struct smc_buf_desc *dmb_desc);
|
||||
bool smc_ism_support_dmb_nocopy(struct smcd_dev *smcd);
|
||||
int smc_ism_attach_dmb(struct smcd_dev *dev, u64 token,
|
||||
struct smc_buf_desc *dmb_desc);
|
||||
int smc_ism_detach_dmb(struct smcd_dev *dev, u64 token);
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user