On Tue, Sep 28, 2021 at 11:28:39AM +0800, Mark Zhang wrote: > On 9/28/2021 12:53 AM, Jason Gunthorpe wrote: > > On Wed, Sep 15, 2021 at 02:07:23AM +0300, Leon Romanovsky wrote: > > > > > diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c > > > index 3f6b98a87566..67519730b1ac 100644 > > > +++ b/drivers/infiniband/core/nldev.c > > > @@ -968,15 +968,21 @@ static int fill_stat_counter_hwcounters(struct sk_buff *msg, > > > if (!table_attr) > > > return -EMSGSIZE; > > > @@ -601,11 +604,20 @@ static inline struct rdma_hw_stats *rdma_alloc_hw_stats_struct( > > > if (!stats) > > > return NULL; > > > + stats->is_disabled = kcalloc(BITS_TO_LONGS(num_counters), > > > + sizeof(long), GFP_KERNEL); > > > + if (!stats->is_disabled) > > > + goto err; > > > + > > > > Please de-inline this function and make a rdma_free_hw_stats_struct() > > call to pair with it. The hw_stats_data kfree should be in there. If > > you do this as a precursor patch this patch will be much smaller. > > > > Also, the > > > > stats = kzalloc(sizeof(*stats) + num_counters * sizeof(u64), > > GFP_KERNEL); > > > > Should be using array_size > Maybe use struct_size: > stats = kzalloc(struct_size(stats, value, num_counters), GFP_KERNEL); Right Jason