Commit 9311defc authored by David S. Miller's avatar David S. Miller

Merge branch 'smc-next'

Ursula Braun says:

====================
net/smc: patches 2019-02-21

here are patches for SMC:
* patch 1 is a cleanup without functional change
* patches 2-6 enhance SMC pnetid support
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 64ccfd2d af5f60c7
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <asm/ccwgroup.h> #include <asm/ccwgroup.h>
#include <asm/ccwdev.h> #include <asm/ccwdev.h>
#include <asm/pnet.h> #include <asm/pnet.h>
#include <asm/ebcdic.h>
#define PNETIDS_LEN 64 /* Total utility string length in bytes #define PNETIDS_LEN 64 /* Total utility string length in bytes
* to cover up to 4 PNETIDs of 16 bytes * to cover up to 4 PNETIDs of 16 bytes
...@@ -48,6 +49,7 @@ static int pnet_ids_by_device(struct device *dev, u8 *pnetids) ...@@ -48,6 +49,7 @@ static int pnet_ids_by_device(struct device *dev, u8 *pnetids)
if (!util_str) if (!util_str)
return -ENOMEM; return -ENOMEM;
memcpy(pnetids, util_str, PNETIDS_LEN); memcpy(pnetids, util_str, PNETIDS_LEN);
EBCASC(pnetids, PNETIDS_LEN);
kfree(util_str); kfree(util_str);
return 0; return 0;
} }
...@@ -55,6 +57,7 @@ static int pnet_ids_by_device(struct device *dev, u8 *pnetids) ...@@ -55,6 +57,7 @@ static int pnet_ids_by_device(struct device *dev, u8 *pnetids)
struct zpci_dev *zdev = to_zpci(to_pci_dev(dev)); struct zpci_dev *zdev = to_zpci(to_pci_dev(dev));
memcpy(pnetids, zdev->util_str, sizeof(zdev->util_str)); memcpy(pnetids, zdev->util_str, sizeof(zdev->util_str));
EBCASC(pnetids, sizeof(zdev->util_str));
return 0; return 0;
} }
return -EOPNOTSUPP; return -EOPNOTSUPP;
......
...@@ -74,6 +74,7 @@ struct smcd_dev { ...@@ -74,6 +74,7 @@ struct smcd_dev {
struct list_head vlan; struct list_head vlan;
struct workqueue_struct *event_wq; struct workqueue_struct *event_wq;
u8 pnetid[SMC_MAX_PNETID_LEN]; u8 pnetid[SMC_MAX_PNETID_LEN];
bool pnetid_by_user;
}; };
struct smcd_dev *smcd_alloc_dev(struct device *parent, const char *name, struct smcd_dev *smcd_alloc_dev(struct device *parent, const char *name,
......
...@@ -30,6 +30,10 @@ ...@@ -30,6 +30,10 @@
#include <net/smc.h> #include <net/smc.h>
#include <asm/ioctls.h> #include <asm/ioctls.h>
#include <net/net_namespace.h>
#include <net/netns/generic.h>
#include "smc_netns.h"
#include "smc.h" #include "smc.h"
#include "smc_clc.h" #include "smc_clc.h"
#include "smc_llc.h" #include "smc_llc.h"
...@@ -1966,10 +1970,33 @@ static const struct net_proto_family smc_sock_family_ops = { ...@@ -1966,10 +1970,33 @@ static const struct net_proto_family smc_sock_family_ops = {
.create = smc_create, .create = smc_create,
}; };
unsigned int smc_net_id;
static __net_init int smc_net_init(struct net *net)
{
return smc_pnet_net_init(net);
}
static void __net_exit smc_net_exit(struct net *net)
{
smc_pnet_net_exit(net);
}
static struct pernet_operations smc_net_ops = {
.init = smc_net_init,
.exit = smc_net_exit,
.id = &smc_net_id,
.size = sizeof(struct smc_net),
};
static int __init smc_init(void) static int __init smc_init(void)
{ {
int rc; int rc;
rc = register_pernet_subsys(&smc_net_ops);
if (rc)
return rc;
rc = smc_pnet_init(); rc = smc_pnet_init();
if (rc) if (rc)
return rc; return rc;
...@@ -2035,6 +2062,7 @@ static void __exit smc_exit(void) ...@@ -2035,6 +2062,7 @@ static void __exit smc_exit(void)
proto_unregister(&smc_proto6); proto_unregister(&smc_proto6);
proto_unregister(&smc_proto); proto_unregister(&smc_proto);
smc_pnet_exit(); smc_pnet_exit();
unregister_pernet_subsys(&smc_net_ops);
} }
module_init(smc_init); module_init(smc_init);
......
...@@ -564,7 +564,6 @@ static void smc_ib_remove_dev(struct ib_device *ibdev, void *client_data) ...@@ -564,7 +564,6 @@ static void smc_ib_remove_dev(struct ib_device *ibdev, void *client_data)
spin_lock(&smc_ib_devices.lock); spin_lock(&smc_ib_devices.lock);
list_del_init(&smcibdev->list); /* remove from smc_ib_devices */ list_del_init(&smcibdev->list); /* remove from smc_ib_devices */
spin_unlock(&smc_ib_devices.lock); spin_unlock(&smc_ib_devices.lock);
smc_pnet_remove_by_ibdev(smcibdev);
smc_ib_cleanup_per_ibdev(smcibdev); smc_ib_cleanup_per_ibdev(smcibdev);
ib_unregister_event_handler(&smcibdev->event_handler); ib_unregister_event_handler(&smcibdev->event_handler);
kfree(smcibdev); kfree(smcibdev);
......
...@@ -42,6 +42,8 @@ struct smc_ib_device { /* ib-device infos for smc */ ...@@ -42,6 +42,8 @@ struct smc_ib_device { /* ib-device infos for smc */
/* mac address per port*/ /* mac address per port*/
u8 pnetid[SMC_MAX_PORTS][SMC_MAX_PNETID_LEN]; u8 pnetid[SMC_MAX_PORTS][SMC_MAX_PNETID_LEN];
/* pnetid per port */ /* pnetid per port */
bool pnetid_by_user[SMC_MAX_PORTS];
/* pnetid defined by user? */
u8 initialized : 1; /* ib dev CQ, evthdl done */ u8 initialized : 1; /* ib dev CQ, evthdl done */
struct work_struct port_event_work; struct work_struct port_event_work;
unsigned long port_event_mask; unsigned long port_event_mask;
......
/* SPDX-License-Identifier: GPL-2.0 */
/* Shared Memory Communications
*
* Network namespace definitions.
*
* Copyright IBM Corp. 2018
*/
#ifndef SMC_NETNS_H
#define SMC_NETNS_H
#include "smc_pnet.h"
extern unsigned int smc_net_id;
/* per-network namespace private data */
struct smc_net {
struct smc_pnettable pnettable;
};
#endif
This diff is collapsed.
...@@ -19,6 +19,16 @@ ...@@ -19,6 +19,16 @@
struct smc_ib_device; struct smc_ib_device;
struct smcd_dev; struct smcd_dev;
/**
* struct smc_pnettable - SMC PNET table anchor
* @lock: Lock for list action
* @pnetlist: List of PNETIDs
*/
struct smc_pnettable {
rwlock_t lock;
struct list_head pnetlist;
};
static inline int smc_pnetid_by_dev_port(struct device *dev, static inline int smc_pnetid_by_dev_port(struct device *dev,
unsigned short port, u8 *pnetid) unsigned short port, u8 *pnetid)
{ {
...@@ -30,8 +40,9 @@ static inline int smc_pnetid_by_dev_port(struct device *dev, ...@@ -30,8 +40,9 @@ static inline int smc_pnetid_by_dev_port(struct device *dev,
} }
int smc_pnet_init(void) __init; int smc_pnet_init(void) __init;
int smc_pnet_net_init(struct net *net);
void smc_pnet_exit(void); void smc_pnet_exit(void);
int smc_pnet_remove_by_ibdev(struct smc_ib_device *ibdev); void smc_pnet_net_exit(struct net *net);
void smc_pnet_find_roce_resource(struct sock *sk, void smc_pnet_find_roce_resource(struct sock *sk,
struct smc_ib_device **smcibdev, u8 *ibport, struct smc_ib_device **smcibdev, u8 *ibport,
unsigned short vlan_id, u8 gid[]); unsigned short vlan_id, u8 gid[]);
......
...@@ -483,7 +483,7 @@ static int smc_tx_rdma_writes(struct smc_connection *conn, ...@@ -483,7 +483,7 @@ static int smc_tx_rdma_writes(struct smc_connection *conn,
*/ */
static int smcr_tx_sndbuf_nonempty(struct smc_connection *conn) static int smcr_tx_sndbuf_nonempty(struct smc_connection *conn)
{ {
struct smc_cdc_producer_flags *pflags; struct smc_cdc_producer_flags *pflags = &conn->local_tx_ctrl.prod_flags;
struct smc_rdma_wr *wr_rdma_buf; struct smc_rdma_wr *wr_rdma_buf;
struct smc_cdc_tx_pend *pend; struct smc_cdc_tx_pend *pend;
struct smc_wr_buf *wr_buf; struct smc_wr_buf *wr_buf;
...@@ -506,7 +506,7 @@ static int smcr_tx_sndbuf_nonempty(struct smc_connection *conn) ...@@ -506,7 +506,7 @@ static int smcr_tx_sndbuf_nonempty(struct smc_connection *conn)
} }
spin_lock_bh(&conn->send_lock); spin_lock_bh(&conn->send_lock);
if (!conn->local_tx_ctrl.prod_flags.urg_data_present) { if (!pflags->urg_data_present) {
rc = smc_tx_rdma_writes(conn, wr_rdma_buf); rc = smc_tx_rdma_writes(conn, wr_rdma_buf);
if (rc) { if (rc) {
smc_wr_tx_put_slot(&conn->lgr->lnk[SMC_SINGLE_LINK], smc_wr_tx_put_slot(&conn->lgr->lnk[SMC_SINGLE_LINK],
...@@ -516,7 +516,6 @@ static int smcr_tx_sndbuf_nonempty(struct smc_connection *conn) ...@@ -516,7 +516,6 @@ static int smcr_tx_sndbuf_nonempty(struct smc_connection *conn)
} }
rc = smc_cdc_msg_send(conn, wr_buf, pend); rc = smc_cdc_msg_send(conn, wr_buf, pend);
pflags = &conn->local_tx_ctrl.prod_flags;
if (!rc && pflags->urg_data_present) { if (!rc && pflags->urg_data_present) {
pflags->urg_data_pending = 0; pflags->urg_data_pending = 0;
pflags->urg_data_present = 0; pflags->urg_data_present = 0;
......
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