CC: [email protected] BCC: [email protected] In-Reply-To: <[email protected]> References: <[email protected]> TO: Tianyu Lan <[email protected]>
Hi Tianyu, [FYI, it's a private test report for your RFC patch.] [auto build test WARNING on next-20220429] [cannot apply to linus/master v5.18-rc5 v5.18-rc4 v5.18-rc3 v5.18-rc5] [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] url: https://github.com/intel-lab-lkp/linux/commits/Tianyu-Lan/swiotlb-Add-child-io-tlb-mem-support/20220502-205700 base: 5469f0c06732a077c70a759a81f2a1f00b277694 :::::: branch date: 8 hours ago :::::: commit date: 8 hours ago config: x86_64-randconfig-m001 (https://download.01.org/0day-ci/archive/20220503/[email protected]/config) compiler: gcc-11 (Debian 11.2.0-20) 11.2.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: kernel/dma/swiotlb.c:958 swiotlb_alloc_block() error: uninitialized symbol 'nslot'. kernel/dma/swiotlb.c:1024 swiotlb_device_allocate() error: double free of 'mem' vim +/nslot +958 kernel/dma/swiotlb.c 3349f5b007cd7e Tianyu Lan 2022-05-02 926 3349f5b007cd7e Tianyu Lan 2022-05-02 927 3349f5b007cd7e Tianyu Lan 2022-05-02 928 static struct page *swiotlb_alloc_block(struct io_tlb_mem *mem, unsigned int block_num) 3349f5b007cd7e Tianyu Lan 2022-05-02 929 { 3349f5b007cd7e Tianyu Lan 2022-05-02 930 unsigned int block_index, nslot; 3349f5b007cd7e Tianyu Lan 2022-05-02 931 phys_addr_t tlb_addr; 3349f5b007cd7e Tianyu Lan 2022-05-02 932 unsigned long flags; 3349f5b007cd7e Tianyu Lan 2022-05-02 933 int i, j; 3349f5b007cd7e Tianyu Lan 2022-05-02 934 3349f5b007cd7e Tianyu Lan 2022-05-02 935 if (!mem || !mem->block) 3349f5b007cd7e Tianyu Lan 2022-05-02 936 return NULL; 3349f5b007cd7e Tianyu Lan 2022-05-02 937 3349f5b007cd7e Tianyu Lan 2022-05-02 938 spin_lock_irqsave(&mem->lock, flags); 3349f5b007cd7e Tianyu Lan 2022-05-02 939 block_index = mem->block_index; 3349f5b007cd7e Tianyu Lan 2022-05-02 940 3349f5b007cd7e Tianyu Lan 2022-05-02 941 /* Todo: Search more blocks. */ 3349f5b007cd7e Tianyu Lan 2022-05-02 942 if (mem->block[block_index].list < block_num) { 3349f5b007cd7e Tianyu Lan 2022-05-02 943 spin_unlock_irqrestore(&mem->lock, flags); 3349f5b007cd7e Tianyu Lan 2022-05-02 944 return NULL; 3349f5b007cd7e Tianyu Lan 2022-05-02 945 } 3349f5b007cd7e Tianyu Lan 2022-05-02 946 3349f5b007cd7e Tianyu Lan 2022-05-02 947 /* Update block and slot list. */ 3349f5b007cd7e Tianyu Lan 2022-05-02 948 for (i = block_index; i < block_index + block_num; i++) { 3349f5b007cd7e Tianyu Lan 2022-05-02 949 mem->block[i].list = 0; 3349f5b007cd7e Tianyu Lan 2022-05-02 950 mem->block[i].alloc_size = IO_TLB_BLOCKSIZE; 3349f5b007cd7e Tianyu Lan 2022-05-02 951 for (j = 0; j < IO_TLB_BLOCKSIZE; j++) { 3349f5b007cd7e Tianyu Lan 2022-05-02 952 nslot = i * IO_TLB_BLOCKSIZE + j; 3349f5b007cd7e Tianyu Lan 2022-05-02 953 mem->slots[nslot].list = 0; 3349f5b007cd7e Tianyu Lan 2022-05-02 954 mem->slots[nslot].alloc_size = IO_TLB_SIZE; 3349f5b007cd7e Tianyu Lan 2022-05-02 955 } 3349f5b007cd7e Tianyu Lan 2022-05-02 956 } 3349f5b007cd7e Tianyu Lan 2022-05-02 957 3349f5b007cd7e Tianyu Lan 2022-05-02 @958 mem->index = nslot + 1; 3349f5b007cd7e Tianyu Lan 2022-05-02 959 mem->block_index += block_num; 3349f5b007cd7e Tianyu Lan 2022-05-02 960 mem->used += block_num * IO_TLB_BLOCKSIZE; 3349f5b007cd7e Tianyu Lan 2022-05-02 961 spin_unlock_irqrestore(&mem->lock, flags); 3349f5b007cd7e Tianyu Lan 2022-05-02 962 3349f5b007cd7e Tianyu Lan 2022-05-02 963 tlb_addr = slot_addr(mem->start, block_index * IO_TLB_BLOCKSIZE); 3349f5b007cd7e Tianyu Lan 2022-05-02 964 return pfn_to_page(PFN_DOWN(tlb_addr)); 3349f5b007cd7e Tianyu Lan 2022-05-02 965 } 3349f5b007cd7e Tianyu Lan 2022-05-02 966 3349f5b007cd7e Tianyu Lan 2022-05-02 967 /* 3349f5b007cd7e Tianyu Lan 2022-05-02 968 * swiotlb_device_allocate - Allocate bounce buffer fo device from 3349f5b007cd7e Tianyu Lan 2022-05-02 969 * default io tlb pool. The allocation size should be aligned with 3349f5b007cd7e Tianyu Lan 2022-05-02 970 * IO_TLB_BLOCK_UNIT. 3349f5b007cd7e Tianyu Lan 2022-05-02 971 */ 3349f5b007cd7e Tianyu Lan 2022-05-02 972 int swiotlb_device_allocate(struct device *dev, 3349f5b007cd7e Tianyu Lan 2022-05-02 973 unsigned int queue_num, 3349f5b007cd7e Tianyu Lan 2022-05-02 974 unsigned long size) 3349f5b007cd7e Tianyu Lan 2022-05-02 975 { 3349f5b007cd7e Tianyu Lan 2022-05-02 976 struct io_tlb_mem *mem, *parent_mem = dev->dma_io_tlb_mem; 3349f5b007cd7e Tianyu Lan 2022-05-02 977 unsigned long nslabs = ALIGN(size >> IO_TLB_SHIFT, IO_TLB_BLOCKSIZE); 3349f5b007cd7e Tianyu Lan 2022-05-02 978 struct page *page; 3349f5b007cd7e Tianyu Lan 2022-05-02 979 int ret = -ENOMEM; 3349f5b007cd7e Tianyu Lan 2022-05-02 980 3349f5b007cd7e Tianyu Lan 2022-05-02 981 page = swiotlb_alloc_block(parent_mem, nslabs / IO_TLB_BLOCKSIZE); 3349f5b007cd7e Tianyu Lan 2022-05-02 982 if (!page) 3349f5b007cd7e Tianyu Lan 2022-05-02 983 return -ENOMEM; 3349f5b007cd7e Tianyu Lan 2022-05-02 984 3349f5b007cd7e Tianyu Lan 2022-05-02 985 mem = kzalloc(sizeof(*mem), GFP_KERNEL); 3349f5b007cd7e Tianyu Lan 2022-05-02 986 if (!mem) 3349f5b007cd7e Tianyu Lan 2022-05-02 987 goto error_mem; 3349f5b007cd7e Tianyu Lan 2022-05-02 988 3349f5b007cd7e Tianyu Lan 2022-05-02 989 mem->slots = kzalloc(array_size(sizeof(*mem->slots), nslabs), 3349f5b007cd7e Tianyu Lan 2022-05-02 990 GFP_KERNEL); 3349f5b007cd7e Tianyu Lan 2022-05-02 991 if (!mem->slots) 3349f5b007cd7e Tianyu Lan 2022-05-02 992 goto error_slots; 3349f5b007cd7e Tianyu Lan 2022-05-02 993 3349f5b007cd7e Tianyu Lan 2022-05-02 994 mem->block = kcalloc(nslabs / IO_TLB_BLOCKSIZE, 3349f5b007cd7e Tianyu Lan 2022-05-02 995 sizeof(struct io_tlb_block), 3349f5b007cd7e Tianyu Lan 2022-05-02 996 GFP_KERNEL); 3349f5b007cd7e Tianyu Lan 2022-05-02 997 if (!mem->block) 3349f5b007cd7e Tianyu Lan 2022-05-02 998 goto error_block; 3349f5b007cd7e Tianyu Lan 2022-05-02 999 3349f5b007cd7e Tianyu Lan 2022-05-02 1000 mem->num_child = queue_num; 3349f5b007cd7e Tianyu Lan 2022-05-02 1001 mem->child = kcalloc(queue_num, 3349f5b007cd7e Tianyu Lan 2022-05-02 1002 sizeof(struct io_tlb_mem), 3349f5b007cd7e Tianyu Lan 2022-05-02 1003 GFP_KERNEL); 3349f5b007cd7e Tianyu Lan 2022-05-02 1004 if (!mem->child) 3349f5b007cd7e Tianyu Lan 2022-05-02 1005 goto error_child; 3349f5b007cd7e Tianyu Lan 2022-05-02 1006 3349f5b007cd7e Tianyu Lan 2022-05-02 1007 3349f5b007cd7e Tianyu Lan 2022-05-02 1008 swiotlb_init_io_tlb_mem(mem, page_to_phys(page), nslabs, true); 3349f5b007cd7e Tianyu Lan 2022-05-02 1009 mem->force_bounce = true; 3349f5b007cd7e Tianyu Lan 2022-05-02 1010 mem->for_alloc = true; 3349f5b007cd7e Tianyu Lan 2022-05-02 1011 3349f5b007cd7e Tianyu Lan 2022-05-02 1012 mem->vaddr = parent_mem->vaddr + page_to_phys(page) - parent_mem->start; 3349f5b007cd7e Tianyu Lan 2022-05-02 1013 dev->dma_io_tlb_mem->parent = parent_mem; 3349f5b007cd7e Tianyu Lan 2022-05-02 1014 dev->dma_io_tlb_mem = mem; 3349f5b007cd7e Tianyu Lan 2022-05-02 1015 return 0; 3349f5b007cd7e Tianyu Lan 2022-05-02 1016 3349f5b007cd7e Tianyu Lan 2022-05-02 1017 error_child: 3349f5b007cd7e Tianyu Lan 2022-05-02 1018 kfree(mem->block); 3349f5b007cd7e Tianyu Lan 2022-05-02 1019 error_block: 3349f5b007cd7e Tianyu Lan 2022-05-02 1020 kfree(mem->slots); 3349f5b007cd7e Tianyu Lan 2022-05-02 1021 error_slots: 3349f5b007cd7e Tianyu Lan 2022-05-02 1022 kfree(mem); 3349f5b007cd7e Tianyu Lan 2022-05-02 1023 error_mem: 3349f5b007cd7e Tianyu Lan 2022-05-02 @1024 swiotlb_free_block(mem, page_to_phys(page), nslabs / IO_TLB_BLOCKSIZE); 3349f5b007cd7e Tianyu Lan 2022-05-02 1025 return ret; 3349f5b007cd7e Tianyu Lan 2022-05-02 1026 } 3349f5b007cd7e Tianyu Lan 2022-05-02 1027 EXPORT_SYMBOL_GPL(swiotlb_device_allocate); 3349f5b007cd7e Tianyu Lan 2022-05-02 1028 -- 0-DAY CI Kernel Test Service https://01.org/lkp _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
