net: devlink: convert devlink port type-specific pointers to union
authorJiri Pirko <jiri@nvidia.com>
Wed, 2 Nov 2022 16:01:59 +0000 (17:01 +0100)
committerJakub Kicinski <kuba@kernel.org>
Fri, 4 Nov 2022 03:48:32 +0000 (20:48 -0700)
Instead of storing type_dev as a void pointer, convert it to union and
use it to store either struct net_device or struct ib_device pointer.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/devlink.h
net/core/devlink.c

index ba6b8b0..6c55aab 100644 (file)
@@ -121,12 +121,19 @@ struct devlink_port {
        struct list_head region_list;
        struct devlink *devlink;
        unsigned int index;
-       spinlock_t type_lock; /* Protects type and type_dev
-                              * pointer consistency.
+       spinlock_t type_lock; /* Protects type and type_eth/ib
+                              * structures consistency.
                               */
        enum devlink_port_type type;
        enum devlink_port_type desired_type;
-       void *type_dev;
+       union {
+               struct {
+                       struct net_device *netdev;
+               } type_eth;
+               struct {
+                       struct ib_device *ibdev;
+               } type_ib;
+       };
        struct devlink_port_attrs attrs;
        u8 attrs_set:1,
           switch_port:1,
index 0a16ad4..868d04c 100644 (file)
@@ -1303,7 +1303,7 @@ static int devlink_nl_port_fill(struct sk_buff *msg,
                goto nla_put_failure_type_locked;
        if (devlink_port->type == DEVLINK_PORT_TYPE_ETH) {
                struct net *net = devlink_net(devlink_port->devlink);
-               struct net_device *netdev = devlink_port->type_dev;
+               struct net_device *netdev = devlink_port->type_eth.netdev;
 
                if (netdev && net_eq(net, dev_net(netdev)) &&
                    (nla_put_u32(msg, DEVLINK_ATTR_PORT_NETDEV_IFINDEX,
@@ -1313,7 +1313,7 @@ static int devlink_nl_port_fill(struct sk_buff *msg,
                        goto nla_put_failure_type_locked;
        }
        if (devlink_port->type == DEVLINK_PORT_TYPE_IB) {
-               struct ib_device *ibdev = devlink_port->type_dev;
+               struct ib_device *ibdev = devlink_port->type_ib.ibdev;
 
                if (ibdev &&
                    nla_put_string(msg, DEVLINK_ATTR_PORT_IBDEV_NAME,
@@ -10003,7 +10003,16 @@ static void __devlink_port_type_set(struct devlink_port *devlink_port,
        devlink_port_type_warn_cancel(devlink_port);
        spin_lock_bh(&devlink_port->type_lock);
        devlink_port->type = type;
-       devlink_port->type_dev = type_dev;
+       switch (type) {
+       case DEVLINK_PORT_TYPE_ETH:
+               devlink_port->type_eth.netdev = type_dev;
+               break;
+       case DEVLINK_PORT_TYPE_IB:
+               devlink_port->type_ib.ibdev = type_dev;
+               break;
+       default:
+               break;
+       }
        spin_unlock_bh(&devlink_port->type_lock);
        devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
 }
@@ -12016,7 +12025,7 @@ devlink_trap_report_metadata_set(struct devlink_trap_metadata *metadata,
 
        spin_lock(&in_devlink_port->type_lock);
        if (in_devlink_port->type == DEVLINK_PORT_TYPE_ETH)
-               metadata->input_dev = in_devlink_port->type_dev;
+               metadata->input_dev = in_devlink_port->type_eth.netdev;
        spin_unlock(&in_devlink_port->type_lock);
 }