• Jiri Pirko's avatar
    devlink: convert occ_get op to separate registration · fc56be47
    Jiri Pirko authored
    This resolves race during initialization where the resources with
    ops are registered before driver and the structures used by occ_get
    op is initialized. So keep occ_get callbacks registered only when
    all structs are initialized.
    
    The example flows, as it is in mlxsw:
    1) driver load/asic probe:
       mlxsw_core
          -> mlxsw_sp_resources_register
            -> mlxsw_sp_kvdl_resources_register
              -> devlink_resource_register IDX
       mlxsw_spectrum
          -> mlxsw_sp_kvdl_init
            -> mlxsw_sp_kvdl_parts_init
              -> mlxsw_sp_kvdl_part_init
                -> devlink_resource_size_get IDX (to get the current setup
                                                  size from devlink)
            -> devlink_resource_occ_get_register IDX (register current
                                                      occupancy getter)
    2) reload triggered by devlink command:
      -> mlxsw_devlink_core_bus_device_reload
        -> mlxsw_sp_fini
          -> mlxsw_sp_kvdl_fini
    	-> devlink_resource_occ_get_unregister IDX
        (struct mlxsw_sp *mlxsw_sp is freed at this point, call to occ get
         which is using mlxsw_sp would cause use-after free)
        -> mlxsw_sp_init
          -> mlxsw_sp_kvdl_init
            -> mlxsw_sp_kvdl_parts_init
              -> mlxsw_sp_kvdl_part_init
                -> devlink_resource_size_get IDX (to get the current setup
                                                  size from devlink)
            -> devlink_resource_occ_get_register IDX (register current
                                                      occupancy getter)
    
    Fixes: d9f9b9a4 ("devlink: Add support for resource abstraction")
    Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    fc56be47
spectrum.c 133 KB