CC: [email protected] CC: [email protected] BCC: [email protected] CC: [email protected] TO: Rohit Visavalia <[email protected]> CC: Michal Simek <[email protected]>
tree: https://github.com/Xilinx/linux-xlnx xlnx_rebase_v5.15_LTS head: 1870e0fa79a9d58c6748c34550f3ccea0b515933 commit: 9e0f0975faa39b51dc71911efb8a4cafd5d70282 [804/1029] dmaengine: xilinx: dpdma: Add support for cyclic dma mode :::::: branch date: 3 days ago :::::: commit date: 8 weeks ago config: arm-randconfig-c002-20220327 (https://download.01.org/0day-ci/archive/20220328/[email protected]/config) compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 0f6d9501cf49ce02937099350d08f20c4af86f3d) 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 # install arm cross compiling tool for clang build # apt-get install binutils-arm-linux-gnueabi # https://github.com/Xilinx/linux-xlnx/commit/9e0f0975faa39b51dc71911efb8a4cafd5d70282 git remote add xilinx-xlnx https://github.com/Xilinx/linux-xlnx git fetch --no-tags xilinx-xlnx xlnx_rebase_v5.15_LTS git checkout 9e0f0975faa39b51dc71911efb8a4cafd5d70282 # save the config file to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm clang-analyzer If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> clang-analyzer warnings: (new ones prefixed by >>) ^ include/linux/kernel.h:495:2: note: expanded from macro 'container_of' BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ ^ include/linux/build_bug.h:39:37: note: expanded from macro 'BUILD_BUG_ON_MSG' #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) ^ include/linux/compiler_types.h:322:2: note: expanded from macro 'compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^ include/linux/compiler_types.h:310:2: note: expanded from macro '_compiletime_assert' __compiletime_assert(condition, msg, prefix, suffix) ^ include/linux/compiler_types.h:302:3: note: expanded from macro '__compiletime_assert' if (!(condition)) \ ^ net/can/j1939/transport.c:285:34: note: Loop condition is false. Exiting loop struct j1939_session *session = container_of(kref, struct j1939_session, ^ include/linux/kernel.h:495:2: note: expanded from macro 'container_of' BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ ^ include/linux/build_bug.h:39:37: note: expanded from macro 'BUILD_BUG_ON_MSG' #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) ^ include/linux/compiler_types.h:322:2: note: expanded from macro 'compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^ include/linux/compiler_types.h:310:2: note: expanded from macro '_compiletime_assert' __compiletime_assert(condition, msg, prefix, suffix) ^ include/linux/compiler_types.h:300:2: note: expanded from macro '__compiletime_assert' do { \ ^ net/can/j1939/transport.c:288:2: note: Calling 'j1939_session_destroy' j1939_session_destroy(session); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/can/j1939/transport.c:263:6: note: Assuming field 'transmission' is false if (session->transmission) { ^~~~~~~~~~~~~~~~~~~~~ net/can/j1939/transport.c:263:2: note: Taking false branch if (session->transmission) { ^ net/can/j1939/transport.c:268:13: note: Assuming field 'err' is 0 } else if (session->err) { ^~~~~~~~~~~~ net/can/j1939/transport.c:268:9: note: Taking false branch } else if (session->err) { ^ net/can/j1939/transport.c:272:2: note: Taking false branch netdev_dbg(session->priv->ndev, "%s: 0x%p\n", __func__, session); ^ include/linux/netdevice.h:5333:2: note: expanded from macro 'netdev_dbg' if (0) \ ^ net/can/j1939/transport.c:274:2: note: Assuming '__ret_warn_on' is not equal to 0 WARN_ON_ONCE(!list_empty(&session->sk_session_queue_entry)); ^ include/asm-generic/bug.h:179:33: note: expanded from macro 'WARN_ON_ONCE' #define WARN_ON_ONCE(condition) WARN_ON(condition) ^~~~~~~~~~~~~~~~~~ include/asm-generic/bug.h:167:2: note: expanded from macro 'WARN_ON' unlikely(__ret_warn_on); \ ^~~~~~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:78:40: note: expanded from macro 'unlikely' # define unlikely(x) __builtin_expect(!!(x), 0) ^~~~ net/can/j1939/transport.c:275:2: note: Assuming '__ret_warn_on' is not equal to 0 WARN_ON_ONCE(!list_empty(&session->active_session_list_entry)); ^ include/asm-generic/bug.h:179:33: note: expanded from macro 'WARN_ON_ONCE' #define WARN_ON_ONCE(condition) WARN_ON(condition) ^~~~~~~~~~~~~~~~~~ include/asm-generic/bug.h:167:2: note: expanded from macro 'WARN_ON' unlikely(__ret_warn_on); \ ^~~~~~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:78:40: note: expanded from macro 'unlikely' # define unlikely(x) __builtin_expect(!!(x), 0) ^~~~ net/can/j1939/transport.c:280:2: note: Memory is released kfree(session); ^~~~~~~~~~~~~~ net/can/j1939/transport.c:288:2: note: Returning; memory was released j1939_session_destroy(session); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/kref.h:65:3: note: Returning; memory was released release(kref); ^~~~~~~~~~~~~ net/can/j1939/transport.c:293:2: note: Returning; memory was released kref_put(&session->kref, __j1939_session_release); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/can/j1939/transport.c:2169:5: note: Returning; memory was released j1939_session_put(session); ^~~~~~~~~~~~~~~~~~~~~~~~~~ net/can/j1939/transport.c:2171:17: note: Use of memory after it is freed session->err = ESHUTDOWN; ~~~~~~~~~~~~ ^ Suppressed 1 warnings (1 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 3 warnings generated. >> drivers/dma/xilinx/xilinx_dpdma.c:746:21: warning: Dereference of null >> pointer [clang-analyzer-core.NullDereference] last->hw.next_desc = lower_32_bits(sw_desc->dma_addr); ^ drivers/dma/xilinx/xilinx_dpdma.c:1287:35: note: Left side of '&&' is false struct xilinx_dpdma_chan *chan = to_xilinx_chan(dchan); ^ drivers/dma/xilinx/xilinx_dpdma.c:247:2: note: expanded from macro 'to_xilinx_chan' container_of(_chan, struct xilinx_dpdma_chan, vchan.chan) ^ include/linux/kernel.h:495:61: note: expanded from macro 'container_of' BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ ^ drivers/dma/xilinx/xilinx_dpdma.c:1287:35: note: Taking false branch struct xilinx_dpdma_chan *chan = to_xilinx_chan(dchan); ^ drivers/dma/xilinx/xilinx_dpdma.c:247:2: note: expanded from macro 'to_xilinx_chan' container_of(_chan, struct xilinx_dpdma_chan, vchan.chan) ^ include/linux/kernel.h:495:2: note: expanded from macro 'container_of' BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ ^ include/linux/build_bug.h:39:37: note: expanded from macro 'BUILD_BUG_ON_MSG' #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) ^ include/linux/compiler_types.h:322:2: note: expanded from macro 'compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^ include/linux/compiler_types.h:310:2: note: expanded from macro '_compiletime_assert' __compiletime_assert(condition, msg, prefix, suffix) ^ include/linux/compiler_types.h:302:3: note: expanded from macro '__compiletime_assert' if (!(condition)) \ ^ drivers/dma/xilinx/xilinx_dpdma.c:1287:35: note: Loop condition is false. Exiting loop struct xilinx_dpdma_chan *chan = to_xilinx_chan(dchan); ^ drivers/dma/xilinx/xilinx_dpdma.c:247:2: note: expanded from macro 'to_xilinx_chan' container_of(_chan, struct xilinx_dpdma_chan, vchan.chan) ^ include/linux/kernel.h:495:2: note: expanded from macro 'container_of' BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ ^ include/linux/build_bug.h:39:37: note: expanded from macro 'BUILD_BUG_ON_MSG' #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) ^ include/linux/compiler_types.h:322:2: note: expanded from macro 'compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^ include/linux/compiler_types.h:310:2: note: expanded from macro '_compiletime_assert' __compiletime_assert(condition, msg, prefix, suffix) ^ include/linux/compiler_types.h:300:2: note: expanded from macro '__compiletime_assert' do { \ ^ drivers/dma/xilinx/xilinx_dpdma.c:1289:6: note: Assuming 'direction' is equal to DMA_MEM_TO_DEV if (direction != DMA_MEM_TO_DEV) ^~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/dma/xilinx/xilinx_dpdma.c:1289:2: note: Taking false branch if (direction != DMA_MEM_TO_DEV) ^ drivers/dma/xilinx/xilinx_dpdma.c:1292:6: note: Assuming the condition is false if (buf_len % period_len) ^~~~~~~~~~~~~~~~~~~~ drivers/dma/xilinx/xilinx_dpdma.c:1292:2: note: Taking false branch if (buf_len % period_len) ^ drivers/dma/xilinx/xilinx_dpdma.c:1295:9: note: Calling 'xilinx_dpdma_chan_prep_cyclic' return xilinx_dpdma_chan_prep_cyclic(chan, buf_addr, buf_len, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/dma/xilinx/xilinx_dpdma.c:703:41: note: 'last' initialized to a null pointer value struct xilinx_dpdma_sw_desc *sw_desc, *last = NULL; ^~~~ drivers/dma/xilinx/xilinx_dpdma.c:707:12: note: Calling 'xilinx_dpdma_chan_alloc_tx_desc' tx_desc = xilinx_dpdma_chan_alloc_tx_desc(chan); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/dma/xilinx/xilinx_dpdma.c:649:12: note: Calling 'kzalloc' tx_desc = kzalloc(sizeof(*tx_desc), GFP_NOWAIT); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/slab.h:721:9: note: Calling 'kmalloc' return kmalloc(size, flags | __GFP_ZERO); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/slab.h:579:2: note: Taking false branch if (__builtin_constant_p(size)) { ^ include/linux/slab.h:596:2: note: Returning pointer, which participates in a condition later return __kmalloc(size, flags); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/slab.h:721:9: note: Returning from 'kmalloc' return kmalloc(size, flags | __GFP_ZERO); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/slab.h:721:2: note: Returning pointer, which participates in a condition later return kmalloc(size, flags | __GFP_ZERO); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/dma/xilinx/xilinx_dpdma.c:649:12: note: Returning from 'kzalloc' tx_desc = kzalloc(sizeof(*tx_desc), GFP_NOWAIT); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/dma/xilinx/xilinx_dpdma.c:650:6: note: Assuming 'tx_desc' is non-null, which participates in a condition later if (!tx_desc) ^~~~~~~~ drivers/dma/xilinx/xilinx_dpdma.c:650:2: note: Taking false branch if (!tx_desc) vim +746 drivers/dma/xilinx/xilinx_dpdma.c 7cbb0c63de3fc2 Hyun Kwon 2020-07-17 683 9e0f0975faa39b Rohit Visavalia 2021-04-07 684 /** 9e0f0975faa39b Rohit Visavalia 2021-04-07 685 * xilinx_dpdma_chan_prep_cyclic - Prepare a cyclic dma descriptor 9e0f0975faa39b Rohit Visavalia 2021-04-07 686 * @chan: DPDMA channel 9e0f0975faa39b Rohit Visavalia 2021-04-07 687 * @buf_addr: buffer address 9e0f0975faa39b Rohit Visavalia 2021-04-07 688 * @buf_len: buffer length 9e0f0975faa39b Rohit Visavalia 2021-04-07 689 * @period_len: number of periods 9e0f0975faa39b Rohit Visavalia 2021-04-07 690 * @flags: tx flags argument passed in to prepare function 9e0f0975faa39b Rohit Visavalia 2021-04-07 691 * 9e0f0975faa39b Rohit Visavalia 2021-04-07 692 * Prepare a tx descriptor incudling internal software/hardware descriptors 9e0f0975faa39b Rohit Visavalia 2021-04-07 693 * for the given cyclic transaction. 9e0f0975faa39b Rohit Visavalia 2021-04-07 694 * 9e0f0975faa39b Rohit Visavalia 2021-04-07 695 * Return: A dma async tx descriptor on success, or NULL. 9e0f0975faa39b Rohit Visavalia 2021-04-07 696 */ 9e0f0975faa39b Rohit Visavalia 2021-04-07 697 static struct dma_async_tx_descriptor * 9e0f0975faa39b Rohit Visavalia 2021-04-07 698 xilinx_dpdma_chan_prep_cyclic(struct xilinx_dpdma_chan *chan, 9e0f0975faa39b Rohit Visavalia 2021-04-07 699 dma_addr_t buf_addr, size_t buf_len, 9e0f0975faa39b Rohit Visavalia 2021-04-07 700 size_t period_len, unsigned long flags) 9e0f0975faa39b Rohit Visavalia 2021-04-07 701 { 9e0f0975faa39b Rohit Visavalia 2021-04-07 702 struct xilinx_dpdma_tx_desc *tx_desc; 9e0f0975faa39b Rohit Visavalia 2021-04-07 703 struct xilinx_dpdma_sw_desc *sw_desc, *last = NULL; 9e0f0975faa39b Rohit Visavalia 2021-04-07 704 unsigned int periods = buf_len / period_len; 9e0f0975faa39b Rohit Visavalia 2021-04-07 705 unsigned int i; 9e0f0975faa39b Rohit Visavalia 2021-04-07 706 9e0f0975faa39b Rohit Visavalia 2021-04-07 707 tx_desc = xilinx_dpdma_chan_alloc_tx_desc(chan); 9e0f0975faa39b Rohit Visavalia 2021-04-07 708 if (!tx_desc) 9e0f0975faa39b Rohit Visavalia 2021-04-07 709 return (void *)tx_desc; 9e0f0975faa39b Rohit Visavalia 2021-04-07 710 9e0f0975faa39b Rohit Visavalia 2021-04-07 711 for (i = 0; i < periods; i++) { 9e0f0975faa39b Rohit Visavalia 2021-04-07 712 struct xilinx_dpdma_hw_desc *hw_desc; 9e0f0975faa39b Rohit Visavalia 2021-04-07 713 9e0f0975faa39b Rohit Visavalia 2021-04-07 714 if (!IS_ALIGNED(buf_addr, XILINX_DPDMA_ALIGN_BYTES)) { 9e0f0975faa39b Rohit Visavalia 2021-04-07 715 dev_err(chan->xdev->dev, 9e0f0975faa39b Rohit Visavalia 2021-04-07 716 "buffer should be aligned at %d B\n", 9e0f0975faa39b Rohit Visavalia 2021-04-07 717 XILINX_DPDMA_ALIGN_BYTES); 9e0f0975faa39b Rohit Visavalia 2021-04-07 718 goto error; 9e0f0975faa39b Rohit Visavalia 2021-04-07 719 } 9e0f0975faa39b Rohit Visavalia 2021-04-07 720 9e0f0975faa39b Rohit Visavalia 2021-04-07 721 sw_desc = xilinx_dpdma_chan_alloc_sw_desc(chan); 9e0f0975faa39b Rohit Visavalia 2021-04-07 722 if (!sw_desc) 9e0f0975faa39b Rohit Visavalia 2021-04-07 723 goto error; 9e0f0975faa39b Rohit Visavalia 2021-04-07 724 9e0f0975faa39b Rohit Visavalia 2021-04-07 725 xilinx_dpdma_sw_desc_set_dma_addrs(chan->xdev, sw_desc, last, 9e0f0975faa39b Rohit Visavalia 2021-04-07 726 &buf_addr, 1); 9e0f0975faa39b Rohit Visavalia 2021-04-07 727 hw_desc = &sw_desc->hw; 9e0f0975faa39b Rohit Visavalia 2021-04-07 728 hw_desc->xfer_size = period_len; 9e0f0975faa39b Rohit Visavalia 2021-04-07 729 hw_desc->hsize_stride = 9e0f0975faa39b Rohit Visavalia 2021-04-07 730 FIELD_PREP(XILINX_DPDMA_DESC_HSIZE_STRIDE_HSIZE_MASK, 9e0f0975faa39b Rohit Visavalia 2021-04-07 731 period_len) | 9e0f0975faa39b Rohit Visavalia 2021-04-07 732 FIELD_PREP(XILINX_DPDMA_DESC_HSIZE_STRIDE_STRIDE_MASK, 9e0f0975faa39b Rohit Visavalia 2021-04-07 733 period_len); 9e0f0975faa39b Rohit Visavalia 2021-04-07 734 hw_desc->control |= XILINX_DPDMA_DESC_CONTROL_PREEMBLE; 9e0f0975faa39b Rohit Visavalia 2021-04-07 735 hw_desc->control |= XILINX_DPDMA_DESC_CONTROL_IGNORE_DONE; 9e0f0975faa39b Rohit Visavalia 2021-04-07 736 hw_desc->control |= XILINX_DPDMA_DESC_CONTROL_COMPLETE_INTR; 9e0f0975faa39b Rohit Visavalia 2021-04-07 737 9e0f0975faa39b Rohit Visavalia 2021-04-07 738 list_add_tail(&sw_desc->node, &tx_desc->descriptors); 9e0f0975faa39b Rohit Visavalia 2021-04-07 739 9e0f0975faa39b Rohit Visavalia 2021-04-07 740 buf_addr += period_len; 9e0f0975faa39b Rohit Visavalia 2021-04-07 741 last = sw_desc; 9e0f0975faa39b Rohit Visavalia 2021-04-07 742 } 9e0f0975faa39b Rohit Visavalia 2021-04-07 743 9e0f0975faa39b Rohit Visavalia 2021-04-07 744 sw_desc = list_first_entry(&tx_desc->descriptors, 9e0f0975faa39b Rohit Visavalia 2021-04-07 745 struct xilinx_dpdma_sw_desc, node); 9e0f0975faa39b Rohit Visavalia 2021-04-07 @746 last->hw.next_desc = lower_32_bits(sw_desc->dma_addr); 9e0f0975faa39b Rohit Visavalia 2021-04-07 747 if (chan->xdev->ext_addr) 9e0f0975faa39b Rohit Visavalia 2021-04-07 748 last->hw.addr_ext |= 9e0f0975faa39b Rohit Visavalia 2021-04-07 749 FIELD_PREP(XILINX_DPDMA_DESC_ADDR_EXT_NEXT_ADDR_MASK, 9e0f0975faa39b Rohit Visavalia 2021-04-07 750 upper_32_bits(sw_desc->dma_addr)); 9e0f0975faa39b Rohit Visavalia 2021-04-07 751 9e0f0975faa39b Rohit Visavalia 2021-04-07 752 last->hw.control |= XILINX_DPDMA_DESC_CONTROL_LAST_OF_FRAME; 9e0f0975faa39b Rohit Visavalia 2021-04-07 753 9e0f0975faa39b Rohit Visavalia 2021-04-07 754 return vchan_tx_prep(&chan->vchan, &tx_desc->vdesc, flags); 9e0f0975faa39b Rohit Visavalia 2021-04-07 755 9e0f0975faa39b Rohit Visavalia 2021-04-07 756 error: 9e0f0975faa39b Rohit Visavalia 2021-04-07 757 xilinx_dpdma_chan_free_tx_desc(&tx_desc->vdesc); 9e0f0975faa39b Rohit Visavalia 2021-04-07 758 9e0f0975faa39b Rohit Visavalia 2021-04-07 759 return NULL; 9e0f0975faa39b Rohit Visavalia 2021-04-07 760 } 9e0f0975faa39b Rohit Visavalia 2021-04-07 761 -- 0-DAY CI Kernel Test Service https://01.org/lkp _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
