Subject: Re: [PATCH net-next v4 12/18] net/smc: implement DMB-related operations of loopback

From: kernel test robot <[email-masked]>
Date: Mon, 25 Sep 2023 07:29:44 +0800

Hi Wen,

kernel test robot noticed the following build errors:

[auto build test ERROR on net-next/main]

url:    https://github.com/intel-lab-lkp/linux/commits/Wen-Gu/net-smc-decouple-ism_dev-from-SMC-D-device-dump/20230924-231933
base:   net-next/main
patch link:    https://lore.kernel.org/r/1695568613-125057-13-git-send-email-guwen%40linux.alibaba.com
patch subject: [PATCH net-next v4 12/18] net/smc: implement DMB-related operations of loopback
config: mips-allmodconfig (https://download.01.org/0day-ci/archive/20230925/[email-masked]/config)
compiler: mips-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20230925/[email-masked]/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email-masked]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email-masked]/

All error/warnings (new ones prefixed by >>):

   net/smc/smc_loopback.c: In function 'smc_lo_register_dmb':
>> net/smc/smc_loopback.c:102:30: error: implicit declaration of function 'vzalloc'; did you mean 'kvzalloc'? [-Werror=implicit-function-declaration]
     102 |         dmb_node->cpu_addr = vzalloc(dmb->dmb_len);
         |                              ^~~~~~~
         |                              kvzalloc
>> net/smc/smc_loopback.c:102:28: warning: assignment to 'void *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
     102 |         dmb_node->cpu_addr = vzalloc(dmb->dmb_len);
         |                            ^
   net/smc/smc_loopback.c: In function 'smc_lo_unregister_dmb':
>> net/smc/smc_loopback.c:159:9: error: implicit declaration of function 'vfree'; did you mean 'kvfree'? [-Werror=implicit-function-declaration]
     159 |         vfree(dmb_node->cpu_addr);
         |         ^~~~~
         |         kvfree
   cc1: some warnings being treated as errors

vim +102 net/smc/smc_loopback.c

    79	
    80	static int smc_lo_register_dmb(struct smcd_dev *smcd, struct smcd_dmb *dmb,
    81				       void *client_priv)
    82	{
    83		struct smc_lo_dmb_node *dmb_node, *tmp_node;
    84		struct smc_lo_dev *ldev = smcd->priv;
    85		int sba_idx, rc;
    86	
    87		/* check space for new dmb */
    88		for_each_clear_bit(sba_idx, ldev->sba_idx_mask, SMC_LODEV_MAX_DMBS) {
    89			if (!test_and_set_bit(sba_idx, ldev->sba_idx_mask))
    90				break;
    91		}
    92		if (sba_idx == SMC_LODEV_MAX_DMBS)
    93			return -ENOSPC;
    94	
    95		dmb_node = kzalloc(sizeof(*dmb_node), GFP_KERNEL);
    96		if (!dmb_node) {
    97			rc = -ENOMEM;
    98			goto err_bit;
    99		}
   100	
   101		dmb_node->sba_idx = sba_idx;
 > 102		dmb_node->cpu_addr = vzalloc(dmb->dmb_len);
   103		if (!dmb_node->cpu_addr) {
   104			rc = -ENOMEM;
   105			goto err_node;
   106		}
   107		dmb_node->len = dmb->dmb_len;
   108		dmb_node->dma_addr = SMC_DMA_ADDR_INVALID;
   109	
   110	again:
   111		/* add new dmb into hash table */
   112		get_random_bytes(&dmb_node->token, sizeof(dmb_node->token));
   113		write_lock(&ldev->dmb_ht_lock);
   114		hash_for_each_possible(ldev->dmb_ht, tmp_node, list, dmb_node->token) {
   115			if (tmp_node->token == dmb_node->token) {
   116				write_unlock(&ldev->dmb_ht_lock);
   117				goto again;
   118			}
   119		}
   120		hash_add(ldev->dmb_ht, &dmb_node->list, dmb_node->token);
   121		write_unlock(&ldev->dmb_ht_lock);
   122	
   123		dmb->sba_idx = dmb_node->sba_idx;
   124		dmb->dmb_tok = dmb_node->token;
   125		dmb->cpu_addr = dmb_node->cpu_addr;
   126		dmb->dma_addr = dmb_node->dma_addr;
   127		dmb->dmb_len = dmb_node->len;
   128	
   129		return 0;
   130	
   131	err_node:
   132		kfree(dmb_node);
   133	err_bit:
   134		clear_bit(sba_idx, ldev->sba_idx_mask);
   135		return rc;
   136	}
   137	
   138	static int smc_lo_unregister_dmb(struct smcd_dev *smcd, struct smcd_dmb *dmb)
   139	{
   140		struct smc_lo_dmb_node *dmb_node = NULL, *tmp_node;
   141		struct smc_lo_dev *ldev = smcd->priv;
   142	
   143		/* remove dmb from hash table */
   144		write_lock(&ldev->dmb_ht_lock);
   145		hash_for_each_possible(ldev->dmb_ht, tmp_node, list, dmb->dmb_tok) {
   146			if (tmp_node->token == dmb->dmb_tok) {
   147				dmb_node = tmp_node;
   148				break;
   149			}
   150		}
   151		if (!dmb_node) {
   152			write_unlock(&ldev->dmb_ht_lock);
   153			return -EINVAL;
   154		}
   155		hash_del(&dmb_node->list);
   156		write_unlock(&ldev->dmb_ht_lock);
   157	
   158		clear_bit(dmb_node->sba_idx, ldev->sba_idx_mask);
 > 159		vfree(dmb_node->cpu_addr);
   160		kfree(dmb_node);
   161	
   162		return 0;
   163	}
   164	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki