Skip to content

Commit d1d8d0b

Browse files
Wen GuPaolo Abeni
authored andcommitted
net/smc: mark optional smcd_ops and check for support when called
Some operations are not supported by new introduced Emulated-ISM, so mark them as optional and check if the device supports them when called. 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>
1 parent f7a2207 commit d1d8d0b

File tree

2 files changed

+16
-7
lines changed

2 files changed

+16
-7
lines changed

include/net/smc.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,19 +59,21 @@ struct smcd_ops {
5959
int (*register_dmb)(struct smcd_dev *dev, struct smcd_dmb *dmb,
6060
void *client);
6161
int (*unregister_dmb)(struct smcd_dev *dev, struct smcd_dmb *dmb);
62-
int (*add_vlan_id)(struct smcd_dev *dev, u64 vlan_id);
63-
int (*del_vlan_id)(struct smcd_dev *dev, u64 vlan_id);
64-
int (*set_vlan_required)(struct smcd_dev *dev);
65-
int (*reset_vlan_required)(struct smcd_dev *dev);
66-
int (*signal_event)(struct smcd_dev *dev, struct smcd_gid *rgid,
67-
u32 trigger_irq, u32 event_code, u64 info);
6862
int (*move_data)(struct smcd_dev *dev, u64 dmb_tok, unsigned int idx,
6963
bool sf, unsigned int offset, void *data,
7064
unsigned int size);
7165
int (*supports_v2)(void);
7266
void (*get_local_gid)(struct smcd_dev *dev, struct smcd_gid *gid);
7367
u16 (*get_chid)(struct smcd_dev *dev);
7468
struct device* (*get_dev)(struct smcd_dev *dev);
69+
70+
/* optional operations */
71+
int (*add_vlan_id)(struct smcd_dev *dev, u64 vlan_id);
72+
int (*del_vlan_id)(struct smcd_dev *dev, u64 vlan_id);
73+
int (*set_vlan_required)(struct smcd_dev *dev);
74+
int (*reset_vlan_required)(struct smcd_dev *dev);
75+
int (*signal_event)(struct smcd_dev *dev, struct smcd_gid *rgid,
76+
u32 trigger_irq, u32 event_code, u64 info);
7577
};
7678

7779
struct smcd_dev {

net/smc/smc_ism.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ int smc_ism_get_vlan(struct smcd_dev *smcd, unsigned short vlanid)
126126

127127
if (!vlanid) /* No valid vlan id */
128128
return -EINVAL;
129+
if (!smcd->ops->add_vlan_id)
130+
return -EOPNOTSUPP;
129131

130132
/* create new vlan entry, in case we need it */
131133
new_vlan = kzalloc(sizeof(*new_vlan), GFP_KERNEL);
@@ -171,6 +173,8 @@ int smc_ism_put_vlan(struct smcd_dev *smcd, unsigned short vlanid)
171173

172174
if (!vlanid) /* No valid vlan id */
173175
return -EINVAL;
176+
if (!smcd->ops->del_vlan_id)
177+
return -EOPNOTSUPP;
174178

175179
spin_lock_irqsave(&smcd->lock, flags);
176180
list_for_each_entry(vlan, &smcd->vlan, list) {
@@ -368,7 +372,8 @@ static void smcd_handle_sw_event(struct smc_ism_event_work *wrk)
368372
smc_smcd_terminate(wrk->smcd, &peer_gid, ev_info.vlan_id);
369373
break;
370374
case ISM_EVENT_CODE_TESTLINK: /* Activity timer */
371-
if (ev_info.code == ISM_EVENT_REQUEST) {
375+
if (ev_info.code == ISM_EVENT_REQUEST &&
376+
wrk->smcd->ops->signal_event) {
372377
ev_info.code = ISM_EVENT_RESPONSE;
373378
wrk->smcd->ops->signal_event(wrk->smcd,
374379
&peer_gid,
@@ -538,6 +543,8 @@ int smc_ism_signal_shutdown(struct smc_link_group *lgr)
538543

539544
if (lgr->peer_shutdown)
540545
return 0;
546+
if (!lgr->smcd->ops->signal_event)
547+
return 0;
541548

542549
memcpy(ev_info.uid, lgr->id, SMC_LGR_ID_SIZE);
543550
ev_info.vlan_id = lgr->vlan_id;

0 commit comments

Comments
 (0)