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

Configure Feed

Select the types of activity you want to include in your feed.

mlx4: Use 'void *' as the event param of mlx4_dispatch_event()

Function mlx4_dispatch_event() takes an 'unsigned long' as its event
parameter. The actual value is none (MLX4_DEV_EVENT_CATASTROPHIC_ERROR),
a pointer to mlx4_eqe (MLX4_DEV_EVENT_PORT_MGMT_CHANGE), or a 32-bit
integer (remaining events).

In preparation to switch mlx4_en and mlx4_ib to be an auxiliary device,
the mlx4_interface.event callback is replaced with a notifier and
function mlx4_dispatch_event() gets updated to invoke
atomic_notifier_call_chain(). This requires forwarding the input 'param'
value from the former function to the latter. A problem is that the
notifier call takes 'void *' as its 'param' value, compared to
'unsigned long' used by mlx4_dispatch_event(). Re-passing the value
would need either punning it to 'void *' or passing down the address of
the input 'param'. Both approaches create a number of unnecessary casts.

Change instead the input 'param' of mlx4_dispatch_event() from
'unsigned long' to 'void *'. A mlx4_eqe pointer can be passed directly,
callers using an int value are adjusted to pass its address.

Signed-off-by: Petr Pavlu <petr.pavlu@suse.com>
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Petr Pavlu and committed by
David S. Miller
7ba189ac ef5617e3

