Re: [bug report] net/mlx5e: Add mlx5e HV VHCA stats agent

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 8/26/2019 3:56 PM, Dan Carpenter wrote:
> Hello Eran Ben Elisha,
> 
> The patch cef35af34d6d: "net/mlx5e: Add mlx5e HV VHCA stats agent"
> from Aug 22, 2019, leads to the following static checker warning:
> 
> 	drivers/net/ethernet/mellanox/mlx5/core/en/hv_vhca_stats.c:41 mlx5e_hv_vhca_fill_stats()
> 	warn: potential pointer math issue ('buf' is a u64 pointer)
> 
> drivers/net/ethernet/mellanox/mlx5/core/en/hv_vhca_stats.c
>      33  static void mlx5e_hv_vhca_fill_stats(struct mlx5e_priv *priv, u64 *data,
>                                                                        ^^^^^^^^^
> data is a u64 pointer.
> 
>      34                                       int buf_len)
>      35  {
>      36          int ch, i = 0;
>      37
>      38          for (ch = 0; ch < priv->max_nch; ch++) {
>      39                  u64 *buf = data + i;
>                          ^^^^^^^^
> 
>      40
>      41                  if (WARN_ON_ONCE(buf +
>      42                                   sizeof(struct mlx5e_hv_vhca_per_ring_stats) >
>                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> This pointer math doesn't work.  I'm surprised the warning doesn't
> trigger.

It it not triggered as both 'data' and 'buf' are u64*,
and sizeof(struct mlx5e_hv_vhca_per_ring_stats) < buf_len as expected.
This checker does the work, but over wrong range.


> 
>      43                                   data + buf_len))
>      44                          return;
>      45
>      46                  mlx5e_hv_vhca_fill_ring_stats(priv, ch,
>      47                                                (struct mlx5e_hv_vhca_per_ring_stats *)buf);
>                                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> If we made both "data" and "buf" void pointers then this would be
> much easier and the casting could be removed.

I agree I can make it simpler, I will post a fix.

> 
> 
>      48                  i += sizeof(struct mlx5e_hv_vhca_per_ring_stats) / sizeof(u64);
>                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> This math works, but it's so complicated and you have to verify that
> mlx5e_hv_vhca_per_ring_stats % sizeof(u64) is zero.

It shouldn't be zero. Basically, it equals to a static value of 4...
the code is written in that way to support extension of 
mlx5e_hv_vhca_per_ring_stats without touching here.

> 
>      49          }
>      50  }
> 
> regards,
> dan carpenter

Thanks you for the report,
Eran

> 




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux