Commit 5ffcba41 authored by David S. Miller's avatar David S. Miller

Merge branch 'smc-updates'

Wenjia Zhang says:

====================
net/smc: updates 2022-07-25

please apply the following patches to netdev's net-next tree.

These patches do some preparation to make ISM available for uses beyond
SMC-D, and a bunch of cleanups.

v2: add "Reviewed-by: Tony Lu <tonylu@linux.alibaba.com>"
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 2f0f6b17 28ec53f3
...@@ -409,20 +409,19 @@ static void ism_create_system_eid(void) ...@@ -409,20 +409,19 @@ static void ism_create_system_eid(void)
memcpy(&SYSTEM_EID.type, tmp, 4); memcpy(&SYSTEM_EID.type, tmp, 4);
} }
static void ism_get_system_eid(struct smcd_dev *smcd, u8 **eid) static u8 *ism_get_system_eid(void)
{ {
*eid = &SYSTEM_EID.seid_string[0]; return SYSTEM_EID.seid_string;
} }
static u16 ism_get_chid(struct smcd_dev *smcd) static u16 ism_get_chid(struct smcd_dev *smcd)
{ {
struct ism_dev *ismdev; struct ism_dev *ism = (struct ism_dev *)smcd->priv;
ismdev = (struct ism_dev *)smcd->priv; if (!ism || !ism->pdev)
if (!ismdev || !ismdev->pdev)
return 0; return 0;
return to_zpci(ismdev->pdev)->pchid; return to_zpci(ism->pdev)->pchid;
} }
static void ism_handle_event(struct ism_dev *ism) static void ism_handle_event(struct ism_dev *ism)
...@@ -444,6 +443,7 @@ static irqreturn_t ism_handle_irq(int irq, void *data) ...@@ -444,6 +443,7 @@ static irqreturn_t ism_handle_irq(int irq, void *data)
struct ism_dev *ism = data; struct ism_dev *ism = data;
unsigned long bit, end; unsigned long bit, end;
unsigned long *bv; unsigned long *bv;
u16 dmbemask;
bv = (void *) &ism->sba->dmb_bits[ISM_DMB_WORD_OFFSET]; bv = (void *) &ism->sba->dmb_bits[ISM_DMB_WORD_OFFSET];
end = sizeof(ism->sba->dmb_bits) * BITS_PER_BYTE - ISM_DMB_BIT_OFFSET; end = sizeof(ism->sba->dmb_bits) * BITS_PER_BYTE - ISM_DMB_BIT_OFFSET;
...@@ -457,9 +457,10 @@ static irqreturn_t ism_handle_irq(int irq, void *data) ...@@ -457,9 +457,10 @@ static irqreturn_t ism_handle_irq(int irq, void *data)
break; break;
clear_bit_inv(bit, bv); clear_bit_inv(bit, bv);
dmbemask = ism->sba->dmbe_mask[bit + ISM_DMB_BIT_OFFSET];
ism->sba->dmbe_mask[bit + ISM_DMB_BIT_OFFSET] = 0; ism->sba->dmbe_mask[bit + ISM_DMB_BIT_OFFSET] = 0;
barrier(); barrier();
smcd_handle_irq(ism->smcd, bit + ISM_DMB_BIT_OFFSET); smcd_handle_irq(ism->smcd, bit + ISM_DMB_BIT_OFFSET, dmbemask);
} }
if (ism->sba->e) { if (ism->sba->e) {
......
...@@ -72,7 +72,7 @@ struct smcd_ops { ...@@ -72,7 +72,7 @@ struct smcd_ops {
int (*move_data)(struct smcd_dev *dev, u64 dmb_tok, unsigned int idx, int (*move_data)(struct smcd_dev *dev, u64 dmb_tok, unsigned int idx,
bool sf, unsigned int offset, void *data, bool sf, unsigned int offset, void *data,
unsigned int size); unsigned int size);
void (*get_system_eid)(struct smcd_dev *dev, u8 **eid); u8* (*get_system_eid)(void);
u16 (*get_chid)(struct smcd_dev *dev); u16 (*get_chid)(struct smcd_dev *dev);
}; };
...@@ -101,5 +101,5 @@ int smcd_register_dev(struct smcd_dev *smcd); ...@@ -101,5 +101,5 @@ int smcd_register_dev(struct smcd_dev *smcd);
void smcd_unregister_dev(struct smcd_dev *smcd); void smcd_unregister_dev(struct smcd_dev *smcd);
void smcd_free_dev(struct smcd_dev *smcd); void smcd_free_dev(struct smcd_dev *smcd);
void smcd_handle_event(struct smcd_dev *dev, struct smcd_event *event); void smcd_handle_event(struct smcd_dev *dev, struct smcd_event *event);
void smcd_handle_irq(struct smcd_dev *dev, unsigned int bit); void smcd_handle_irq(struct smcd_dev *dev, unsigned int bit, u16 dmbemask);
#endif /* _SMC_H */ #endif /* _SMC_H */
...@@ -3515,3 +3515,4 @@ MODULE_DESCRIPTION("smc socket address family"); ...@@ -3515,3 +3515,4 @@ MODULE_DESCRIPTION("smc socket address family");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS_NETPROTO(PF_SMC); MODULE_ALIAS_NETPROTO(PF_SMC);
MODULE_ALIAS_TCP_ULP("smc"); MODULE_ALIAS_TCP_ULP("smc");
MODULE_ALIAS_GENL_FAMILY(SMC_GENL_FAMILY_NAME);
...@@ -268,3 +268,4 @@ module_init(smc_diag_init); ...@@ -268,3 +268,4 @@ module_init(smc_diag_init);
module_exit(smc_diag_exit); module_exit(smc_diag_exit);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_NETLINK, NETLINK_SOCK_DIAG, 43 /* AF_SMC */); MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_NETLINK, NETLINK_SOCK_DIAG, 43 /* AF_SMC */);
MODULE_ALIAS_GENL_FAMILY(SMCR_GENL_FAMILY_NAME);
...@@ -33,17 +33,6 @@ int smc_ism_cantalk(u64 peer_gid, unsigned short vlan_id, struct smcd_dev *smcd) ...@@ -33,17 +33,6 @@ int smc_ism_cantalk(u64 peer_gid, unsigned short vlan_id, struct smcd_dev *smcd)
vlan_id); vlan_id);
} }
int smc_ism_write(struct smcd_dev *smcd, const struct smc_ism_position *pos,
void *data, size_t len)
{
int rc;
rc = smcd->ops->move_data(smcd, pos->token, pos->index, pos->signal,
pos->offset, data, len);
return rc < 0 ? rc : 0;
}
void smc_ism_get_system_eid(u8 **eid) void smc_ism_get_system_eid(u8 **eid)
{ {
if (!smc_ism_v2_capable) if (!smc_ism_v2_capable)
...@@ -440,7 +429,7 @@ int smcd_register_dev(struct smcd_dev *smcd) ...@@ -440,7 +429,7 @@ int smcd_register_dev(struct smcd_dev *smcd)
if (list_empty(&smcd_dev_list.list)) { if (list_empty(&smcd_dev_list.list)) {
u8 *system_eid = NULL; u8 *system_eid = NULL;
smcd->ops->get_system_eid(smcd, &system_eid); system_eid = smcd->ops->get_system_eid();
if (system_eid[24] != '0' || system_eid[28] != '0') { if (system_eid[24] != '0' || system_eid[28] != '0') {
smc_ism_v2_capable = true; smc_ism_v2_capable = true;
memcpy(smc_ism_v2_system_eid, system_eid, memcpy(smc_ism_v2_system_eid, system_eid,
...@@ -519,13 +508,13 @@ void smcd_handle_event(struct smcd_dev *smcd, struct smcd_event *event) ...@@ -519,13 +508,13 @@ void smcd_handle_event(struct smcd_dev *smcd, struct smcd_event *event)
EXPORT_SYMBOL_GPL(smcd_handle_event); EXPORT_SYMBOL_GPL(smcd_handle_event);
/* SMCD Device interrupt handler. Called from ISM device interrupt handler. /* SMCD Device interrupt handler. Called from ISM device interrupt handler.
* Parameters are smcd device pointer and DMB number. Find the connection and * Parameters are smcd device pointer, DMB number, and the DMBE bitmask.
* schedule the tasklet for this connection. * Find the connection and schedule the tasklet for this connection.
* *
* Context: * Context:
* - Function called in IRQ context from ISM device driver IRQ handler. * - Function called in IRQ context from ISM device driver IRQ handler.
*/ */
void smcd_handle_irq(struct smcd_dev *smcd, unsigned int dmbno) void smcd_handle_irq(struct smcd_dev *smcd, unsigned int dmbno, u16 dmbemask)
{ {
struct smc_connection *conn = NULL; struct smc_connection *conn = NULL;
unsigned long flags; unsigned long flags;
......
...@@ -28,13 +28,6 @@ struct smc_ism_vlanid { /* VLAN id set on ISM device */ ...@@ -28,13 +28,6 @@ struct smc_ism_vlanid { /* VLAN id set on ISM device */
refcount_t refcnt; /* Reference count */ refcount_t refcnt; /* Reference count */
}; };
struct smc_ism_position { /* ISM device position to write to */
u64 token; /* Token of DMB */
u32 offset; /* Offset into DMBE */
u8 index; /* Index of DMBE */
u8 signal; /* Generate interrupt on owner side */
};
struct smcd_dev; struct smcd_dev;
int smc_ism_cantalk(u64 peer_gid, unsigned short vlan_id, struct smcd_dev *dev); int smc_ism_cantalk(u64 peer_gid, unsigned short vlan_id, struct smcd_dev *dev);
...@@ -45,12 +38,21 @@ int smc_ism_put_vlan(struct smcd_dev *dev, unsigned short vlan_id); ...@@ -45,12 +38,21 @@ 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, int smc_ism_register_dmb(struct smc_link_group *lgr, int buf_size,
struct smc_buf_desc *dmb_desc); struct smc_buf_desc *dmb_desc);
int smc_ism_unregister_dmb(struct smcd_dev *dev, struct smc_buf_desc *dmb_desc); int smc_ism_unregister_dmb(struct smcd_dev *dev, struct smc_buf_desc *dmb_desc);
int smc_ism_write(struct smcd_dev *dev, const struct smc_ism_position *pos,
void *data, size_t len);
int smc_ism_signal_shutdown(struct smc_link_group *lgr); 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_init(void); void smc_ism_init(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);
static inline int smc_ism_write(struct smcd_dev *smcd, u64 dmb_tok,
unsigned int idx, bool sf, unsigned int offset,
void *data, size_t len)
{
int rc;
rc = smcd->ops->move_data(smcd, dmb_tok, idx, sf, offset, data, len);
return rc < 0 ? rc : 0;
}
#endif #endif
...@@ -320,15 +320,11 @@ int smc_tx_sendpage(struct smc_sock *smc, struct page *page, int offset, ...@@ -320,15 +320,11 @@ int smc_tx_sendpage(struct smc_sock *smc, struct page *page, int offset,
int smcd_tx_ism_write(struct smc_connection *conn, void *data, size_t len, int smcd_tx_ism_write(struct smc_connection *conn, void *data, size_t len,
u32 offset, int signal) u32 offset, int signal)
{ {
struct smc_ism_position pos;
int rc; int rc;
memset(&pos, 0, sizeof(pos)); rc = smc_ism_write(conn->lgr->smcd, conn->peer_token,
pos.token = conn->peer_token; conn->peer_rmbe_idx, signal, conn->tx_off + offset,
pos.index = conn->peer_rmbe_idx; data, len);
pos.offset = conn->tx_off + offset;
pos.signal = signal;
rc = smc_ism_write(conn->lgr->smcd, &pos, data, len);
if (rc) if (rc)
conn->local_tx_ctrl.conn_state_flags.peer_conn_abort = 1; conn->local_tx_ctrl.conn_state_flags.peer_conn_abort = 1;
return rc; return rc;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment