Patch "net/smc: add operations to merge sndbuf with peer DMB" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net/smc: add operations to merge sndbuf with peer DMB

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-smc-add-operations-to-merge-sndbuf-with-peer-dmb.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 691098ba12faec4ee6d6d83b2d1ed0ea30ccf267
Author: Wen Gu <guwen@xxxxxxxxxxxxxxxxx>
Date:   Sun Apr 28 14:07:35 2024 +0800

    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@xxxxxxxxxxxxxxxxx>
    Reviewed-by: Wenjia Zhang <wenjia@xxxxxxxxxxxxx>
    Reviewed-and-tested-by: Jan Karcher <jaka@xxxxxxxxxxxxx>
    Signed-off-by: Paolo Abeni <pabeni@xxxxxxxxxx>
    Stable-dep-of: 0541db8ee32c ("net/smc: initialize close_work early to avoid warning")
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/include/net/smc.h b/include/net/smc.h
index 9dfe57f3e4f0b..6fef76087b9ed 100644
--- a/include/net/smc.h
+++ b/include/net/smc.h
@@ -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 {
diff --git a/net/smc/smc_ism.c b/net/smc/smc_ism.c
index 3623df320de55..61ffc72014013 100644
--- a/net/smc/smc_ism.c
+++ b/net/smc/smc_ism.c
@@ -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)
diff --git a/net/smc/smc_ism.h b/net/smc/smc_ism.h
index 0e5e563099ec3..8312c3586d2b3 100644
--- a/net/smc/smc_ism.h
+++ b/net/smc/smc_ism.h
@@ -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);




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux