Hi Eric, I love your patch! Perhaps something to improve:
[auto build test WARNING on net-next/master] url: https://github.com/0day-ci/linux/commits/Eric-Dumazet/ipv6-icmp6-avoid-indirect-call-for-icmpv6_send/20200620-030444 base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 0fb9fbab405351aa0c18973881c4103e4da886b6 config: riscv-randconfig-r033-20200619 (attached as .config) compiler: clang version 11.0.0 (https://github.com/llvm/llvm-project 487ca07fcc75d52755c9fe2ee05bcb3b6eeeec44) 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 riscv cross compiling tool for clang build # apt-get install binutils-riscv64-linux-gnu # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <l...@intel.com> All warnings (new ones prefixed by >>, old ones prefixed by <<): >> net/ipv6/icmp.c:442:6: warning: no previous prototype for function >> 'icmp6_send' [-Wmissing-prototypes] void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info, ^ net/ipv6/icmp.c:442:1: note: declare 'static' if the function is not intended to be used outside of this translation unit void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info, ^ static 1 warning generated. vim +/icmp6_send +442 net/ipv6/icmp.c 438 439 /* 440 * Send an ICMP message in response to a packet in error 441 */ > 442 void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info, 443 const struct in6_addr *force_saddr) 444 { 445 struct inet6_dev *idev = NULL; 446 struct ipv6hdr *hdr = ipv6_hdr(skb); 447 struct sock *sk; 448 struct net *net; 449 struct ipv6_pinfo *np; 450 const struct in6_addr *saddr = NULL; 451 struct dst_entry *dst; 452 struct icmp6hdr tmp_hdr; 453 struct flowi6 fl6; 454 struct icmpv6_msg msg; 455 struct ipcm6_cookie ipc6; 456 int iif = 0; 457 int addr_type = 0; 458 int len; 459 u32 mark; 460 461 if ((u8 *)hdr < skb->head || 462 (skb_network_header(skb) + sizeof(*hdr)) > skb_tail_pointer(skb)) 463 return; 464 465 if (!skb->dev) 466 return; 467 net = dev_net(skb->dev); 468 mark = IP6_REPLY_MARK(net, skb->mark); 469 /* 470 * Make sure we respect the rules 471 * i.e. RFC 1885 2.4(e) 472 * Rule (e.1) is enforced by not using icmp6_send 473 * in any code that processes icmp errors. 474 */ 475 addr_type = ipv6_addr_type(&hdr->daddr); 476 477 if (ipv6_chk_addr(net, &hdr->daddr, skb->dev, 0) || 478 ipv6_chk_acast_addr_src(net, skb->dev, &hdr->daddr)) 479 saddr = &hdr->daddr; 480 481 /* 482 * Dest addr check 483 */ 484 485 if (addr_type & IPV6_ADDR_MULTICAST || skb->pkt_type != PACKET_HOST) { 486 if (type != ICMPV6_PKT_TOOBIG && 487 !(type == ICMPV6_PARAMPROB && 488 code == ICMPV6_UNK_OPTION && 489 (opt_unrec(skb, info)))) 490 return; 491 492 saddr = NULL; 493 } 494 495 addr_type = ipv6_addr_type(&hdr->saddr); 496 497 /* 498 * Source addr check 499 */ 500 501 if (__ipv6_addr_needs_scope_id(addr_type)) { 502 iif = icmp6_iif(skb); 503 } else { 504 dst = skb_dst(skb); 505 iif = l3mdev_master_ifindex(dst ? dst->dev : skb->dev); 506 } 507 508 /* 509 * Must not send error if the source does not uniquely 510 * identify a single node (RFC2463 Section 2.4). 511 * We check unspecified / multicast addresses here, 512 * and anycast addresses will be checked later. 513 */ 514 if ((addr_type == IPV6_ADDR_ANY) || (addr_type & IPV6_ADDR_MULTICAST)) { 515 net_dbg_ratelimited("icmp6_send: addr_any/mcast source [%pI6c > %pI6c]\n", 516 &hdr->saddr, &hdr->daddr); 517 return; 518 } 519 520 /* 521 * Never answer to a ICMP packet. 522 */ 523 if (is_ineligible(skb)) { 524 net_dbg_ratelimited("icmp6_send: no reply to icmp error [%pI6c > %pI6c]\n", 525 &hdr->saddr, &hdr->daddr); 526 return; 527 } 528 529 /* Needed by both icmp_global_allow and icmpv6_xmit_lock */ 530 local_bh_disable(); 531 532 /* Check global sysctl_icmp_msgs_per_sec ratelimit */ 533 if (!(skb->dev->flags & IFF_LOOPBACK) && !icmpv6_global_allow(net, type)) 534 goto out_bh_enable; 535 536 mip6_addr_swap(skb); 537 538 sk = icmpv6_xmit_lock(net); 539 if (!sk) 540 goto out_bh_enable; 541 542 memset(&fl6, 0, sizeof(fl6)); 543 fl6.flowi6_proto = IPPROTO_ICMPV6; 544 fl6.daddr = hdr->saddr; 545 if (force_saddr) 546 saddr = force_saddr; 547 if (saddr) { 548 fl6.saddr = *saddr; 549 } else if (!icmpv6_rt_has_prefsrc(sk, type, &fl6)) { 550 /* select a more meaningful saddr from input if */ 551 struct net_device *in_netdev; 552 553 in_netdev = dev_get_by_index(net, IP6CB(skb)->iif); 554 if (in_netdev) { 555 ipv6_dev_get_saddr(net, in_netdev, &fl6.daddr, 556 inet6_sk(sk)->srcprefs, 557 &fl6.saddr); 558 dev_put(in_netdev); 559 } 560 } 561 fl6.flowi6_mark = mark; 562 fl6.flowi6_oif = iif; 563 fl6.fl6_icmp_type = type; 564 fl6.fl6_icmp_code = code; 565 fl6.flowi6_uid = sock_net_uid(net, NULL); 566 fl6.mp_hash = rt6_multipath_hash(net, &fl6, skb, NULL); 567 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6)); 568 569 sk->sk_mark = mark; 570 np = inet6_sk(sk); 571 572 if (!icmpv6_xrlim_allow(sk, type, &fl6)) 573 goto out; 574 575 tmp_hdr.icmp6_type = type; 576 tmp_hdr.icmp6_code = code; 577 tmp_hdr.icmp6_cksum = 0; 578 tmp_hdr.icmp6_pointer = htonl(info); 579 580 if (!fl6.flowi6_oif && ipv6_addr_is_multicast(&fl6.daddr)) 581 fl6.flowi6_oif = np->mcast_oif; 582 else if (!fl6.flowi6_oif) 583 fl6.flowi6_oif = np->ucast_oif; 584 585 ipcm6_init_sk(&ipc6, np); 586 fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel); 587 588 dst = icmpv6_route_lookup(net, skb, sk, &fl6); 589 if (IS_ERR(dst)) 590 goto out; 591 592 ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst); 593 594 msg.skb = skb; 595 msg.offset = skb_network_offset(skb); 596 msg.type = type; 597 598 len = skb->len - msg.offset; 599 len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(struct icmp6hdr)); 600 if (len < 0) { 601 net_dbg_ratelimited("icmp: len problem [%pI6c > %pI6c]\n", 602 &hdr->saddr, &hdr->daddr); 603 goto out_dst_release; 604 } 605 606 rcu_read_lock(); 607 idev = __in6_dev_get(skb->dev); 608 609 if (ip6_append_data(sk, icmpv6_getfrag, &msg, 610 len + sizeof(struct icmp6hdr), 611 sizeof(struct icmp6hdr), 612 &ipc6, &fl6, (struct rt6_info *)dst, 613 MSG_DONTWAIT)) { 614 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS); 615 ip6_flush_pending_frames(sk); 616 } else { 617 icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr, 618 len + sizeof(struct icmp6hdr)); 619 } 620 rcu_read_unlock(); 621 out_dst_release: 622 dst_release(dst); 623 out: 624 icmpv6_xmit_unlock(sk); 625 out_bh_enable: 626 local_bh_enable(); 627 } 628 EXPORT_SYMBOL(icmp6_send); 629 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org
.config.gz
Description: application/gzip