Re: [PATCH v2 5/5] vduse: Support registering userspace memory for IOTLB

kernel test robot
2022-07-07T23:02:24Z

Hi Xie,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on linus/master]
[also build test ERROR on v5.19-rc5 next-20220707]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Xie-Yongji/VDUSE-Support-registering-userspace-memory-as-bounce-buffer/20220706-130802
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git e35e5b6f695d241ffb1d223207da58a1fbcdff4b
config: hexagon-randconfig-r005-20220707 (https://download.01.org/0day-ci/archive/20220708/202207080640.p8q3NqHB-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 66ae1d60bb278793fd651cece264699d522bab84)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/9be699264e4fede9c3be913b2d1003c260d9fa05
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Xie-Yongji/VDUSE-Support-registering-userspace-memory-as-bounce-buffer/20220706-130802
git checkout 9be699264e4fede9c3be913b2d1003c260d9fa05
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash drivers/vdpa/vdpa_user/

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>

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

>> drivers/vdpa/vdpa_user/vduse_dev.c:949:2: error: call to undeclared function 'vfree'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
vfree(dev->iotlb_mem->pages);
^
>> drivers/vdpa/vdpa_user/vduse_dev.c:978:14: error: call to undeclared function '__vmalloc'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
page_list = __vmalloc(array_size(npages, sizeof(struct page *)),
^
drivers/vdpa/vdpa_user/vduse_dev.c:978:14: note: did you mean '__kmalloc'?
include/linux/slab.h:434:7: note: '__kmalloc' declared here
void *__kmalloc(size_t size, gfp_t flags) __assume_kmalloc_alignment __alloc_size(1);
^
>> drivers/vdpa/vdpa_user/vduse_dev.c:978:12: warning: incompatible integer to pointer conversion assigning to 'struct page **' from 'int' [-Wint-conversion]
page_list = __vmalloc(array_size(npages, sizeof(struct page *)),
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/vdpa/vdpa_user/vduse_dev.c:1018:3: error: call to undeclared function 'vfree'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
vfree(page_list);
^
drivers/vdpa/vdpa_user/vduse_dev.c:1654:51: warning: shift count >= width of type [-Wshift-count-overflow]
ret = dma_set_mask_and_coherent(&vdev->vdpa.dev, DMA_BIT_MASK(64));
^~~~~~~~~~~~~~~~
include/linux/dma-mapping.h:76:54: note: expanded from macro 'DMA_BIT_MASK'
#define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
^ ~~~
2 warnings and 3 errors generated.

vim +/vfree +949 drivers/vdpa/vdpa_user/vduse_dev.c

929
930 static int vduse_dev_dereg_iotlb_mem(struct vduse_dev *dev,
931 u64 iova, u64 size)
932 {
933 int ret;
934
935 mutex_lock(&dev->mem_lock);
936 ret = -ENOENT;
937 if (!dev->iotlb_mem)
938 goto unlock;
939
940 ret = -EINVAL;
941 if (dev->iotlb_mem->iova != iova || size != dev->domain->bounce_size)
942 goto unlock;
943
944 vduse_domain_remove_user_bounce_pages(dev->domain);
945 unpin_user_pages_dirty_lock(dev->iotlb_mem->pages,
946 dev->iotlb_mem->npages, true);
947 atomic64_sub(dev->iotlb_mem->npages, &dev->iotlb_mem->mm->pinned_vm);
948 mmdrop(dev->iotlb_mem->mm);
> 949 vfree(dev->iotlb_mem->pages);
950 kfree(dev->iotlb_mem);
951 dev->iotlb_mem = NULL;
952 ret = 0;
953 unlock:
954 mutex_unlock(&dev->mem_lock);
955 return ret;
956 }
957
958 static int vduse_dev_reg_iotlb_mem(struct vduse_dev *dev,
959 u64 iova, u64 uaddr, u64 size)
960 {
961 struct page **page_list = NULL;
962 struct vduse_iotlb_mem *mem = NULL;
963 long pinned = 0;
964 unsigned long npages, lock_limit;
965 int ret;
966
967 if (size != dev->domain->bounce_size ||
968 iova != 0 || uaddr & ~PAGE_MASK)
969 return -EINVAL;
970
971 mutex_lock(&dev->mem_lock);
972 ret = -EEXIST;
973 if (dev->iotlb_mem)
974 goto unlock;
975
976 ret = -ENOMEM;
977 npages = size >> PAGE_SHIFT;
> 978 page_list = __vmalloc(array_size(npages, sizeof(struct page *)),
979 GFP_KERNEL_ACCOUNT);
980 mem = kzalloc(sizeof(*mem), GFP_KERNEL);
981 if (!page_list || !mem)
982 goto unlock;
983
984 mmap_read_lock(current->mm);
985
986 lock_limit = PFN_DOWN(rlimit(RLIMIT_MEMLOCK));
987 if (npages + atomic64_read(&current->mm->pinned_vm) > lock_limit)
988 goto out;
989
990 pinned = pin_user_pages(uaddr, npages, FOLL_LONGTERM | FOLL_WRITE,
991 page_list, NULL);
992 if (pinned != npages) {
993 ret = pinned < 0 ? pinned : -ENOMEM;
994 goto out;
995 }
996
997 ret = vduse_domain_add_user_bounce_pages(dev->domain,
998 page_list, pinned);
999 if (ret)
1000 goto out;
1001
1002 atomic64_add(npages, &current->mm->pinned_vm);
1003
1004 mem->pages = page_list;
1005 mem->npages = pinned;
1006 mem->iova = iova;
1007 mem->mm = current->mm;
1008 mmgrab(current->mm);
1009
1010 dev->iotlb_mem = mem;
1011 out:
1012 if (ret && pinned > 0)
1013 unpin_user_pages(page_list, pinned);
1014
1015 mmap_read_unlock(current->mm);
1016 unlock:
1017 if (ret) {
1018 vfree(page_list);
1019 kfree(mem);
1020 }
1021 mutex_unlock(&dev->mem_lock);
1022 return ret;
1023 }
1024

--
0-DAY CI Kernel Test Service