
Hi Wang, First bad commit (maybe != root cause): tree: https://gitee.com/openeuler/kernel.git OLK-6.6 head: a159deb279dfe156316d8c3957dc7f253686ff83 commit: 22d4075bf5ef29ba4b329f954ac28a7de1d69a65 [2909/2909] net/oenetcls: remove oenetcls trace hook config: x86_64-randconfig-r123-20250923 (https://download.01.org/0day-ci/archive/20250923/202509230929.GGNlyoj3-lkp@i...) compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250923/202509230929.GGNlyoj3-lkp@i...) 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 <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202509230929.GGNlyoj3-lkp@intel.com/ All errors (new ones prefixed by >>): net/oenetcls/oenetcls_flow.c:18:6: warning: no previous prototype for function 'is_oecls_config_netdev' [-Wmissing-prototypes] 18 | bool is_oecls_config_netdev(const char *name) | ^ net/oenetcls/oenetcls_flow.c:18:1: note: declare 'static' if the function is not intended to be used outside of this translation unit 18 | bool is_oecls_config_netdev(const char *name) | ^ | static
net/oenetcls/oenetcls_flow.c:140:43: error: no member named 'rx_cpu_rmap' in 'struct net_device' 140 | if (!skb_rx_queue_recorded(skb) || !dev->rx_cpu_rmap || | ~~~ ^ net/oenetcls/oenetcls_flow.c:161:24: error: no member named 'ndo_rx_flow_steer' in 'struct net_device_ops' 161 | rc = dev->netdev_ops->ndo_rx_flow_steer(dev, skb, rxq_index, flow_id); | ~~~~~~~~~~~~~~~ ^ 1 warning and 2 errors generated.
vim +140 net/oenetcls/oenetcls_flow.c 4bed6ba0e88f50 Wang Liang 2025-08-26 17 4bed6ba0e88f50 Wang Liang 2025-08-26 @18 bool is_oecls_config_netdev(const char *name) 4bed6ba0e88f50 Wang Liang 2025-08-26 19 { 4bed6ba0e88f50 Wang Liang 2025-08-26 20 struct oecls_netdev_info *netdev_info; 4bed6ba0e88f50 Wang Liang 2025-08-26 21 int netdev_loop; 4bed6ba0e88f50 Wang Liang 2025-08-26 22 4bed6ba0e88f50 Wang Liang 2025-08-26 23 for_each_oecls_netdev(netdev_loop, netdev_info) 4bed6ba0e88f50 Wang Liang 2025-08-26 24 if (strcmp(netdev_info->dev_name, name) == 0) 4bed6ba0e88f50 Wang Liang 2025-08-26 25 return true; 4bed6ba0e88f50 Wang Liang 2025-08-26 26 4bed6ba0e88f50 Wang Liang 2025-08-26 27 return false; 4bed6ba0e88f50 Wang Liang 2025-08-26 28 } 4bed6ba0e88f50 Wang Liang 2025-08-26 29 22d4075bf5ef29 Wang Liang 2025-09-12 30 static bool _oecls_timeout(struct net_device *dev, u16 rxq_index, 22d4075bf5ef29 Wang Liang 2025-09-12 31 u32 flow_id, u16 filter_id) 4bed6ba0e88f50 Wang Liang 2025-08-26 32 { 4bed6ba0e88f50 Wang Liang 2025-08-26 33 struct netdev_rx_queue *rxqueue = dev->_rx + rxq_index; 4bed6ba0e88f50 Wang Liang 2025-08-26 34 struct oecls_dev_flow_table *flow_table; 4bed6ba0e88f50 Wang Liang 2025-08-26 35 struct oecls_dev_flow *rflow; 4bed6ba0e88f50 Wang Liang 2025-08-26 36 bool expire = true; 4bed6ba0e88f50 Wang Liang 2025-08-26 37 unsigned int cpu; 4bed6ba0e88f50 Wang Liang 2025-08-26 38 4bed6ba0e88f50 Wang Liang 2025-08-26 39 rcu_read_lock(); 4bed6ba0e88f50 Wang Liang 2025-08-26 40 flow_table = rcu_dereference(rxqueue->oecls_ftb); 4bed6ba0e88f50 Wang Liang 2025-08-26 41 if (flow_table && flow_id <= flow_table->mask) { 4bed6ba0e88f50 Wang Liang 2025-08-26 42 rflow = &flow_table->flows[flow_id]; 4bed6ba0e88f50 Wang Liang 2025-08-26 43 cpu = READ_ONCE(rflow->cpu); 4bed6ba0e88f50 Wang Liang 2025-08-26 44 oecls_debug("dev:%s, rxq:%d, flow_id:%u, filter_id:%d/%d, cpu:%d\n", dev->name, 4bed6ba0e88f50 Wang Liang 2025-08-26 45 rxq_index, flow_id, filter_id, rflow->filter, cpu); 4bed6ba0e88f50 Wang Liang 2025-08-26 46 4bed6ba0e88f50 Wang Liang 2025-08-26 47 if (rflow->filter == filter_id && cpu < nr_cpu_ids) { 4bed6ba0e88f50 Wang Liang 2025-08-26 48 if (time_before(jiffies, rflow->timeout + OECLS_TIMEOUT)) { 4bed6ba0e88f50 Wang Liang 2025-08-26 49 expire = false; 4bed6ba0e88f50 Wang Liang 2025-08-26 50 } else { 4bed6ba0e88f50 Wang Liang 2025-08-26 51 rflow->isvalid = 0; 4bed6ba0e88f50 Wang Liang 2025-08-26 52 WRITE_ONCE(rflow->cpu, OECLS_NO_CPU); 4bed6ba0e88f50 Wang Liang 2025-08-26 53 } 4bed6ba0e88f50 Wang Liang 2025-08-26 54 } 4bed6ba0e88f50 Wang Liang 2025-08-26 55 } 4bed6ba0e88f50 Wang Liang 2025-08-26 56 rcu_read_unlock(); 4bed6ba0e88f50 Wang Liang 2025-08-26 57 oecls_debug("%s, dev:%s, rxq:%d, flow_id:%u, filter_id:%d, expire:%d\n", __func__, 4bed6ba0e88f50 Wang Liang 2025-08-26 58 dev->name, rxq_index, flow_id, filter_id, expire); 22d4075bf5ef29 Wang Liang 2025-09-12 59 return expire; 4bed6ba0e88f50 Wang Liang 2025-08-26 60 } 4bed6ba0e88f50 Wang Liang 2025-08-26 61 22d4075bf5ef29 Wang Liang 2025-09-12 62 static void _oecls_flow_update(struct sock *sk) 4bed6ba0e88f50 Wang Liang 2025-08-26 63 { 4bed6ba0e88f50 Wang Liang 2025-08-26 64 struct oecls_sock_flow_table *tb; 4bed6ba0e88f50 Wang Liang 2025-08-26 65 unsigned int hash, index; 4bed6ba0e88f50 Wang Liang 2025-08-26 66 u32 val; 4bed6ba0e88f50 Wang Liang 2025-08-26 67 u32 cpu = raw_smp_processor_id(); 4bed6ba0e88f50 Wang Liang 2025-08-26 68 4bed6ba0e88f50 Wang Liang 2025-08-26 69 if (sk->sk_state != TCP_ESTABLISHED) 4bed6ba0e88f50 Wang Liang 2025-08-26 70 return; 4bed6ba0e88f50 Wang Liang 2025-08-26 71 4bed6ba0e88f50 Wang Liang 2025-08-26 72 if (check_appname(current->comm)) 4bed6ba0e88f50 Wang Liang 2025-08-26 73 return; 4bed6ba0e88f50 Wang Liang 2025-08-26 74 4bed6ba0e88f50 Wang Liang 2025-08-26 75 rcu_read_lock(); 4bed6ba0e88f50 Wang Liang 2025-08-26 76 tb = rcu_dereference(oecls_sock_flow_table); 4bed6ba0e88f50 Wang Liang 2025-08-26 77 hash = READ_ONCE(sk->sk_rxhash); 4bed6ba0e88f50 Wang Liang 2025-08-26 78 if (tb && hash) { 4bed6ba0e88f50 Wang Liang 2025-08-26 79 index = hash & tb->mask; 4bed6ba0e88f50 Wang Liang 2025-08-26 80 val = hash & ~oecls_cpu_mask; 4bed6ba0e88f50 Wang Liang 2025-08-26 81 val |= cpu; 4bed6ba0e88f50 Wang Liang 2025-08-26 82 4bed6ba0e88f50 Wang Liang 2025-08-26 83 if (READ_ONCE(tb->ents[index]) != val) { 4bed6ba0e88f50 Wang Liang 2025-08-26 84 WRITE_ONCE(tb->ents[index], val); 4bed6ba0e88f50 Wang Liang 2025-08-26 85 4bed6ba0e88f50 Wang Liang 2025-08-26 86 oecls_debug("[%s] sk:%p, hash:0x%x, index:0x%x, val:0x%x, cpu:%d\n", 4bed6ba0e88f50 Wang Liang 2025-08-26 87 current->comm, sk, hash, index, val, cpu); 4bed6ba0e88f50 Wang Liang 2025-08-26 88 } 4bed6ba0e88f50 Wang Liang 2025-08-26 89 } 4bed6ba0e88f50 Wang Liang 2025-08-26 90 rcu_read_unlock(); 4bed6ba0e88f50 Wang Liang 2025-08-26 91 } 4bed6ba0e88f50 Wang Liang 2025-08-26 92 4bed6ba0e88f50 Wang Liang 2025-08-26 93 static int flow_get_queue_idx(struct net_device *dev, int nid, struct sk_buff *skb) 4bed6ba0e88f50 Wang Liang 2025-08-26 94 { 4bed6ba0e88f50 Wang Liang 2025-08-26 95 struct oecls_netdev_info *netdev_info; 4bed6ba0e88f50 Wang Liang 2025-08-26 96 int netdev_loop; 4bed6ba0e88f50 Wang Liang 2025-08-26 97 u32 hash, index; 4bed6ba0e88f50 Wang Liang 2025-08-26 98 struct oecls_numa_info *numa_info; 4bed6ba0e88f50 Wang Liang 2025-08-26 99 struct oecls_numa_bound_dev_info *bound_dev = NULL; 4bed6ba0e88f50 Wang Liang 2025-08-26 100 int rxq_id, rxq_num, i; 4bed6ba0e88f50 Wang Liang 2025-08-26 101 4bed6ba0e88f50 Wang Liang 2025-08-26 102 numa_info = get_oecls_numa_info(nid); 4bed6ba0e88f50 Wang Liang 2025-08-26 103 if (!numa_info) 4bed6ba0e88f50 Wang Liang 2025-08-26 104 return -1; 4bed6ba0e88f50 Wang Liang 2025-08-26 105 4bed6ba0e88f50 Wang Liang 2025-08-26 106 for_each_oecls_netdev(netdev_loop, netdev_info) { 4bed6ba0e88f50 Wang Liang 2025-08-26 107 if (strcmp(netdev_info->dev_name, dev->name) == 0) { 4bed6ba0e88f50 Wang Liang 2025-08-26 108 bound_dev = &numa_info->bound_dev[netdev_loop]; 4bed6ba0e88f50 Wang Liang 2025-08-26 109 break; 4bed6ba0e88f50 Wang Liang 2025-08-26 110 } 4bed6ba0e88f50 Wang Liang 2025-08-26 111 } 4bed6ba0e88f50 Wang Liang 2025-08-26 112 4bed6ba0e88f50 Wang Liang 2025-08-26 113 if (!bound_dev) 4bed6ba0e88f50 Wang Liang 2025-08-26 114 return -1; 4bed6ba0e88f50 Wang Liang 2025-08-26 115 rxq_num = bitmap_weight(bound_dev->bitmap_rxq, OECLS_MAX_RXQ_NUM_PER_DEV); 4bed6ba0e88f50 Wang Liang 2025-08-26 116 if (rxq_num == 0) 4bed6ba0e88f50 Wang Liang 2025-08-26 117 return -1; 4bed6ba0e88f50 Wang Liang 2025-08-26 118 4bed6ba0e88f50 Wang Liang 2025-08-26 119 hash = skb_get_hash(skb); 4bed6ba0e88f50 Wang Liang 2025-08-26 120 index = hash % rxq_num; 4bed6ba0e88f50 Wang Liang 2025-08-26 121 4bed6ba0e88f50 Wang Liang 2025-08-26 122 i = 0; 4bed6ba0e88f50 Wang Liang 2025-08-26 123 for_each_set_bit(rxq_id, bound_dev->bitmap_rxq, OECLS_MAX_RXQ_NUM_PER_DEV) 4bed6ba0e88f50 Wang Liang 2025-08-26 124 if (index == i++) 4bed6ba0e88f50 Wang Liang 2025-08-26 125 return rxq_id; 4bed6ba0e88f50 Wang Liang 2025-08-26 126 4bed6ba0e88f50 Wang Liang 2025-08-26 127 return -1; 4bed6ba0e88f50 Wang Liang 2025-08-26 128 } 4bed6ba0e88f50 Wang Liang 2025-08-26 129 4bed6ba0e88f50 Wang Liang 2025-08-26 130 static void set_oecls_cpu(struct net_device *dev, struct sk_buff *skb, 4bed6ba0e88f50 Wang Liang 2025-08-26 131 struct oecls_dev_flow *old_rflow, int old_rxq_id, u16 next_cpu) 4bed6ba0e88f50 Wang Liang 2025-08-26 132 { 4bed6ba0e88f50 Wang Liang 2025-08-26 133 struct netdev_rx_queue *rxqueue; 4bed6ba0e88f50 Wang Liang 2025-08-26 134 struct oecls_dev_flow_table *dtb; 4bed6ba0e88f50 Wang Liang 2025-08-26 135 struct oecls_dev_flow *rflow; 4bed6ba0e88f50 Wang Liang 2025-08-26 136 u32 flow_id, hash; 4bed6ba0e88f50 Wang Liang 2025-08-26 137 u16 rxq_index; 4bed6ba0e88f50 Wang Liang 2025-08-26 138 int rc; 4bed6ba0e88f50 Wang Liang 2025-08-26 139 4bed6ba0e88f50 Wang Liang 2025-08-26 @140 if (!skb_rx_queue_recorded(skb) || !dev->rx_cpu_rmap || 4bed6ba0e88f50 Wang Liang 2025-08-26 141 !(dev->features & NETIF_F_NTUPLE)) 4bed6ba0e88f50 Wang Liang 2025-08-26 142 return; 4bed6ba0e88f50 Wang Liang 2025-08-26 143 4bed6ba0e88f50 Wang Liang 2025-08-26 144 rxq_index = flow_get_queue_idx(dev, cpu_to_node(next_cpu), skb); 4bed6ba0e88f50 Wang Liang 2025-08-26 145 if (rxq_index == skb_get_rx_queue(skb) || rxq_index < 0) 4bed6ba0e88f50 Wang Liang 2025-08-26 146 return; 4bed6ba0e88f50 Wang Liang 2025-08-26 147 4bed6ba0e88f50 Wang Liang 2025-08-26 148 rxqueue = dev->_rx + rxq_index; 4bed6ba0e88f50 Wang Liang 2025-08-26 149 dtb = rcu_dereference(rxqueue->oecls_ftb); 4bed6ba0e88f50 Wang Liang 2025-08-26 150 if (!dtb) 4bed6ba0e88f50 Wang Liang 2025-08-26 151 return; 4bed6ba0e88f50 Wang Liang 2025-08-26 152 4bed6ba0e88f50 Wang Liang 2025-08-26 153 hash = skb_get_hash(skb); 4bed6ba0e88f50 Wang Liang 2025-08-26 154 flow_id = hash & dtb->mask; 4bed6ba0e88f50 Wang Liang 2025-08-26 155 rflow = &dtb->flows[flow_id]; 4bed6ba0e88f50 Wang Liang 2025-08-26 156 if (rflow->isvalid && rflow->cpu == next_cpu) { 4bed6ba0e88f50 Wang Liang 2025-08-26 157 rflow->timeout = jiffies; 4bed6ba0e88f50 Wang Liang 2025-08-26 158 return; 4bed6ba0e88f50 Wang Liang 2025-08-26 159 } 4bed6ba0e88f50 Wang Liang 2025-08-26 160 4bed6ba0e88f50 Wang Liang 2025-08-26 @161 rc = dev->netdev_ops->ndo_rx_flow_steer(dev, skb, rxq_index, flow_id); 4bed6ba0e88f50 Wang Liang 2025-08-26 162 oecls_debug("skb:%p, rxq:%d, hash:0x%x, flow_id:%u, old_rxq_id:%d, next_cpu:%d, rc:%d\n", 4bed6ba0e88f50 Wang Liang 2025-08-26 163 skb, rxq_index, hash, flow_id, old_rxq_id, next_cpu, rc); 4bed6ba0e88f50 Wang Liang 2025-08-26 164 if (rc < 0) 4bed6ba0e88f50 Wang Liang 2025-08-26 165 return; 4bed6ba0e88f50 Wang Liang 2025-08-26 166 4bed6ba0e88f50 Wang Liang 2025-08-26 167 rflow->filter = rc; 4bed6ba0e88f50 Wang Liang 2025-08-26 168 rflow->isvalid = 1; 4bed6ba0e88f50 Wang Liang 2025-08-26 169 rflow->timeout = jiffies; 4bed6ba0e88f50 Wang Liang 2025-08-26 170 if (old_rflow->filter == rflow->filter) 4bed6ba0e88f50 Wang Liang 2025-08-26 171 old_rflow->filter = OECLS_NO_FILTER; 4bed6ba0e88f50 Wang Liang 2025-08-26 172 rflow->cpu = next_cpu; 4bed6ba0e88f50 Wang Liang 2025-08-26 173 } 4bed6ba0e88f50 Wang Liang 2025-08-26 174 :::::: The code at line 140 was first introduced by commit :::::: 4bed6ba0e88f50484fd5fb06bd993727b981b718 net/oenetcls: introduce oenetcls for network optimization :::::: TO: Wang Liang <wangliang74@huawei.com> :::::: CC: Wang Liang <wangliang74@huawei.com> -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki