CC: [email protected]
TO: Yevgeny Kliteynik <[email protected]>
CC: Saeed Mahameed <[email protected]>
CC: Erez Shitrit <[email protected]>
CC: Mark Bloch <[email protected]>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux.git 
testing/net-next-mlx5
head:   40274b1f61191eb677894fb2c9a0a45ce45bdda2
commit: ba35ec2c6bfb48ec81b09ce2bd440190f2848aa1 [1/12] net/mlx5: DR, Add buddy 
allocator utilities
:::::: branch date: 7 hours ago
:::::: commit date: 7 hours ago
config: x86_64-randconfig-m001-20201027 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>
Reported-by: Dan Carpenter <[email protected]>

smatch warnings:
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_buddy.c:87 
mlx5dr_buddy_init() error: double free of 'buddy->bitmap_per_long'

vim +87 drivers/net/ethernet/mellanox/mlx5/core/steering/dr_buddy.c

ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  22  
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  23  int mlx5dr_buddy_init(struct 
mlx5dr_icm_buddy_mem *buddy,
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  24                      unsigned 
int max_order)
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  25  {
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  26        int i;
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  27  
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  28        buddy->max_order = 
max_order;
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  29  
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  30        
INIT_LIST_HEAD(&buddy->list_node);
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  31        
INIT_LIST_HEAD(&buddy->used_list);
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  32        
INIT_LIST_HEAD(&buddy->hot_list);
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  33  
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  34        buddy->bitmap = 
kcalloc(buddy->max_order + 1,
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  35                                
sizeof(*buddy->bitmap),
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  36                                
GFP_KERNEL);
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  37        buddy->num_free = 
kcalloc(buddy->max_order + 1,
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  38                                
  sizeof(*buddy->num_free),
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  39                                
  GFP_KERNEL);
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  40        buddy->bitmap_per_long 
= kcalloc(buddy->max_order + 1,
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  41                                
         sizeof(*buddy->bitmap_per_long),
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  42                                
         GFP_KERNEL);
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  43  
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  44        if (!buddy->bitmap || 
!buddy->num_free || !buddy->bitmap_per_long)
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  45                goto 
err_free_all;
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  46  
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  47        /* Allocating max_order 
bitmaps, one for each order */
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  48  
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  49        for (i = 0; i <= 
buddy->max_order; ++i) {
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  50                unsigned int 
size = 1 << (buddy->max_order - i);
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  51  
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  52                
buddy->bitmap[i] = bitmap_zalloc(size, GFP_KERNEL);
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  53                if 
(!buddy->bitmap[i])
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  54                        goto 
err_out_free_each_bit_per_order;
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  55        }
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  56  
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  57        for (i = 0; i <= 
buddy->max_order; ++i) {
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  58                unsigned int 
size = BITS_TO_LONGS(1 << (buddy->max_order - i));
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  59  
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  60                
buddy->bitmap_per_long[i] = bitmap_zalloc(size, GFP_KERNEL);
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  61                if 
(!buddy->bitmap_per_long[i])
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  62                        goto 
err_out_free_set;
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  63        }
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  64  
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  65        /* In the beginning, we 
have only one order that is available for
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  66         * use (the biggest 
one), so mark the first bit in both bitmaps.
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  67         */
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  68  
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  69        
bitmap_set(buddy->bitmap[buddy->max_order], 0, 1);
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  70        
bitmap_set(buddy->bitmap_per_long[buddy->max_order], 0, 1);
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  71  
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  72        
buddy->num_free[buddy->max_order] = 1;
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  73  
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  74        return 0;
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  75  
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  76  err_out_free_set:
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  77        for (i = 0; i <= 
buddy->max_order; ++i)
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  78                
bitmap_free(buddy->bitmap_per_long[i]);
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  79  
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  80  
err_out_free_each_bit_per_order:
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  81        
kfree(buddy->bitmap_per_long);
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  82  
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  83        for (i = 0; i <= 
buddy->max_order; ++i)
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  84                
bitmap_free(buddy->bitmap[i]);
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  85  
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  86  err_free_all:
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14 @87        
kfree(buddy->bitmap_per_long);
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  88        kfree(buddy->num_free);
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  89        kfree(buddy->bitmap);
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  90        return -ENOMEM;
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  91  }
ba35ec2c6bfb48e Yevgeny Kliteynik 2020-09-14  92  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]

Attachment: .config.gz
Description: application/gzip

_______________________________________________
kbuild mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to