OSDN Git Service

RDMA/ipoib: Set rtnl_link_ops for ipoib interfaces
authorKamal Heib <kamalheib1@gmail.com>
Sun, 4 Oct 2020 13:29:48 +0000 (16:29 +0300)
committerJason Gunthorpe <jgg@nvidia.com>
Mon, 5 Oct 2020 18:05:45 +0000 (15:05 -0300)
Report the "ipoib pkey", "mode" and "umcast" netlink attributes for every
IPoiB interface type, not just children created with 'ip link add'.

After setting the rtnl_link_ops for the parent interface, implement the
dellink() callback to block users from trying to remove it.

Fixes: 862096a8bbf8 ("IB/ipoib: Add more rtnl_link_ops callbacks")
Link: https://lore.kernel.org/r/20201004132948.26669-1-kamalheib1@gmail.com
Signed-off-by: Kamal Heib <kamalheib1@gmail.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/ulp/ipoib/ipoib_main.c
drivers/infiniband/ulp/ipoib/ipoib_netlink.c
drivers/infiniband/ulp/ipoib/ipoib_vlan.c

index ab75b7f..96b6be5 100644 (file)
@@ -2477,6 +2477,8 @@ static struct net_device *ipoib_add_port(const char *format,
        /* call event handler to ensure pkey in sync */
        queue_work(ipoib_workqueue, &priv->flush_heavy);
 
+       ndev->rtnl_link_ops = ipoib_get_link_ops();
+
        result = register_netdev(ndev);
        if (result) {
                pr_warn("%s: couldn't register ipoib port %d; error %d\n",
index 38c984d..d5a90a6 100644 (file)
@@ -144,6 +144,16 @@ static int ipoib_new_child_link(struct net *src_net, struct net_device *dev,
        return 0;
 }
 
+static void ipoib_del_child_link(struct net_device *dev, struct list_head *head)
+{
+       struct ipoib_dev_priv *priv = ipoib_priv(dev);
+
+       if (!priv->parent)
+               return;
+
+       unregister_netdevice_queue(dev, head);
+}
+
 static size_t ipoib_get_size(const struct net_device *dev)
 {
        return nla_total_size(2) +      /* IFLA_IPOIB_PKEY   */
@@ -158,6 +168,7 @@ static struct rtnl_link_ops ipoib_link_ops __read_mostly = {
        .priv_size      = sizeof(struct ipoib_dev_priv),
        .setup          = ipoib_setup_common,
        .newlink        = ipoib_new_child_link,
+       .dellink        = ipoib_del_child_link,
        .changelink     = ipoib_changelink,
        .get_size       = ipoib_get_size,
        .fill_info      = ipoib_fill_info,
index 3086560..4c50a87 100644 (file)
@@ -195,6 +195,8 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey)
        }
        priv = ipoib_priv(ndev);
 
+       ndev->rtnl_link_ops = ipoib_get_link_ops();
+
        result = __ipoib_vlan_add(ppriv, priv, pkey, IPOIB_LEGACY_CHILD);
 
        if (result && ndev->reg_state == NETREG_UNINITIALIZED)