]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
dibs: Move query_remote_gid() to dibs_dev_ops
authorAlexandra Winter <wintera@linux.ibm.com>
Thu, 18 Sep 2025 11:04:58 +0000 (13:04 +0200)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 23 Sep 2025 09:13:22 +0000 (11:13 +0200)
Provide the dibs_dev_ops->query_remote_gid() in ism and dibs_loopback
dibs_devices. And call it in smc dibs_client.

Reviewed-by: Julian Ruess <julianr@linux.ibm.com>
Signed-off-by: Alexandra Winter <wintera@linux.ibm.com>
Link: https://patch.msgid.link/20250918110500.1731261-13-wintera@linux.ibm.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/dibs/dibs_loopback.c
drivers/s390/net/ism_drv.c
include/linux/dibs.h
include/net/smc.h
net/smc/smc_ism.c
net/smc/smc_loopback.c

index d7e6fa5e90f3b2dcebc33b2808148c4790535650..6b53e626a6d14b582aa54f6f51ffc92dbb88d6b2 100644 (file)
@@ -24,8 +24,18 @@ static u16 dibs_lo_get_fabric_id(struct dibs_dev *dibs)
        return DIBS_LOOPBACK_FABRIC;
 }
 
+static int dibs_lo_query_rgid(struct dibs_dev *dibs, const uuid_t *rgid,
+                             u32 vid_valid, u32 vid)
+{
+       /* rgid should be the same as lgid */
+       if (!uuid_equal(rgid, &dibs->gid))
+               return -ENETUNREACH;
+       return 0;
+}
+
 static const struct dibs_dev_ops dibs_lo_ops = {
        .get_fabric_id = dibs_lo_get_fabric_id,
+       .query_remote_gid = dibs_lo_query_rgid,
 };
 
 static int dibs_lo_dev_probe(void)
index ed4c28ca355bb57fcd79aafe197403dd985f5344..121b3a2be76042842d11a484c475c58c5a500272 100644 (file)
@@ -291,6 +291,23 @@ out:
        return ret;
 }
 
