Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

devlink: Reduce struct devlink exposure

The declaration of struct devlink in general header provokes the
situation where internal fields can be accidentally used by the driver
authors. In order to reduce such possible situations, let's reduce the
namespace exposure of struct devlink.

Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Leon Romanovsky and committed by
Jakub Kicinski
21314638 177c9235

+98 -87
+1 -1
drivers/net/ethernet/mellanox/mlxfw/mlxfw.h
··· 19 19 static inline 20 20 struct device *mlxfw_dev_dev(struct mlxfw_dev *mlxfw_dev) 21 21 { 22 - return mlxfw_dev->devlink->dev; 22 + return devlink_to_dev(mlxfw_dev->devlink); 23 23 } 24 24 25 25 #define MLXFW_PRFX "mlxfw: "
+4 -50
include/net/devlink.h
··· 21 21 #include <linux/xarray.h> 22 22 #include <linux/firmware.h> 23 23 24 - #define DEVLINK_RELOAD_STATS_ARRAY_SIZE \ 25 - (__DEVLINK_RELOAD_LIMIT_MAX * __DEVLINK_RELOAD_ACTION_MAX) 26 - 27 - struct devlink_dev_stats { 28 - u32 reload_stats[DEVLINK_RELOAD_STATS_ARRAY_SIZE]; 29 - u32 remote_reload_stats[DEVLINK_RELOAD_STATS_ARRAY_SIZE]; 30 - }; 31 - 32 - struct devlink_ops; 33 - 34 - struct devlink { 35 - u32 index; 36 - struct list_head port_list; 37 - struct list_head rate_list; 38 - struct list_head sb_list; 39 - struct list_head dpipe_table_list; 40 - struct list_head resource_list; 41 - struct list_head param_list; 42 - struct list_head region_list; 43 - struct list_head reporter_list; 44 - struct mutex reporters_lock; /* protects reporter_list */ 45 - struct devlink_dpipe_headers *dpipe_headers; 46 - struct list_head trap_list; 47 - struct list_head trap_group_list; 48 - struct list_head trap_policer_list; 49 - const struct devlink_ops *ops; 50 - struct xarray snapshot_ids; 51 - struct devlink_dev_stats stats; 52 - struct device *dev; 53 - possible_net_t _net; 54 - struct mutex lock; /* Serializes access to devlink instance specific objects such as 55 - * port, sb, dpipe, resource, params, region, traps and more. 56 - */ 57 - u8 reload_failed:1, 58 - reload_enabled:1; 59 - refcount_t refcount; 60 - struct completion comp; 61 - char priv[0] __aligned(NETDEV_ALIGN); 62 - }; 24 + struct devlink; 63 25 64 26 struct devlink_port_phys_attrs { 65 27 u32 port_number; /* Same value as "split group". ··· 1482 1520 struct netlink_ext_ack *extack); 1483 1521 }; 1484 1522 1485 - static inline void *devlink_priv(struct devlink *devlink) 1486 - { 1487 - BUG_ON(!devlink); 1488 - return &devlink->priv; 1489 - } 1490 - 1491 - static inline struct devlink *priv_to_devlink(void *priv) 1492 - { 1493 - BUG_ON(!priv); 1494 - return container_of(priv, struct devlink, priv); 1495 - } 1523 + void *devlink_priv(struct devlink *devlink); 1524 + struct devlink *priv_to_devlink(void *priv); 1525 + struct device *devlink_to_dev(const struct devlink *devlink); 1496 1526 1497 1527 static inline struct devlink_port * 1498 1528 netdev_to_devlink_port(struct net_device *dev)
+36 -36
include/trace/events/devlink.h
··· 21 21 TP_ARGS(devlink, incoming, type, buf, len), 22 22 23 23 TP_STRUCT__entry( 24 - __string(bus_name, devlink->dev->bus->name) 25 - __string(dev_name, dev_name(devlink->dev)) 26 - __string(driver_name, devlink->dev->driver->name) 24 + __string(bus_name, devlink_to_dev(devlink)->bus->name) 25 + __string(dev_name, dev_name(devlink_to_dev(devlink))) 26 + __string(driver_name, devlink_to_dev(devlink)->driver->name) 27 27 __field(bool, incoming) 28 28 __field(unsigned long, type) 29 29 __dynamic_array(u8, buf, len) ··· 31 31 ), 32 32 33 33 TP_fast_assign( 34 - __assign_str(bus_name, devlink->dev->bus->name); 35 - __assign_str(dev_name, dev_name(devlink->dev)); 36 - __assign_str(driver_name, devlink->dev->driver->name); 34 + __assign_str(bus_name, devlink_to_dev(devlink)->bus->name); 35 + __assign_str(dev_name, dev_name(devlink_to_dev(devlink))); 36 + __assign_str(driver_name, devlink_to_dev(devlink)->driver->name); 37 37 __entry->incoming = incoming; 38 38 __entry->type = type; 39 39 memcpy(__get_dynamic_array(buf), buf, len); ··· 55 55 TP_ARGS(devlink, err, msg), 56 56 57 57 TP_STRUCT__entry( 58 - __string(bus_name, devlink->dev->bus->name) 59 - __string(dev_name, dev_name(devlink->dev)) 60 - __string(driver_name, devlink->dev->driver->name) 58 + __string(bus_name, devlink_to_dev(devlink)->bus->name) 59 + __string(dev_name, dev_name(devlink_to_dev(devlink))) 60 + __string(driver_name, devlink_to_dev(devlink)->driver->name) 61 61 __field(int, err) 62 62 __string(msg, msg) 63 63 ), 64 64 65 65 TP_fast_assign( 66 - __assign_str(bus_name, devlink->dev->bus->name); 67 - __assign_str(dev_name, dev_name(devlink->dev)); 68 - __assign_str(driver_name, devlink->dev->driver->name); 66 + __assign_str(bus_name, devlink_to_dev(devlink)->bus->name); 67 + __assign_str(dev_name, dev_name(devlink_to_dev(devlink))); 68 + __assign_str(driver_name, devlink_to_dev(devlink)->driver->name); 69 69 __entry->err = err; 70 70 __assign_str(msg, msg); 71 71 ), ··· 85 85 TP_ARGS(devlink, reporter_name, msg), 86 86 87 87 TP_STRUCT__entry( 88 - __string(bus_name, devlink->dev->bus->name) 89 - __string(dev_name, dev_name(devlink->dev)) 90 - __string(driver_name, devlink->dev->driver->name) 88 + __string(bus_name, devlink_to_dev(devlink)->bus->name) 89 + __string(dev_name, dev_name(devlink_to_dev(devlink))) 90 + __string(driver_name, devlink_to_dev(devlink)->driver->name) 91 91 __string(reporter_name, msg) 92 92 __string(msg, msg) 93 93 ), 94 94 95 95 TP_fast_assign( 96 - __assign_str(bus_name, devlink->dev->bus->name); 97 - __assign_str(dev_name, dev_name(devlink->dev)); 98 - __assign_str(driver_name, devlink->dev->driver->name); 96 + __assign_str(bus_name, devlink_to_dev(devlink)->bus->name); 97 + __assign_str(dev_name, dev_name(devlink_to_dev(devlink))); 98 + __assign_str(driver_name, devlink_to_dev(devlink)->driver->name); 99 99 __assign_str(reporter_name, reporter_name); 100 100 __assign_str(msg, msg); 101 101 ), ··· 116 116 TP_ARGS(devlink, reporter_name, health_state, time_since_last_recover), 117 117 118 118 TP_STRUCT__entry( 119 - __string(bus_name, devlink->dev->bus->name) 120 - __string(dev_name, dev_name(devlink->dev)) 121 - __string(driver_name, devlink->dev->driver->name) 119 + __string(bus_name, devlink_to_dev(devlink)->bus->name) 120 + __string(dev_name, dev_name(devlink_to_dev(devlink))) 121 + __string(driver_name, devlink_to_dev(devlink)->driver->name) 122 122 __string(reporter_name, reporter_name) 123 123 __field(bool, health_state) 124 124 __field(u64, time_since_last_recover) 125 125 ), 126 126 127 127 TP_fast_assign( 128 - __assign_str(bus_name, devlink->dev->bus->name); 129 - __assign_str(dev_name, dev_name(devlink->dev)); 130 - __assign_str(driver_name, devlink->dev->driver->name); 128 + __assign_str(bus_name, devlink_to_dev(devlink)->bus->name); 129 + __assign_str(dev_name, dev_name(devlink_to_dev(devlink))); 130 + __assign_str(driver_name, devlink_to_dev(devlink)->driver->name); 131 131 __assign_str(reporter_name, reporter_name); 132 132 __entry->health_state = health_state; 133 133 __entry->time_since_last_recover = time_since_last_recover; ··· 150 150 TP_ARGS(devlink, reporter_name, new_state), 151 151 152 152 TP_STRUCT__entry( 153 - __string(bus_name, devlink->dev->bus->name) 154 - __string(dev_name, dev_name(devlink->dev)) 155 - __string(driver_name, devlink->dev->driver->name) 153 + __string(bus_name, devlink_to_dev(devlink)->bus->name) 154 + __string(dev_name, dev_name(devlink_to_dev(devlink))) 155 + __string(driver_name, devlink_to_dev(devlink)->driver->name) 156 156 __string(reporter_name, reporter_name) 157 157 __field(u8, new_state) 158 158 ), 159 159 160 160 TP_fast_assign( 161 - __assign_str(bus_name, devlink->dev->bus->name); 162 - __assign_str(dev_name, dev_name(devlink->dev)); 163 - __assign_str(driver_name, devlink->dev->driver->name); 161 + __assign_str(bus_name, devlink_to_dev(devlink)->bus->name); 162 + __assign_str(dev_name, dev_name(devlink_to_dev(devlink))); 163 + __assign_str(driver_name, devlink_to_dev(devlink)->driver->name); 164 164 __assign_str(reporter_name, reporter_name); 165 165 __entry->new_state = new_state; 166 166 ), ··· 181 181 TP_ARGS(devlink, skb, metadata), 182 182 183 183 TP_STRUCT__entry( 184 - __string(bus_name, devlink->dev->bus->name) 185 - __string(dev_name, dev_name(devlink->dev)) 186 - __string(driver_name, devlink->dev->driver->name) 184 + __string(bus_name, devlink_to_dev(devlink)->bus->name) 185 + __string(dev_name, dev_name(devlink_to_dev(devlink))) 186 + __string(driver_name, devlink_to_dev(devlink)->driver->name) 187 187 __string(trap_name, metadata->trap_name) 188 188 __string(trap_group_name, metadata->trap_group_name) 189 189 __dynamic_array(char, input_dev_name, IFNAMSIZ) ··· 192 192 TP_fast_assign( 193 193 struct net_device *input_dev = metadata->input_dev; 194 194 195 - __assign_str(bus_name, devlink->dev->bus->name); 196 - __assign_str(dev_name, dev_name(devlink->dev)); 197 - __assign_str(driver_name, devlink->dev->driver->name); 195 + __assign_str(bus_name, devlink_to_dev(devlink)->bus->name); 196 + __assign_str(dev_name, dev_name(devlink_to_dev(devlink))); 197 + __assign_str(driver_name, devlink_to_dev(devlink)->driver->name); 198 198 __assign_str(trap_name, metadata->trap_name); 199 199 __assign_str(trap_group_name, metadata->trap_group_name); 200 200 __assign_str(input_dev_name,
+57
net/core/devlink.c
··· 30 30 #define CREATE_TRACE_POINTS 31 31 #include <trace/events/devlink.h> 32 32 33 + #define DEVLINK_RELOAD_STATS_ARRAY_SIZE \ 34 + (__DEVLINK_RELOAD_LIMIT_MAX * __DEVLINK_RELOAD_ACTION_MAX) 35 + 36 + struct devlink_dev_stats { 37 + u32 reload_stats[DEVLINK_RELOAD_STATS_ARRAY_SIZE]; 38 + u32 remote_reload_stats[DEVLINK_RELOAD_STATS_ARRAY_SIZE]; 39 + }; 40 + 41 + struct devlink { 42 + u32 index; 43 + struct list_head port_list; 44 + struct list_head rate_list; 45 + struct list_head sb_list; 46 + struct list_head dpipe_table_list; 47 + struct list_head resource_list; 48 + struct list_head param_list; 49 + struct list_head region_list; 50 + struct list_head reporter_list; 51 + struct mutex reporters_lock; /* protects reporter_list */ 52 + struct devlink_dpipe_headers *dpipe_headers; 53 + struct list_head trap_list; 54 + struct list_head trap_group_list; 55 + struct list_head trap_policer_list; 56 + const struct devlink_ops *ops; 57 + struct xarray snapshot_ids; 58 + struct devlink_dev_stats stats; 59 + struct device *dev; 60 + possible_net_t _net; 61 + /* Serializes access to devlink instance specific objects such as 62 + * port, sb, dpipe, resource, params, region, traps and more. 63 + */ 64 + struct mutex lock; 65 + u8 reload_failed:1, 66 + reload_enabled:1; 67 + refcount_t refcount; 68 + struct completion comp; 69 + char priv[0] __aligned(NETDEV_ALIGN); 70 + }; 71 + 72 + void *devlink_priv(struct devlink *devlink) 73 + { 74 + return &devlink->priv; 75 + } 76 + EXPORT_SYMBOL_GPL(devlink_priv); 77 + 78 + struct devlink *priv_to_devlink(void *priv) 79 + { 80 + return container_of(priv, struct devlink, priv); 81 + } 82 + EXPORT_SYMBOL_GPL(priv_to_devlink); 83 + 84 + struct device *devlink_to_dev(const struct devlink *devlink) 85 + { 86 + return devlink->dev; 87 + } 88 + EXPORT_SYMBOL_GPL(devlink_to_dev); 89 + 33 90 static struct devlink_dpipe_field devlink_dpipe_fields_ethernet[] = { 34 91 { 35 92 .name = "destination mac",