On Fri, Nov 11, 2016 at 11:20:42AM +0100, Jiri Pirko wrote:
> From: Arkadi Sharshevsky <arka...@mellanox.com>
> 
> During neighbour activity check the device's table is dumped by multiple
> query requests. The query session should end when the response carries
> less records than requested or when a given record is not full. Current
> code only stops the dumping process if the number of returned records is
> zero, which can result in infinite loop in case of activity.
> 
> Fix this by stopping the dumping process according to the above logic.
> 
> Fixes: c723c735fa6b ("mlxsw: spectrum_router: Periodically update the 
> kernel's neigh table")
> Signed-off-by: Arkadi Sharshevsky <arka...@mellanox.com>
> Signed-off-by: Ido Schimmel <ido...@mellanox.com>
> Signed-off-by: Jiri Pirko <j...@mellanox.com>
> ---
>  .../net/ethernet/mellanox/mlxsw/spectrum_router.c  | 22 
> +++++++++++++++++++++-
>  1 file changed, 21 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c 
> b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
> index 040737e..d437457 100644
> --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
> +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
> @@ -800,6 +800,26 @@ static void mlxsw_sp_router_neigh_rec_process(struct 
> mlxsw_sp *mlxsw_sp,
>       }
>  }
>  
> +static bool mlxsw_sp_router_rauhtd_is_full(char *rauhtd_pl)
> +{
> +     u8 num_rec, last_rec_index, num_entries;
> +
> +     num_rec = mlxsw_reg_rauhtd_num_rec_get(rauhtd_pl);
> +     last_rec_index = num_rec - 1;
> +
> +     if (num_rec < MLXSW_REG_RAUHTD_REC_MAX_NUM)
> +             return false;
> +     if (mlxsw_reg_rauhtd_rec_type_get(rauhtd_pl, last_rec_index) ==
> +         MLXSW_REG_RAUHTD_TYPE_IPV6)
> +             return true;
> +
> +     num_entries = mlxsw_reg_rauhtd_ipv4_rec_num_entries_get(rauhtd_pl,
> +                                                             last_rec_index);
> +     if (++num_entries ==  MLXSW_REG_RAUHTD_IPV4_ENT_PER_REC)

Jiri, I just noticed we have an extra space after the '=='. Can you
please remove it in v2? Sorry for not spotting this earlier.

> +             return true;
> +     return false;
> +}
> +
>  static int mlxsw_sp_router_neighs_update_rauhtd(struct mlxsw_sp *mlxsw_sp)
>  {
>       char *rauhtd_pl;
> @@ -826,7 +846,7 @@ static int mlxsw_sp_router_neighs_update_rauhtd(struct 
> mlxsw_sp *mlxsw_sp)
>               for (i = 0; i < num_rec; i++)
>                       mlxsw_sp_router_neigh_rec_process(mlxsw_sp, rauhtd_pl,
>                                                         i);
> -     } while (num_rec);
> +     } while (mlxsw_sp_router_rauhtd_is_full(rauhtd_pl));
>       rtnl_unlock();
>  
>       kfree(rauhtd_pl);
> -- 
> 2.7.4
> 

Reply via email to