+static int ism_query_rgid(struct dibs_dev *dibs, const uuid_t *rgid,
+                         u32 vid_valid, u32 vid)
+{
+       struct ism_dev *ism = dibs->drv_priv;
+       union ism_query_rgid cmd;
+
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.request.hdr.cmd = ISM_QUERY_RGID;
+       cmd.request.hdr.len = sizeof(cmd.request);
+
+       memcpy(&cmd.request.rgid, rgid, sizeof(cmd.request.rgid));
+       cmd.request.vlan_valid = vid_valid;
+       cmd.request.vlan_id = vid;
+
+       return ism_cmd(ism, &cmd);
+}
+
 static void ism_free_dmb(struct ism_dev *ism, struct ism_dmb *dmb)
 {
        clear_bit(dmb->sba_idx, ism->sba_bitmap);
@@ -537,6 +554,7 @@ static irqreturn_t ism_handle_irq(int irq, void *data)
 
 static const struct dibs_dev_ops ism_ops = {
        .get_fabric_id = ism_get_chid,
+       .query_remote_gid = ism_query_rgid,
        .add_vlan_id = ism_add_vlan_id,
        .del_vlan_id = ism_del_vlan_id,
 };
@@ -748,28 +766,6 @@ module_exit(ism_exit);
 /*************************** SMC-D Implementation *****************************/
 
 #if IS_ENABLED(CONFIG_SMC)
-static int ism_query_rgid(struct ism_dev *ism, u64 rgid, u32 vid_valid,
-                         u32 vid)
-{
-       union ism_query_rgid cmd;
-
-       memset(&cmd, 0, sizeof(cmd));
-       cmd.request.hdr.cmd = ISM_QUERY_RGID;
-       cmd.request.hdr.len = sizeof(cmd.request);
-
-       cmd.request.rgid = rgid;
-       cmd.request.vlan_valid = vid_valid;
-       cmd.request.vlan_id = vid;
-
-       return ism_cmd(ism, &cmd);
-}
-
-static int smcd_query_rgid(struct smcd_dev *smcd, struct smcd_gid *rgid,
-                          u32 vid_valid, u32 vid)
-{
-       return ism_query_rgid(smcd->priv, rgid->gid, vid_valid, vid);
-}
-
 static int smcd_register_dmb(struct smcd_dev *smcd, struct smcd_dmb *dmb,
                             void *client)
 {
@@ -813,7 +809,6 @@ static int smcd_move(struct smcd_dev *smcd, u64 dmb_tok, unsigned int idx,
 }
 
 static const struct smcd_ops ism_smcd_ops = {
-       .query_remote_gid = smcd_query_rgid,
        .register_dmb = smcd_register_dmb,
        .unregister_dmb = smcd_unregister_dmb,
        .signal_event = smcd_signal_ieq,
index 166148fb8d766e1c2bee3c20c69f37a0dfbb11ab..c75a40fe3039a5b21d8211baaae1a16f4b85f5c6 100644 (file)
@@ -133,6 +133,20 @@ struct dibs_dev_ops {
         * Return: 2 byte dibs fabric id
         */
        u16 (*get_fabric_id)(struct dibs_dev *dev);
+       /**
+        * query_remote_gid()
+        * @dev: local dibs device
+        * @rgid: gid of remote dibs device
+        * @vid_valid: if zero, vid will be ignored;
+        *             deprecated, ignored if device does not support vlan
+        * @vid: VLAN id; deprecated, ignored if device does not support vlan
+        *
+        * Query whether a remote dibs device is reachable via this local device
+        * and this vlan id.
+        * Return: 0 if remote gid is reachable.
+        */
+       int (*query_remote_gid)(struct dibs_dev *dev, const uuid_t *rgid,
+                               u32 vid_valid, u32 vid);
        /**
         * add_vlan_id() - add dibs device to vlan (optional, deprecated)
         * @dev: dibs device
index 51b4aefc106a1fab20dae0ecacecb04318e9a405..5bd135fb4d492457da9402fcdc8745735290ba5d 100644 (file)
@@ -53,8 +53,6 @@ struct smcd_gid {
 };
 
 struct smcd_ops {
-       int (*query_remote_gid)(struct smcd_dev *dev, struct smcd_gid *rgid,
-                               u32 vid_valid, u32 vid);
        int (*register_dmb)(struct smcd_dev *dev, struct smcd_dmb *dmb,
                            void *client);
        int (*unregister_dmb)(struct smcd_dev *dev, struct smcd_dmb *dmb);
index 5118441bed1834f7ff84fe5b34fee6a4ebafa8c6..d20d00b46825a905c85de95baf02d662443cfcbf 100644 (file)
@@ -77,8 +77,12 @@ static void smc_ism_create_system_eid(void)
 int smc_ism_cantalk(struct smcd_gid *peer_gid, unsigned short vlan_id,
                    struct smcd_dev *smcd)
 {
-       return smcd->ops->query_remote_gid(smcd, peer_gid, vlan_id ? 1 : 0,
-                                          vlan_id);
+       struct dibs_dev *dibs = smcd->dibs;
+       uuid_t ism_rgid;
+
+       copy_to_dibsgid(&ism_rgid, peer_gid);
+       return dibs->ops->query_remote_gid(dibs, &ism_rgid, vlan_id ? 1 : 0,
+                                         vlan_id);
 }
 
 void smc_ism_get_system_eid(u8 **eid)
index 982a194303137283ccbdff7b4e8ed4236cfe4b73..52cba01cb209ca957b3517584472a3c48be03967 100644 (file)
 
 static struct smc_lo_dev *lo_dev;
 
-static int smc_lo_query_rgid(struct smcd_dev *smcd, struct smcd_gid *rgid,
-                            u32 vid_valid, u32 vid)
-{
-       uuid_t temp;
-
-       copy_to_dibsgid(&temp, rgid);
-       /* rgid should be the same as lgid */
-       if (!uuid_equal(&temp, &smcd->dibs->gid))
-               return -ENETUNREACH;
-       return 0;
-}
-
 static int smc_lo_register_dmb(struct smcd_dev *smcd, struct smcd_dmb *dmb,
                               void *client_priv)
 {
@@ -235,7 +223,6 @@ static int smc_lo_move_data(struct smcd_dev *smcd, u64 dmb_tok,
 }
 
 static const struct smcd_ops lo_ops = {
-       .query_remote_gid = smc_lo_query_rgid,
        .register_dmb = smc_lo_register_dmb,
        .unregister_dmb = smc_lo_unregister_dmb,
        .support_dmb_nocopy = smc_lo_support_dmb_nocopy,