+39 -19
+10 -4
drivers/infiniband/hw/mlx4/main.c
··· 3174 3174 } 3175 3175 3176 3176 static void mlx4_ib_event(struct mlx4_dev *dev, void *ibdev_ptr, 3177 - enum mlx4_dev_event event, unsigned long param) 3177 + enum mlx4_dev_event event, void *param) 3178 3178 { 3179 3179 struct ib_event ibev; 3180 3180 struct mlx4_ib_dev *ibdev = to_mdev((struct ib_device *) ibdev_ptr); ··· 3194 3194 return; 3195 3195 } 3196 3196 3197 - if (event == MLX4_DEV_EVENT_PORT_MGMT_CHANGE) 3197 + switch (event) { 3198 + case MLX4_DEV_EVENT_CATASTROPHIC_ERROR: 3199 + break; 3200 + case MLX4_DEV_EVENT_PORT_MGMT_CHANGE: 3198 3201 eqe = (struct mlx4_eqe *)param; 3199 - else 3200 - p = (int) param; 3202 + break; 3203 + default: 3204 + p = *(int *)param; 3205 + break; 3206 + } 3201 3207 3202 3208 switch (event) { 3203 3209 case MLX4_DEV_EVENT_PORT_UP:
+1 -1
drivers/net/ethernet/mellanox/mlx4/catas.c
··· 194 194 mutex_unlock(&persist->device_state_mutex); 195 195 196 196 /* At that step HW was already reset, now notify clients */ 197 - mlx4_dispatch_event(dev, MLX4_DEV_EVENT_CATASTROPHIC_ERROR, 0); 197 + mlx4_dispatch_event(dev, MLX4_DEV_EVENT_CATASTROPHIC_ERROR, NULL); 198 198 mlx4_cmd_wake_completions(dev); 199 199 return; 200 200
+2 -2
drivers/net/ethernet/mellanox/mlx4/cmd.c
··· 2113 2113 if (MLX4_COMM_CMD_FLR == slave_state[slave].last_cmd) 2114 2114 goto inform_slave_state; 2115 2115 2116 - mlx4_dispatch_event(dev, MLX4_DEV_EVENT_SLAVE_SHUTDOWN, slave); 2116 + mlx4_dispatch_event(dev, MLX4_DEV_EVENT_SLAVE_SHUTDOWN, &slave); 2117 2117 2118 2118 /* write the version in the event field */ 2119 2119 reply |= mlx4_comm_get_version(); ··· 2152 2152 if (mlx4_master_activate_admin_state(priv, slave)) 2153 2153 goto reset_slave; 2154 2154 slave_state[slave].active = true; 2155 - mlx4_dispatch_event(dev, MLX4_DEV_EVENT_SLAVE_INIT, slave); 2155 + mlx4_dispatch_event(dev, MLX4_DEV_EVENT_SLAVE_INIT, &slave); 2156 2156 break; 2157 2157 case MLX4_COMM_CMD_VHCR_POST: 2158 2158 if ((slave_state[slave].last_cmd != MLX4_COMM_CMD_VHCR_EN) &&
+15 -2
drivers/net/ethernet/mellanox/mlx4/en_main.c
··· 184 184 } 185 185 186 186 static void mlx4_en_event(struct mlx4_dev *dev, void *endev_ptr, 187 - enum mlx4_dev_event event, unsigned long port) 187 + enum mlx4_dev_event event, void *param) 188 188 { 189 189 struct mlx4_en_dev *mdev = (struct mlx4_en_dev *) endev_ptr; 190 190 struct mlx4_en_priv *priv; 191 + int port; 192 + 193 + switch (event) { 194 + case MLX4_DEV_EVENT_CATASTROPHIC_ERROR: 195 + case MLX4_DEV_EVENT_PORT_MGMT_CHANGE: 196 + case MLX4_DEV_EVENT_SLAVE_INIT: 197 + case MLX4_DEV_EVENT_SLAVE_SHUTDOWN: 198 + break; 199 + default: 200 + port = *(int *)param; 201 + break; 202 + } 191 203 192 204 switch (event) { 193 205 case MLX4_DEV_EVENT_PORT_UP: ··· 217 205 mlx4_err(mdev, "Internal error detected, restarting device\n"); 218 206 break; 219 207 208 + case MLX4_DEV_EVENT_PORT_MGMT_CHANGE: 220 209 case MLX4_DEV_EVENT_SLAVE_INIT: 221 210 case MLX4_DEV_EVENT_SLAVE_SHUTDOWN: 222 211 break; ··· 226 213 !mdev->pndev[port]) 227 214 return; 228 215 mlx4_warn(mdev, "Unhandled event %d for port %d\n", event, 229 - (int) port); 216 + port); 230 217 } 231 218 } 232 219
+8 -7
drivers/net/ethernet/mellanox/mlx4/eq.c
··· 501 501 int port; 502 502 int slave = 0; 503 503 int ret; 504 - u32 flr_slave; 504 + int flr_slave; 505 505 u8 update_slave_state; 506 506 int i; 507 507 enum slave_port_gen_event gen_event; ··· 606 606 port = be32_to_cpu(eqe->event.port_change.port) >> 28; 607 607 slaves_port = mlx4_phys_to_slaves_pport(dev, port); 608 608 if (eqe->subtype == MLX4_PORT_CHANGE_SUBTYPE_DOWN) { 609 - mlx4_dispatch_event(dev, MLX4_DEV_EVENT_PORT_DOWN, 610 - port); 609 + mlx4_dispatch_event( 610 + dev, MLX4_DEV_EVENT_PORT_DOWN, &port); 611 611 mlx4_priv(dev)->sense.do_sense_port[port] = 1; 612 612 if (!mlx4_is_master(dev)) 613 613 break; ··· 647 647 } 648 648 } 649 649 } else { 650 - mlx4_dispatch_event(dev, MLX4_DEV_EVENT_PORT_UP, port); 650 + mlx4_dispatch_event(dev, MLX4_DEV_EVENT_PORT_UP, 651 + &port); 651 652 652 653 mlx4_priv(dev)->sense.do_sense_port[port] = 0; 653 654 ··· 759 758 } 760 759 spin_unlock_irqrestore(&priv->mfunc.master.slave_state_lock, flags); 761 760 mlx4_dispatch_event(dev, MLX4_DEV_EVENT_SLAVE_SHUTDOWN, 762 - flr_slave); 761 + &flr_slave); 763 762 queue_work(priv->mfunc.master.comm_wq, 764 763 &priv->mfunc.master.slave_flr_event_work); 765 764 break; ··· 788 787 break; 789 788 790 789 case MLX4_EVENT_TYPE_PORT_MNG_CHG_EVENT: 791 - mlx4_dispatch_event(dev, MLX4_DEV_EVENT_PORT_MGMT_CHANGE, 792 - (unsigned long) eqe); 790 + mlx4_dispatch_event( 791 + dev, MLX4_DEV_EVENT_PORT_MGMT_CHANGE, eqe); 793 792 break; 794 793 795 794 case MLX4_EVENT_TYPE_RECOVERABLE_ERROR_EVENT:
+1 -1
drivers/net/ethernet/mellanox/mlx4/intf.c
··· 180 180 } 181 181 182 182 void mlx4_dispatch_event(struct mlx4_dev *dev, enum mlx4_dev_event type, 183 - unsigned long param) 183 + void *param) 184 184 { 185 185 struct mlx4_priv *priv = mlx4_priv(dev); 186 186 struct mlx4_device_context *dev_ctx;
+1 -1
drivers/net/ethernet/mellanox/mlx4/mlx4.h
··· 1048 1048 int mlx4_register_device(struct mlx4_dev *dev); 1049 1049 void mlx4_unregister_device(struct mlx4_dev *dev); 1050 1050 void mlx4_dispatch_event(struct mlx4_dev *dev, enum mlx4_dev_event type, 1051 - unsigned long param); 1051 + void *param); 1052 1052 1053 1053 struct mlx4_dev_cap; 1054 1054 struct mlx4_init_hca_param;
+1 -1
include/linux/mlx4/driver.h
··· 58 58 void * (*add) (struct mlx4_dev *dev); 59 59 void (*remove)(struct mlx4_dev *dev, void *context); 60 60 void (*event) (struct mlx4_dev *dev, void *context, 61 - enum mlx4_dev_event event, unsigned long param); 61 + enum mlx4_dev_event event, void *param); 62 62 void (*activate)(struct mlx4_dev *dev, void *context); 63 63 struct list_head list; 64 64 enum mlx4_protocol protocol;