@@ -1756,13 +1756,9 @@ static int set_ucontext_resp(struct ib_ucontext *uctx,
17561756 struct mlx5_ib_dev * dev = to_mdev (ibdev );
17571757 struct mlx5_ib_ucontext * context = to_mucontext (uctx );
17581758 struct mlx5_bfreg_info * bfregi = & context -> bfregi ;
1759- int err ;
17601759
17611760 if (MLX5_CAP_GEN (dev -> mdev , dump_fill_mkey )) {
1762- err = mlx5_cmd_dump_fill_mkey (dev -> mdev ,
1763- & resp -> dump_fill_mkey );
1764- if (err )
1765- return err ;
1761+ resp -> dump_fill_mkey = dev -> mkeys .dump_fill_mkey ;
17661762 resp -> comp_mask |=
17671763 MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_DUMP_FILL_MKEY ;
17681764 }
@@ -3012,26 +3008,63 @@ static void mlx5_eth_lag_cleanup(struct mlx5_ib_dev *dev)
30123008 }
30133009}
30143010
3015- static int mlx5_add_netdev_notifier (struct mlx5_ib_dev * dev , u32 port_num )
3011+ static void mlx5_netdev_notifier_register (struct mlx5_roce * roce ,
3012+ struct net_device * netdev )
30163013{
30173014 int err ;
30183015
3019- dev -> port [port_num ].roce .nb .notifier_call = mlx5_netdev_event ;
3020- err = register_netdevice_notifier (& dev -> port [port_num ].roce .nb );
3021- if (err ) {
3022- dev -> port [port_num ].roce .nb .notifier_call = NULL ;
3023- return err ;
3024- }
3016+ if (roce -> tracking_netdev )
3017+ return ;
3018+ roce -> tracking_netdev = netdev ;
3019+ roce -> nb .notifier_call = mlx5_netdev_event ;
3020+ err = register_netdevice_notifier_dev_net (netdev , & roce -> nb , & roce -> nn );
3021+ WARN_ON (err );
3022+ }
30253023
3026- return 0 ;
3024+ static void mlx5_netdev_notifier_unregister (struct mlx5_roce * roce )
3025+ {
3026+ if (!roce -> tracking_netdev )
3027+ return ;
3028+ unregister_netdevice_notifier_dev_net (roce -> tracking_netdev , & roce -> nb ,
3029+ & roce -> nn );
3030+ roce -> tracking_netdev = NULL ;
30273031}
30283032
3029- static void mlx5_remove_netdev_notifier (struct mlx5_ib_dev * dev , u32 port_num )
3033+ static int mlx5e_mdev_notifier_event (struct notifier_block * nb ,
3034+ unsigned long event , void * data )
30303035{
3031- if (dev -> port [port_num ].roce .nb .notifier_call ) {
3032- unregister_netdevice_notifier (& dev -> port [port_num ].roce .nb );
3033- dev -> port [port_num ].roce .nb .notifier_call = NULL ;
3036+ struct mlx5_roce * roce = container_of (nb , struct mlx5_roce , mdev_nb );
3037+ struct net_device * netdev = data ;
3038+
3039+ switch (event ) {
3040+ case MLX5_DRIVER_EVENT_UPLINK_NETDEV :
3041+ if (netdev )
3042+ mlx5_netdev_notifier_register (roce , netdev );
3043+ else
3044+ mlx5_netdev_notifier_unregister (roce );
3045+ break ;
3046+ default :
3047+ return NOTIFY_DONE ;
30343048 }
3049+
3050+ return NOTIFY_OK ;
3051+ }
3052+
3053+ static void mlx5_mdev_netdev_track (struct mlx5_ib_dev * dev , u32 port_num )
3054+ {
3055+ struct mlx5_roce * roce = & dev -> port [port_num ].roce ;
3056+
3057+ roce -> mdev_nb .notifier_call = mlx5e_mdev_notifier_event ;
3058+ mlx5_blocking_notifier_register (dev -> mdev , & roce -> mdev_nb );
3059+ mlx5_core_uplink_netdev_event_replay (dev -> mdev );
3060+ }
3061+
3062+ static void mlx5_mdev_netdev_untrack (struct mlx5_ib_dev * dev , u32 port_num )
3063+ {
3064+ struct mlx5_roce * roce = & dev -> port [port_num ].roce ;
3065+
3066+ mlx5_blocking_notifier_unregister (dev -> mdev , & roce -> mdev_nb );
3067+ mlx5_netdev_notifier_unregister (roce );
30353068}
30363069
30373070static int mlx5_enable_eth (struct mlx5_ib_dev * dev )
@@ -3138,7 +3171,7 @@ static void mlx5_ib_unbind_slave_port(struct mlx5_ib_dev *ibdev,
31383171 if (mpi -> mdev_events .notifier_call )
31393172 mlx5_notifier_unregister (mpi -> mdev , & mpi -> mdev_events );
31403173 mpi -> mdev_events .notifier_call = NULL ;
3141- mlx5_remove_netdev_notifier (ibdev , port_num );
3174+ mlx5_mdev_netdev_untrack (ibdev , port_num );
31423175 spin_lock (& port -> mp .mpi_lock );
31433176
31443177 comps = mpi -> mdev_refcnt ;
@@ -3196,12 +3229,7 @@ static bool mlx5_ib_bind_slave_port(struct mlx5_ib_dev *ibdev,
31963229 if (err )
31973230 goto unbind ;
31983231
3199- err = mlx5_add_netdev_notifier (ibdev , port_num );
3200- if (err ) {
3201- mlx5_ib_err (ibdev , "failed adding netdev notifier for port %u\n" ,
3202- port_num + 1 );
3203- goto unbind ;
3204- }
3232+ mlx5_mdev_netdev_track (ibdev , port_num );
32053233
32063234 mpi -> mdev_events .notifier_call = mlx5_ib_event_slave_port ;
32073235 mlx5_notifier_register (mpi -> mdev , & mpi -> mdev_events );
@@ -3634,6 +3662,10 @@ static int mlx5_ib_stage_init_init(struct mlx5_ib_dev *dev)
36343662 dev -> port [i ].roce .last_port_state = IB_PORT_DOWN ;
36353663 }
36363664
3665+ err = mlx5r_cmd_query_special_mkeys (dev );
3666+ if (err )
3667+ return err ;
3668+
36373669 err = mlx5_ib_init_multiport_master (dev );
36383670 if (err )
36393671 return err ;
@@ -3909,9 +3941,7 @@ static int mlx5_ib_roce_init(struct mlx5_ib_dev *dev)
39093941 port_num = mlx5_core_native_port_num (dev -> mdev ) - 1 ;
39103942
39113943 /* Register only for native ports */
3912- err = mlx5_add_netdev_notifier (dev , port_num );
3913- if (err )
3914- return err ;
3944+ mlx5_mdev_netdev_track (dev , port_num );
39153945
39163946 err = mlx5_enable_eth (dev );
39173947 if (err )
@@ -3920,7 +3950,7 @@ static int mlx5_ib_roce_init(struct mlx5_ib_dev *dev)
39203950
39213951 return 0 ;
39223952cleanup :
3923- mlx5_remove_netdev_notifier (dev , port_num );
3953+ mlx5_mdev_netdev_untrack (dev , port_num );
39243954 return err ;
39253955}
39263956
@@ -3938,7 +3968,7 @@ static void mlx5_ib_roce_cleanup(struct mlx5_ib_dev *dev)
39383968 mlx5_disable_eth (dev );
39393969
39403970 port_num = mlx5_core_native_port_num (dev -> mdev ) - 1 ;
3941- mlx5_remove_netdev_notifier (dev , port_num );
3971+ mlx5_mdev_netdev_untrack (dev , port_num );
39423972 }
39433973}
39443974
0 commit comments