CC: [email protected] CC: [email protected] CC: [email protected] TO: Sven Van Asbroeck <[email protected]> CC: Bryan Whitehead <[email protected]>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: b8a98b6bf66ae35361e987333233d07241642909 commit: a8db76d40e4d568a9e9cc9fb8d81352b5ff530ee lan743x: boost performance on cpu archs w/o dma cache snooping date: 10 months ago :::::: branch date: 8 hours ago :::::: commit date: 10 months ago config: arm-randconfig-c002-20211126 (https://download.01.org/0day-ci/archive/20211211/[email protected]/config) compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 5162b558d8c0b542e752b037e72a69d5fd51eb1e) 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://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a8db76d40e4d568a9e9cc9fb8d81352b5ff530ee git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git fetch --no-tags linus master git checkout a8db76d40e4d568a9e9cc9fb8d81352b5ff530ee # 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 >>) Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 8 warnings generated. Suppressed 8 warnings (8 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. 11 warnings generated. drivers/gpu/drm/radeon/evergreen.c:2742:7: warning: Branch condition evaluates to a garbage value [clang-analyzer-core.uninitialized.Branch] if (save->crtc_enabled[i]) { ^ drivers/gpu/drm/radeon/evergreen.c:4050:6: note: Assuming 'hard' is true if (hard) { ^~~~ drivers/gpu/drm/radeon/evergreen.c:4050:2: note: Taking true branch if (hard) { ^ drivers/gpu/drm/radeon/evergreen.c:4051:3: note: Calling 'evergreen_gpu_pci_config_reset' evergreen_gpu_pci_config_reset(rdev); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/gpu/drm/radeon/evergreen.c:4015:2: note: '?' condition is true udelay(50); ^ arch/arm/include/asm/delay.h:83:3: note: expanded from macro 'udelay' (__builtin_constant_p(n) ? \ ^ drivers/gpu/drm/radeon/evergreen.c:4015:2: note: '?' condition is false udelay(50); ^ arch/arm/include/asm/delay.h:84:5: note: expanded from macro 'udelay' ((n) > (MAX_UDELAY_MS * 1000) ? __bad_udelay() : \ ^ drivers/gpu/drm/radeon/evergreen.c:4025:2: note: '?' condition is true udelay(50); ^ arch/arm/include/asm/delay.h:83:3: note: expanded from macro 'udelay' (__builtin_constant_p(n) ? \ ^ drivers/gpu/drm/radeon/evergreen.c:4025:2: note: '?' condition is false udelay(50); ^ arch/arm/include/asm/delay.h:84:5: note: expanded from macro 'udelay' ((n) > (MAX_UDELAY_MS * 1000) ? __bad_udelay() : \ ^ drivers/gpu/drm/radeon/evergreen.c:4032:2: note: Calling 'evergreen_mc_stop' evergreen_mc_stop(rdev, &save); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/gpu/drm/radeon/evergreen.c:2665:21: note: Assuming field 'family' is equal to CHIP_HAINAN if (!ASIC_IS_NODCE(rdev)) { ^ drivers/gpu/drm/radeon/radeon.h:2649:31: note: expanded from macro 'ASIC_IS_NODCE' #define ASIC_IS_NODCE(rdev) ((rdev->family == CHIP_HAINAN)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/gpu/drm/radeon/evergreen.c:2665:2: note: Taking false branch if (!ASIC_IS_NODCE(rdev)) { ^ drivers/gpu/drm/radeon/evergreen.c:2673:14: note: Assuming 'i' is >= field 'num_crtc' for (i = 0; i < rdev->num_crtc; i++) { ^~~~~~~~~~~~~~~~~~ drivers/gpu/drm/radeon/evergreen.c:2673:2: note: Loop condition is false. Execution continues on line 2727 for (i = 0; i < rdev->num_crtc; i++) { ^ drivers/gpu/drm/radeon/evergreen.c:2730:6: note: Assuming the condition is false if ((blackout & BLACKOUT_MODE_MASK) != 1) { ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/gpu/drm/radeon/evergreen.c:2730:2: note: Taking false branch if ((blackout & BLACKOUT_MODE_MASK) != 1) { ^ drivers/gpu/drm/radeon/evergreen.c:2738:2: note: '?' condition is true udelay(100); ^ arch/arm/include/asm/delay.h:83:3: note: expanded from macro 'udelay' (__builtin_constant_p(n) ? \ ^ drivers/gpu/drm/radeon/evergreen.c:2738:2: note: '?' condition is false udelay(100); ^ arch/arm/include/asm/delay.h:84:5: note: expanded from macro 'udelay' ((n) > (MAX_UDELAY_MS * 1000) ? __bad_udelay() : \ ^ drivers/gpu/drm/radeon/evergreen.c:2741:7: note: The value 0 is assigned to 'i' for (i = 0; i < rdev->num_crtc; i++) { ^~~~~ drivers/gpu/drm/radeon/evergreen.c:2741:14: note: Assuming 'i' is < field 'num_crtc' for (i = 0; i < rdev->num_crtc; i++) { ^~~~~~~~~~~~~~~~~~ drivers/gpu/drm/radeon/evergreen.c:2741:2: note: Loop condition is true. Entering loop body for (i = 0; i < rdev->num_crtc; i++) { ^ drivers/gpu/drm/radeon/evergreen.c:2742:7: note: Branch condition evaluates to a garbage value if (save->crtc_enabled[i]) { ^~~~~~~~~~~~~~~~~~~~~ drivers/gpu/drm/radeon/evergreen.c:3978:3: warning: Value stored to 'tmp' is never read [clang-analyzer-deadcode.DeadStores] tmp = RREG32(GRBM_SOFT_RESET); ^ drivers/gpu/drm/radeon/evergreen.c:3978:3: note: Value stored to 'tmp' is never read drivers/gpu/drm/radeon/evergreen.c:3992:3: warning: Value stored to 'tmp' is never read [clang-analyzer-deadcode.DeadStores] tmp = RREG32(SRBM_SOFT_RESET); ^ drivers/gpu/drm/radeon/evergreen.c:3992:3: note: Value stored to 'tmp' is never read Suppressed 8 warnings (8 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. 9 warnings generated. >> drivers/net/ethernet/microchip/lan743x_main.c:2038:21: warning: Value stored >> to 'netdev' during its initialization is never read >> [clang-analyzer-deadcode.DeadStores] struct net_device *netdev = rx->adapter->netdev; ^~~~~~ ~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/microchip/lan743x_main.c:2038:21: note: Value stored to 'netdev' during its initialization is never read struct net_device *netdev = rx->adapter->netdev; ^~~~~~ ~~~~~~~~~~~~~~~~~~~ Suppressed 8 warnings (8 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. 9 warnings generated. drivers/net/ethernet/microchip/lan743x_ethtool.c:733:26: warning: Value stored to 'adapter' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct lan743x_adapter *adapter = netdev_priv(netdev); ^~~~~~~ ~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/microchip/lan743x_ethtool.c:733:26: note: Value stored to 'adapter' during its initialization is never read struct lan743x_adapter *adapter = netdev_priv(netdev); ^~~~~~~ ~~~~~~~~~~~~~~~~~~~ Suppressed 8 warnings (8 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. 8 warnings generated. Suppressed 8 warnings (8 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. 15 warnings generated. drivers/net/ethernet/mscc/ocelot.c:49:17: warning: The left operand of '<<' is a garbage value [clang-analyzer-core.UndefinedBinaryOperatorResult] mach |= mac[1] << 0; ^ drivers/net/ethernet/mscc/ocelot.c:1479:6: note: Assuming 'port' is not equal to field 'npi' if (port == ocelot->npi) ^~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/mscc/ocelot.c:1479:2: note: Taking false branch if (port == ocelot->npi) ^ drivers/net/ethernet/mscc/ocelot.c:1483:6: note: Assuming 'mc' is non-null if (!mc) ^~~ drivers/net/ethernet/mscc/ocelot.c:1483:2: note: Taking false branch if (!mc) ^ drivers/net/ethernet/mscc/ocelot.c:1486:2: note: Calling 'ocelot_encode_ports_to_mdb' ocelot_encode_ports_to_mdb(addr, mc); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/mscc/ocelot.c:1403:2: note: Calling 'ether_addr_copy' ether_addr_copy(addr, mc->addr); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/mscc/ocelot.c:1403:2: note: Returning from 'ether_addr_copy' ether_addr_copy(addr, mc->addr); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/mscc/ocelot.c:1405:6: note: Assuming field 'entry_type' is not equal to ENTRYTYPE_MACv4 if (mc->entry_type == ENTRYTYPE_MACv4) { ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/mscc/ocelot.c:1405:2: note: Taking false branch if (mc->entry_type == ENTRYTYPE_MACv4) { ^ drivers/net/ethernet/mscc/ocelot.c:1409:13: note: Assuming field 'entry_type' is not equal to ENTRYTYPE_MACv6 } else if (mc->entry_type == ENTRYTYPE_MACv6) { ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/mscc/ocelot.c:1409:9: note: Taking false branch } else if (mc->entry_type == ENTRYTYPE_MACv6) { ^ drivers/net/ethernet/mscc/ocelot.c:1486:2: note: Returning from 'ocelot_encode_ports_to_mdb' ocelot_encode_ports_to_mdb(addr, mc); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/mscc/ocelot.c:1487:2: note: Calling 'ocelot_mact_forget' ocelot_mact_forget(ocelot, addr, vid); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/mscc/ocelot.c:93:2: note: Calling 'ocelot_mact_select' ocelot_mact_select(ocelot, mac, vid); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/mscc/ocelot.c:49:17: note: The left operand of '<<' is a garbage value mach |= mac[1] << 0; ~~~~~~ ^ drivers/net/ethernet/mscc/ocelot.c:51:17: warning: The left operand of '<<' is a garbage value [clang-analyzer-core.UndefinedBinaryOperatorResult] macl |= mac[3] << 16; ^ drivers/net/ethernet/mscc/ocelot.c:1479:6: note: Assuming 'port' is not equal to field 'npi' if (port == ocelot->npi) ^~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/mscc/ocelot.c:1479:2: note: Taking false branch if (port == ocelot->npi) ^ drivers/net/ethernet/mscc/ocelot.c:1483:6: note: Assuming 'mc' is non-null if (!mc) ^~~ drivers/net/ethernet/mscc/ocelot.c:1483:2: note: Taking false branch if (!mc) ^ drivers/net/ethernet/mscc/ocelot.c:1486:2: note: Calling 'ocelot_encode_ports_to_mdb' ocelot_encode_ports_to_mdb(addr, mc); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/mscc/ocelot.c:1403:2: note: Calling 'ether_addr_copy' ether_addr_copy(addr, mc->addr); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/mscc/ocelot.c:1403:2: note: Returning from 'ether_addr_copy' ether_addr_copy(addr, mc->addr); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/mscc/ocelot.c:1405:6: note: Assuming field 'entry_type' is equal to ENTRYTYPE_MACv4 if (mc->entry_type == ENTRYTYPE_MACv4) { ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/mscc/ocelot.c:1405:2: note: Taking true branch if (mc->entry_type == ENTRYTYPE_MACv4) { ^ drivers/net/ethernet/mscc/ocelot.c:1486:2: note: Returning from 'ocelot_encode_ports_to_mdb' ocelot_encode_ports_to_mdb(addr, mc); vim +/netdev +2038 drivers/net/ethernet/microchip/lan743x_main.c a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2033 a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2034 static int lan743x_rx_process_buffer(struct lan743x_rx *rx) 23f0703c125be4 Bryan Whitehead 2018-03-05 2035 { 462512824f902a Alexey Denisov 2021-01-28 2036 int current_head_index = le32_to_cpu(*rx->head_cpu_ptr); a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2037 struct lan743x_rx_descriptor *descriptor, *desc_ext; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 @2038 struct net_device *netdev = rx->adapter->netdev; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2039 int result = RX_PROCESS_RESULT_NOTHING_TO_DO; 23f0703c125be4 Bryan Whitehead 2018-03-05 2040 struct lan743x_rx_buffer_info *buffer_info; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2041 int frame_length, buffer_length; 23f0703c125be4 Bryan Whitehead 2018-03-05 2042 int extension_index = -1; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2043 bool is_last, is_first; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2044 struct sk_buff *skb; 23f0703c125be4 Bryan Whitehead 2018-03-05 2045 23f0703c125be4 Bryan Whitehead 2018-03-05 2046 if (current_head_index < 0 || current_head_index >= rx->ring_size) 23f0703c125be4 Bryan Whitehead 2018-03-05 2047 goto done; 23f0703c125be4 Bryan Whitehead 2018-03-05 2048 23f0703c125be4 Bryan Whitehead 2018-03-05 2049 if (rx->last_head < 0 || rx->last_head >= rx->ring_size) 23f0703c125be4 Bryan Whitehead 2018-03-05 2050 goto done; 23f0703c125be4 Bryan Whitehead 2018-03-05 2051 a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2052 if (rx->last_head == current_head_index) a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2053 goto done; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2054 23f0703c125be4 Bryan Whitehead 2018-03-05 2055 descriptor = &rx->ring_cpu_ptr[rx->last_head]; 462512824f902a Alexey Denisov 2021-01-28 2056 if (le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_OWN_) 23f0703c125be4 Bryan Whitehead 2018-03-05 2057 goto done; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2058 buffer_info = &rx->buffer_info[rx->last_head]; 23f0703c125be4 Bryan Whitehead 2018-03-05 2059 a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2060 is_last = le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_LS_; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2061 is_first = le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_FS_; 23f0703c125be4 Bryan Whitehead 2018-03-05 2062 a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2063 if (is_last && le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_EXT_) { a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2064 /* extension is expected to follow */ a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2065 int index = lan743x_rx_next_index(rx, rx->last_head); 23f0703c125be4 Bryan Whitehead 2018-03-05 2066 a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2067 if (index == current_head_index) a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2068 /* extension not yet available */ 23f0703c125be4 Bryan Whitehead 2018-03-05 2069 goto done; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2070 desc_ext = &rx->ring_cpu_ptr[index]; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2071 if (le32_to_cpu(desc_ext->data0) & RX_DESC_DATA0_OWN_) a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2072 /* extension not yet available */ 23f0703c125be4 Bryan Whitehead 2018-03-05 2073 goto done; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2074 if (!(le32_to_cpu(desc_ext->data0) & RX_DESC_DATA0_EXT_)) a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2075 goto move_forward; 23f0703c125be4 Bryan Whitehead 2018-03-05 2076 extension_index = index; 23f0703c125be4 Bryan Whitehead 2018-03-05 2077 } 23f0703c125be4 Bryan Whitehead 2018-03-05 2078 a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2079 /* Only the last buffer in a multi-buffer frame contains the total frame a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2080 * length. The chip occasionally sends more buffers than strictly a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2081 * required to reach the total frame length. a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2082 * Handle this by adding all buffers to the skb in their entirety. a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2083 * Once the real frame length is known, trim the skb. a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2084 */ a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2085 frame_length = a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2086 RX_DESC_DATA0_FRAME_LENGTH_GET_(le32_to_cpu(descriptor->data0)); a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2087 buffer_length = buffer_info->buffer_length; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2088 a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2089 netdev_dbg(netdev, "%s%schunk: %d/%d", a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2090 is_first ? "first " : " ", a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2091 is_last ? "last " : " ", a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2092 frame_length, buffer_length); 23f0703c125be4 Bryan Whitehead 2018-03-05 2093 a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2094 /* save existing skb, allocate new skb and map to dma */ a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2095 skb = buffer_info->skb; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2096 if (lan743x_rx_init_ring_element(rx, rx->last_head)) { dd9d9f5907bb47 Bryan Whitehead 2019-03-11 2097 /* failed to allocate next skb. dd9d9f5907bb47 Bryan Whitehead 2019-03-11 2098 * Memory is very low. dd9d9f5907bb47 Bryan Whitehead 2019-03-11 2099 * Drop this packet and reuse buffer. dd9d9f5907bb47 Bryan Whitehead 2019-03-11 2100 */ a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2101 lan743x_rx_reuse_ring_element(rx, rx->last_head); a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2102 /* drop packet that was being assembled */ a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2103 dev_kfree_skb_irq(rx->skb_head); a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2104 rx->skb_head = NULL; dd9d9f5907bb47 Bryan Whitehead 2019-03-11 2105 goto process_extension; dd9d9f5907bb47 Bryan Whitehead 2019-03-11 2106 } dd9d9f5907bb47 Bryan Whitehead 2019-03-11 2107 a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2108 /* add buffers to skb via skb->frag_list */ a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2109 if (is_first) { a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2110 skb_reserve(skb, RX_HEAD_PADDING); a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2111 skb_put(skb, buffer_length - RX_HEAD_PADDING); a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2112 if (rx->skb_head) a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2113 dev_kfree_skb_irq(rx->skb_head); a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2114 rx->skb_head = skb; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2115 } else if (rx->skb_head) { a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2116 skb_put(skb, buffer_length); a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2117 if (skb_shinfo(rx->skb_head)->frag_list) a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2118 rx->skb_tail->next = skb; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2119 else a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2120 skb_shinfo(rx->skb_head)->frag_list = skb; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2121 rx->skb_tail = skb; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2122 rx->skb_head->len += skb->len; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2123 rx->skb_head->data_len += skb->len; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2124 rx->skb_head->truesize += skb->truesize; 23f0703c125be4 Bryan Whitehead 2018-03-05 2125 } else { a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2126 /* packet to assemble has already been dropped because one or a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2127 * more of its buffers could not be allocated 23f0703c125be4 Bryan Whitehead 2018-03-05 2128 */ a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2129 netdev_dbg(netdev, "drop buffer intended for dropped packet"); a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2130 dev_kfree_skb_irq(skb); 23f0703c125be4 Bryan Whitehead 2018-03-05 2131 } 23f0703c125be4 Bryan Whitehead 2018-03-05 2132 dd9d9f5907bb47 Bryan Whitehead 2019-03-11 2133 process_extension: 23f0703c125be4 Bryan Whitehead 2018-03-05 2134 if (extension_index >= 0) { a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2135 u32 ts_sec; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2136 u32 ts_nsec; 23f0703c125be4 Bryan Whitehead 2018-03-05 2137 a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2138 ts_sec = le32_to_cpu(desc_ext->data1); a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2139 ts_nsec = (le32_to_cpu(desc_ext->data2) & 23f0703c125be4 Bryan Whitehead 2018-03-05 2140 RX_DESC_DATA2_TS_NS_MASK_); a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2141 if (rx->skb_head) a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2142 skb_hwtstamps(rx->skb_head)->hwtstamp = a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2143 ktime_set(ts_sec, ts_nsec); 23f0703c125be4 Bryan Whitehead 2018-03-05 2144 lan743x_rx_reuse_ring_element(rx, extension_index); a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2145 rx->last_head = extension_index; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2146 netdev_dbg(netdev, "process extension"); 23f0703c125be4 Bryan Whitehead 2018-03-05 2147 } 23f0703c125be4 Bryan Whitehead 2018-03-05 2148 a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2149 if (is_last && rx->skb_head) a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2150 rx->skb_head = lan743x_rx_trim_skb(rx->skb_head, frame_length); 23f0703c125be4 Bryan Whitehead 2018-03-05 2151 a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2152 if (is_last && rx->skb_head) { a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2153 rx->skb_head->protocol = eth_type_trans(rx->skb_head, a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2154 rx->adapter->netdev); a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2155 netdev_dbg(netdev, "sending %d byte frame to OS", a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2156 rx->skb_head->len); a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2157 napi_gro_receive(&rx->napi, rx->skb_head); a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2158 rx->skb_head = NULL; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2159 } 23f0703c125be4 Bryan Whitehead 2018-03-05 2160 23f0703c125be4 Bryan Whitehead 2018-03-05 2161 move_forward: 23f0703c125be4 Bryan Whitehead 2018-03-05 2162 /* push tail and head forward */ a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2163 rx->last_tail = rx->last_head; a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2164 rx->last_head = lan743x_rx_next_index(rx, rx->last_head); a8db76d40e4d56 Sven Van Asbroeck 2021-02-15 2165 result = RX_PROCESS_RESULT_BUFFER_RECEIVED; 23f0703c125be4 Bryan Whitehead 2018-03-05 2166 done: 23f0703c125be4 Bryan Whitehead 2018-03-05 2167 return result; 23f0703c125be4 Bryan Whitehead 2018-03-05 2168 } 23f0703c125be4 Bryan Whitehead 2018-03-05 2169 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/[email protected] _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
