Hi Balaev, Thank you for the patch! Yet something to improve: [auto build test ERROR on net-next/master] url: https://github.com/0day-ci/linux/commits/Balaev-Pavel/net-multipath-routing-configurable-seed/20210423-214755 base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git cad4162a90aeff737a16c0286987f51e927f003a config: riscv-rv32_defconfig (attached as .config) compiler: riscv32-linux-gcc (GCC) 9.3.0 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/0day-ci/linux/commit/d2127c4161e4482ac75072cfdbb27781d2a9be30 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Balaev-Pavel/net-multipath-routing-configurable-seed/20210423-214755 git checkout d2127c4161e4482ac75072cfdbb27781d2a9be30 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross W=1 ARCH=riscv If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot All errors (new ones prefixed by >>): net/ipv6/route.c: In function 'rt6_multipath_hash': >> net/ipv6/route.c:2422:11: error: implicit declaration of function 'flow_multipath_hash_from_keys'; did you mean 'flow_hash_from_keys'? [-Werror=implicit-function-declaration] 2422 | mhash = flow_multipath_hash_from_keys(&hash_keys, seed_ctx); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | flow_hash_from_keys cc1: some warnings being treated as errors vim +2422 net/ipv6/route.c 2328 2329 /* if skb is set it will be used and fl6 can be NULL */ 2330 u32 rt6_multipath_hash(const struct net *net, const struct flowi6 *fl6, 2331 const struct sk_buff *skb, struct flow_keys *flkeys) 2332 { 2333 struct flow_keys hash_keys; 2334 siphash_key_t *seed_ctx; 2335 u32 mhash; 2336 2337 switch (ip6_multipath_hash_policy(net)) { 2338 case 0: 2339 memset(&hash_keys, 0, sizeof(hash_keys)); 2340 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS; 2341 if (skb) { 2342 ip6_multipath_l3_keys(skb, &hash_keys, flkeys); 2343 } else { 2344 hash_keys.addrs.v6addrs.src = fl6->saddr; 2345 hash_keys.addrs.v6addrs.dst = fl6->daddr; 2346 hash_keys.tags.flow_label = (__force u32)flowi6_get_flowlabel(fl6); 2347 hash_keys.basic.ip_proto = fl6->flowi6_proto; 2348 } 2349 break; 2350 case 1: 2351 if (skb) { 2352 unsigned int flag = FLOW_DISSECTOR_F_STOP_AT_ENCAP; 2353 struct flow_keys keys; 2354 2355 /* short-circuit if we already have L4 hash present */ 2356 if (skb->l4_hash) 2357 return skb_get_hash_raw(skb) >> 1; 2358 2359 memset(&hash_keys, 0, sizeof(hash_keys)); 2360 2361 if (!flkeys) { 2362 skb_flow_dissect_flow_keys(skb, &keys, flag); 2363 flkeys = &keys; 2364 } 2365 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS; 2366 hash_keys.addrs.v6addrs.src = flkeys->addrs.v6addrs.src; 2367 hash_keys.addrs.v6addrs.dst = flkeys->addrs.v6addrs.dst; 2368 hash_keys.ports.src = flkeys->ports.src; 2369 hash_keys.ports.dst = flkeys->ports.dst; 2370 hash_keys.basic.ip_proto = flkeys->basic.ip_proto; 2371 } else { 2372 memset(&hash_keys, 0, sizeof(hash_keys)); 2373 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS; 2374 hash_keys.addrs.v6addrs.src = fl6->saddr; 2375 hash_keys.addrs.v6addrs.dst = fl6->daddr; 2376 hash_keys.ports.src = fl6->fl6_sport; 2377 hash_keys.ports.dst = fl6->fl6_dport; 2378 hash_keys.basic.ip_proto = fl6->flowi6_proto; 2379 } 2380 break; 2381 case 2: 2382 memset(&hash_keys, 0, sizeof(hash_keys)); 2383 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS; 2384 if (skb) { 2385 struct flow_keys keys; 2386 2387 if (!flkeys) { 2388 skb_flow_dissect_flow_keys(skb, &keys, 0); 2389 flkeys = &keys; 2390 } 2391 2392 /* Inner can be v4 or v6 */ 2393 if (flkeys->control.addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS) { 2394 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS; 2395 hash_keys.addrs.v4addrs.src = flkeys->addrs.v4addrs.src; 2396 hash_keys.addrs.v4addrs.dst = flkeys->addrs.v4addrs.dst; 2397 } else if (flkeys->control.addr_type == FLOW_DISSECTOR_KEY_IPV6_ADDRS) { 2398 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS; 2399 hash_keys.addrs.v6addrs.src = flkeys->addrs.v6addrs.src; 2400 hash_keys.addrs.v6addrs.dst = flkeys->addrs.v6addrs.dst; 2401 hash_keys.tags.flow_label = flkeys->tags.flow_label; 2402 hash_keys.basic.ip_proto = flkeys->basic.ip_proto; 2403 } else { 2404 /* Same as case 0 */ 2405 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS; 2406 ip6_multipath_l3_keys(skb, &hash_keys, flkeys); 2407 } 2408 } else { 2409 /* Same as case 0 */ 2410 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS; 2411 hash_keys.addrs.v6addrs.src = fl6->saddr; 2412 hash_keys.addrs.v6addrs.dst = fl6->daddr; 2413 hash_keys.tags.flow_label = (__force u32)flowi6_get_flowlabel(fl6); 2414 hash_keys.basic.ip_proto = fl6->flowi6_proto; 2415 } 2416 break; 2417 } 2418 2419 rcu_read_lock(); 2420 seed_ctx = rcu_dereference(net->ipv6.multipath_hash_seed_ctx); 2421 if (seed_ctx) > 2422 mhash = flow_multipath_hash_from_keys(&hash_keys, seed_ctx); 2423 else 2424 mhash = flow_hash_from_keys(&hash_keys); 2425 rcu_read_unlock(); 2426 2427 return mhash >> 1; 2428 } 2429 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org