On Wed, Sep 26, 2018 at 10:51:00AM -0500, Steve Wise wrote: > > > On 9/25/2018 3:16 PM, Jason Gunthorpe wrote: > > On Thu, Sep 13, 2018 at 12:16:20PM -0700, Steve Wise wrote: > >> Add support for new LINK messages to allow adding and deleting rdma > >> interfaces. This will be used initially for soft rdma drivers which > >> instantiate device instances dynamically by the admin specifying a netdev > >> device to use. The rdma_rxe module will be the first user of these > >> messages. > >> > >> The design is modeled after RTNL_NEWLINK/DELLINK: rdma drivers > >> register with the rdma core if they provide link add/delete functions. > >> Each driver registers with a unique "type" string, that is used to > >> dispatch messages coming from user space. A new RDMA_NLDEV_ATTR is > >> defined for the "type" string. User mode will pass 3 attributes in a > >> NEWLINK message: RDMA_NLDEV_ATTR_IBDEV_NAME for the desired rdma device > >> name to be created, RDMA_NLDEV_ATTR_LINK_TYPE for the "type" of link > >> being added, and RDMA_NLDEV_ATTR_NDEV_NAME for the net_device interface > >> to use for this link. The DELLINK message will contain the IBDEV_NAME > >> and LINK_TYPE attributes. > >> > >> Signed-off-by: Steve Wise <swise@xxxxxxxxxxxxxxxxxxxxx> > >> drivers/infiniband/core/nldev.c | 113 +++++++++++++++++++++++++++++++++++++++ > >> include/rdma/rdma_netlink.h | 11 ++++ > >> include/uapi/rdma/rdma_netlink.h | 9 ++++ > >> 3 files changed, 133 insertions(+) > >> > >> diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c > >> index 0385ab438320..d107b982c210 100644 > >> +++ b/drivers/infiniband/core/nldev.c > >> @@ -33,6 +33,7 @@ > >> #include <linux/module.h> > >> #include <linux/pid.h> > >> #include <linux/pid_namespace.h> > >> +#include <linux/mutex.h> > >> #include <net/netlink.h> > >> #include <rdma/rdma_cm.h> > >> #include <rdma/rdma_netlink.h> > >> @@ -107,6 +108,8 @@ > >> [RDMA_NLDEV_ATTR_DRIVER_U32] = { .type = NLA_U32 }, > >> [RDMA_NLDEV_ATTR_DRIVER_S64] = { .type = NLA_S64 }, > >> [RDMA_NLDEV_ATTR_DRIVER_U64] = { .type = NLA_U64 }, > >> + [RDMA_NLDEV_ATTR_LINK_TYPE] = { .type = NLA_NUL_STRING, > >> + .len = IFNAMSIZ }, > >> }; > >> > >> static int put_driver_name_print_type(struct sk_buff *msg, const char *name, > >> @@ -1072,6 +1075,110 @@ static int nldev_res_get_pd_dumpit(struct sk_buff *skb, > >> return res_get_common_dumpit(skb, cb, RDMA_RESTRACK_PD); > >> } > >> > >> +static LIST_HEAD(link_ops); > >> +static DEFINE_MUTEX(link_ops_mutex); > >> + > >> +void rdma_link_register(struct rdma_link_ops *ops) > >> +{ > >> + mutex_lock(&link_ops_mutex); > >> + list_add(&ops->list, &link_ops); > > > > Make sure the name is unique > > The function name? No, ops->type Jason