CC: [email protected] CC: [email protected] TO: Christophe Leroy <[email protected]> CC: Michael Ellerman <[email protected]>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 9b57f458985742bd1c585f4c7f36d04634ce1143 commit: 1e688dd2a3d6759d416616ff07afc4bb836c4213 powerpc/bug: Provide better flexibility to WARN_ON/__WARN_FLAGS() with asm goto date: 5 months ago :::::: branch date: 5 hours ago :::::: commit date: 5 months ago config: powerpc64-randconfig-m031-20220120 (https://download.01.org/0day-ci/archive/20220122/[email protected]/config) compiler: powerpc64-linux-gcc (GCC) 11.2.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> Reported-by: Dan Carpenter <[email protected]> smatch warnings: net/kcm/kcmsock.c:645 kcm_write_msgs() error: we previously assumed 'psock' could be null (see line 585) vim +/psock +645 net/kcm/kcmsock.c cd6e111bf5be5c7 Tom Herbert 2016-03-07 569 ab7ac4eb9832e32 Tom Herbert 2016-03-07 570 /* Write any messages ready on the kcm socket. Called with kcm sock lock ab7ac4eb9832e32 Tom Herbert 2016-03-07 571 * held. Return bytes actually sent or error. ab7ac4eb9832e32 Tom Herbert 2016-03-07 572 */ ab7ac4eb9832e32 Tom Herbert 2016-03-07 573 static int kcm_write_msgs(struct kcm_sock *kcm) ab7ac4eb9832e32 Tom Herbert 2016-03-07 574 { ab7ac4eb9832e32 Tom Herbert 2016-03-07 575 struct sock *sk = &kcm->sk; ab7ac4eb9832e32 Tom Herbert 2016-03-07 576 struct kcm_psock *psock; ab7ac4eb9832e32 Tom Herbert 2016-03-07 577 struct sk_buff *skb, *head; ab7ac4eb9832e32 Tom Herbert 2016-03-07 578 struct kcm_tx_msg *txm; ab7ac4eb9832e32 Tom Herbert 2016-03-07 579 unsigned short fragidx, frag_offset; ab7ac4eb9832e32 Tom Herbert 2016-03-07 580 unsigned int sent, total_sent = 0; ab7ac4eb9832e32 Tom Herbert 2016-03-07 581 int ret = 0; ab7ac4eb9832e32 Tom Herbert 2016-03-07 582 ab7ac4eb9832e32 Tom Herbert 2016-03-07 583 kcm->tx_wait_more = false; ab7ac4eb9832e32 Tom Herbert 2016-03-07 584 psock = kcm->tx_psock; ab7ac4eb9832e32 Tom Herbert 2016-03-07 @585 if (unlikely(psock && psock->tx_stopped)) { ab7ac4eb9832e32 Tom Herbert 2016-03-07 586 /* A reserved psock was aborted asynchronously. Unreserve ab7ac4eb9832e32 Tom Herbert 2016-03-07 587 * it and we'll retry the message. ab7ac4eb9832e32 Tom Herbert 2016-03-07 588 */ ab7ac4eb9832e32 Tom Herbert 2016-03-07 589 unreserve_psock(kcm); cd6e111bf5be5c7 Tom Herbert 2016-03-07 590 kcm_report_tx_retry(kcm); ab7ac4eb9832e32 Tom Herbert 2016-03-07 591 if (skb_queue_empty(&sk->sk_write_queue)) ab7ac4eb9832e32 Tom Herbert 2016-03-07 592 return 0; ab7ac4eb9832e32 Tom Herbert 2016-03-07 593 ab7ac4eb9832e32 Tom Herbert 2016-03-07 594 kcm_tx_msg(skb_peek(&sk->sk_write_queue))->sent = 0; ab7ac4eb9832e32 Tom Herbert 2016-03-07 595 ab7ac4eb9832e32 Tom Herbert 2016-03-07 596 } else if (skb_queue_empty(&sk->sk_write_queue)) { ab7ac4eb9832e32 Tom Herbert 2016-03-07 597 return 0; ab7ac4eb9832e32 Tom Herbert 2016-03-07 598 } ab7ac4eb9832e32 Tom Herbert 2016-03-07 599 ab7ac4eb9832e32 Tom Herbert 2016-03-07 600 head = skb_peek(&sk->sk_write_queue); ab7ac4eb9832e32 Tom Herbert 2016-03-07 601 txm = kcm_tx_msg(head); ab7ac4eb9832e32 Tom Herbert 2016-03-07 602 ab7ac4eb9832e32 Tom Herbert 2016-03-07 603 if (txm->sent) { ab7ac4eb9832e32 Tom Herbert 2016-03-07 604 /* Send of first skbuff in queue already in progress */ ab7ac4eb9832e32 Tom Herbert 2016-03-07 605 if (WARN_ON(!psock)) { ab7ac4eb9832e32 Tom Herbert 2016-03-07 606 ret = -EINVAL; ab7ac4eb9832e32 Tom Herbert 2016-03-07 607 goto out; ab7ac4eb9832e32 Tom Herbert 2016-03-07 608 } ab7ac4eb9832e32 Tom Herbert 2016-03-07 609 sent = txm->sent; ab7ac4eb9832e32 Tom Herbert 2016-03-07 610 frag_offset = txm->frag_offset; ab7ac4eb9832e32 Tom Herbert 2016-03-07 611 fragidx = txm->fragidx; ab7ac4eb9832e32 Tom Herbert 2016-03-07 612 skb = txm->frag_skb; ab7ac4eb9832e32 Tom Herbert 2016-03-07 613 ab7ac4eb9832e32 Tom Herbert 2016-03-07 614 goto do_frag; ab7ac4eb9832e32 Tom Herbert 2016-03-07 615 } ab7ac4eb9832e32 Tom Herbert 2016-03-07 616 ab7ac4eb9832e32 Tom Herbert 2016-03-07 617 try_again: ab7ac4eb9832e32 Tom Herbert 2016-03-07 618 psock = reserve_psock(kcm); ab7ac4eb9832e32 Tom Herbert 2016-03-07 619 if (!psock) ab7ac4eb9832e32 Tom Herbert 2016-03-07 620 goto out; ab7ac4eb9832e32 Tom Herbert 2016-03-07 621 ab7ac4eb9832e32 Tom Herbert 2016-03-07 622 do { ab7ac4eb9832e32 Tom Herbert 2016-03-07 623 skb = head; ab7ac4eb9832e32 Tom Herbert 2016-03-07 624 txm = kcm_tx_msg(head); ab7ac4eb9832e32 Tom Herbert 2016-03-07 625 sent = 0; ab7ac4eb9832e32 Tom Herbert 2016-03-07 626 ab7ac4eb9832e32 Tom Herbert 2016-03-07 627 do_frag_list: ab7ac4eb9832e32 Tom Herbert 2016-03-07 628 if (WARN_ON(!skb_shinfo(skb)->nr_frags)) { ab7ac4eb9832e32 Tom Herbert 2016-03-07 629 ret = -EINVAL; ab7ac4eb9832e32 Tom Herbert 2016-03-07 630 goto out; ab7ac4eb9832e32 Tom Herbert 2016-03-07 631 } ab7ac4eb9832e32 Tom Herbert 2016-03-07 632 ab7ac4eb9832e32 Tom Herbert 2016-03-07 633 for (fragidx = 0; fragidx < skb_shinfo(skb)->nr_frags; ab7ac4eb9832e32 Tom Herbert 2016-03-07 634 fragidx++) { ab7ac4eb9832e32 Tom Herbert 2016-03-07 635 skb_frag_t *frag; ab7ac4eb9832e32 Tom Herbert 2016-03-07 636 ab7ac4eb9832e32 Tom Herbert 2016-03-07 637 frag_offset = 0; ab7ac4eb9832e32 Tom Herbert 2016-03-07 638 do_frag: ab7ac4eb9832e32 Tom Herbert 2016-03-07 639 frag = &skb_shinfo(skb)->frags[fragidx]; d8e18a516f8f674 Matthew Wilcox (Oracle 2019-07-22 640) if (WARN_ON(!skb_frag_size(frag))) { ab7ac4eb9832e32 Tom Herbert 2016-03-07 641 ret = -EINVAL; ab7ac4eb9832e32 Tom Herbert 2016-03-07 642 goto out; ab7ac4eb9832e32 Tom Herbert 2016-03-07 643 } ab7ac4eb9832e32 Tom Herbert 2016-03-07 644 ab7ac4eb9832e32 Tom Herbert 2016-03-07 @645 ret = kernel_sendpage(psock->sk->sk_socket, d8e18a516f8f674 Matthew Wilcox (Oracle 2019-07-22 646) skb_frag_page(frag), b54c9d5bd6e38ed Jonathan Lemon 2019-07-30 647 skb_frag_off(frag) + frag_offset, d8e18a516f8f674 Matthew Wilcox (Oracle 2019-07-22 648) skb_frag_size(frag) - frag_offset, ab7ac4eb9832e32 Tom Herbert 2016-03-07 649 MSG_DONTWAIT); ab7ac4eb9832e32 Tom Herbert 2016-03-07 650 if (ret <= 0) { ab7ac4eb9832e32 Tom Herbert 2016-03-07 651 if (ret == -EAGAIN) { ab7ac4eb9832e32 Tom Herbert 2016-03-07 652 /* Save state to try again when there's ab7ac4eb9832e32 Tom Herbert 2016-03-07 653 * write space on the socket ab7ac4eb9832e32 Tom Herbert 2016-03-07 654 */ ab7ac4eb9832e32 Tom Herbert 2016-03-07 655 txm->sent = sent; ab7ac4eb9832e32 Tom Herbert 2016-03-07 656 txm->frag_offset = frag_offset; ab7ac4eb9832e32 Tom Herbert 2016-03-07 657 txm->fragidx = fragidx; ab7ac4eb9832e32 Tom Herbert 2016-03-07 658 txm->frag_skb = skb; ab7ac4eb9832e32 Tom Herbert 2016-03-07 659 ab7ac4eb9832e32 Tom Herbert 2016-03-07 660 ret = 0; ab7ac4eb9832e32 Tom Herbert 2016-03-07 661 goto out; ab7ac4eb9832e32 Tom Herbert 2016-03-07 662 } ab7ac4eb9832e32 Tom Herbert 2016-03-07 663 ab7ac4eb9832e32 Tom Herbert 2016-03-07 664 /* Hard failure in sending message, abort this ab7ac4eb9832e32 Tom Herbert 2016-03-07 665 * psock since it has lost framing 71a2fae50895b32 Bhaskar Chowdhury 2021-03-27 666 * synchronization and retry sending the ab7ac4eb9832e32 Tom Herbert 2016-03-07 667 * message from the beginning. ab7ac4eb9832e32 Tom Herbert 2016-03-07 668 */ ab7ac4eb9832e32 Tom Herbert 2016-03-07 669 kcm_abort_tx_psock(psock, ret ? -ret : EPIPE, ab7ac4eb9832e32 Tom Herbert 2016-03-07 670 true); ab7ac4eb9832e32 Tom Herbert 2016-03-07 671 unreserve_psock(kcm); ab7ac4eb9832e32 Tom Herbert 2016-03-07 672 ab7ac4eb9832e32 Tom Herbert 2016-03-07 673 txm->sent = 0; cd6e111bf5be5c7 Tom Herbert 2016-03-07 674 kcm_report_tx_retry(kcm); ab7ac4eb9832e32 Tom Herbert 2016-03-07 675 ret = 0; ab7ac4eb9832e32 Tom Herbert 2016-03-07 676 ab7ac4eb9832e32 Tom Herbert 2016-03-07 677 goto try_again; ab7ac4eb9832e32 Tom Herbert 2016-03-07 678 } ab7ac4eb9832e32 Tom Herbert 2016-03-07 679 ab7ac4eb9832e32 Tom Herbert 2016-03-07 680 sent += ret; ab7ac4eb9832e32 Tom Herbert 2016-03-07 681 frag_offset += ret; cd6e111bf5be5c7 Tom Herbert 2016-03-07 682 KCM_STATS_ADD(psock->stats.tx_bytes, ret); d8e18a516f8f674 Matthew Wilcox (Oracle 2019-07-22 683) if (frag_offset < skb_frag_size(frag)) { ab7ac4eb9832e32 Tom Herbert 2016-03-07 684 /* Not finished with this frag */ ab7ac4eb9832e32 Tom Herbert 2016-03-07 685 goto do_frag; ab7ac4eb9832e32 Tom Herbert 2016-03-07 686 } ab7ac4eb9832e32 Tom Herbert 2016-03-07 687 } ab7ac4eb9832e32 Tom Herbert 2016-03-07 688 ab7ac4eb9832e32 Tom Herbert 2016-03-07 689 if (skb == head) { ab7ac4eb9832e32 Tom Herbert 2016-03-07 690 if (skb_has_frag_list(skb)) { ab7ac4eb9832e32 Tom Herbert 2016-03-07 691 skb = skb_shinfo(skb)->frag_list; ab7ac4eb9832e32 Tom Herbert 2016-03-07 692 goto do_frag_list; ab7ac4eb9832e32 Tom Herbert 2016-03-07 693 } ab7ac4eb9832e32 Tom Herbert 2016-03-07 694 } else if (skb->next) { ab7ac4eb9832e32 Tom Herbert 2016-03-07 695 skb = skb->next; ab7ac4eb9832e32 Tom Herbert 2016-03-07 696 goto do_frag_list; ab7ac4eb9832e32 Tom Herbert 2016-03-07 697 } ab7ac4eb9832e32 Tom Herbert 2016-03-07 698 ab7ac4eb9832e32 Tom Herbert 2016-03-07 699 /* Successfully sent the whole packet, account for it. */ ab7ac4eb9832e32 Tom Herbert 2016-03-07 700 skb_dequeue(&sk->sk_write_queue); ab7ac4eb9832e32 Tom Herbert 2016-03-07 701 kfree_skb(head); ab7ac4eb9832e32 Tom Herbert 2016-03-07 702 sk->sk_wmem_queued -= sent; ab7ac4eb9832e32 Tom Herbert 2016-03-07 703 total_sent += sent; cd6e111bf5be5c7 Tom Herbert 2016-03-07 704 KCM_STATS_INCR(psock->stats.tx_msgs); ab7ac4eb9832e32 Tom Herbert 2016-03-07 705 } while ((head = skb_peek(&sk->sk_write_queue))); ab7ac4eb9832e32 Tom Herbert 2016-03-07 706 out: ab7ac4eb9832e32 Tom Herbert 2016-03-07 707 if (!head) { ab7ac4eb9832e32 Tom Herbert 2016-03-07 708 /* Done with all queued messages. */ ab7ac4eb9832e32 Tom Herbert 2016-03-07 709 WARN_ON(!skb_queue_empty(&sk->sk_write_queue)); ab7ac4eb9832e32 Tom Herbert 2016-03-07 710 unreserve_psock(kcm); ab7ac4eb9832e32 Tom Herbert 2016-03-07 711 } ab7ac4eb9832e32 Tom Herbert 2016-03-07 712 ab7ac4eb9832e32 Tom Herbert 2016-03-07 713 /* Check if write space is available */ ab7ac4eb9832e32 Tom Herbert 2016-03-07 714 sk->sk_write_space(sk); ab7ac4eb9832e32 Tom Herbert 2016-03-07 715 ab7ac4eb9832e32 Tom Herbert 2016-03-07 716 return total_sent ? : ret; ab7ac4eb9832e32 Tom Herbert 2016-03-07 717 } ab7ac4eb9832e32 Tom Herbert 2016-03-07 718 :::::: The code at line 645 was first introduced by commit :::::: ab7ac4eb9832e32a09f4e8042705484d2fb0aad3 kcm: Kernel Connection Multiplexor module :::::: TO: Tom Herbert <[email protected]> :::::: CC: David S. Miller <[email protected]> --- 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]
