Re: [PATCH net-next v3 3/3] net: add netmem_ref to skb_frag_t

From: kernel test robot
Date: Fri Dec 22 2023 - 18:41:42 EST


Hi Mina,

kernel test robot noticed the following build errors:

[auto build test ERROR on net-next/main]

url: https://github.com/intel-lab-lkp/linux/commits/Mina-Almasry/vsock-virtio-use-skb_frag_-helpers/20231222-164637
base: net-next/main
patch link: https://lore.kernel.org/r/20231220214505.2303297-4-almasrymina%40google.com
patch subject: [PATCH net-next v3 3/3] net: add netmem_ref to skb_frag_t
config: i386-randconfig-141-20231222 (https://download.01.org/0day-ci/archive/20231223/202312230739.g0Tfssdt-lkp@xxxxxxxxx/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231223/202312230739.g0Tfssdt-lkp@xxxxxxxxx/reproduce)

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@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202312230739.g0Tfssdt-lkp@xxxxxxxxx/

All errors (new ones prefixed by >>):

net/kcm/kcmsock.c: In function 'kcm_write_msgs':
>> net/kcm/kcmsock.c:637:59: error: 'skb_frag_t' {aka 'struct skb_frag'} has no member named 'bv_len'
637 | msize += skb_shinfo(skb)->frags[i].bv_len;
| ^


vim +637 net/kcm/kcmsock.c

cd6e111bf5be5c Tom Herbert 2016-03-07 578
ab7ac4eb9832e3 Tom Herbert 2016-03-07 579 /* Write any messages ready on the kcm socket. Called with kcm sock lock
ab7ac4eb9832e3 Tom Herbert 2016-03-07 580 * held. Return bytes actually sent or error.
ab7ac4eb9832e3 Tom Herbert 2016-03-07 581 */
ab7ac4eb9832e3 Tom Herbert 2016-03-07 582 static int kcm_write_msgs(struct kcm_sock *kcm)
ab7ac4eb9832e3 Tom Herbert 2016-03-07 583 {
c31a25e1db486f David Howells 2023-06-09 584 unsigned int total_sent = 0;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 585 struct sock *sk = &kcm->sk;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 586 struct kcm_psock *psock;
c31a25e1db486f David Howells 2023-06-09 587 struct sk_buff *head;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 588 int ret = 0;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 589
ab7ac4eb9832e3 Tom Herbert 2016-03-07 590 kcm->tx_wait_more = false;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 591 psock = kcm->tx_psock;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 592 if (unlikely(psock && psock->tx_stopped)) {
ab7ac4eb9832e3 Tom Herbert 2016-03-07 593 /* A reserved psock was aborted asynchronously. Unreserve
ab7ac4eb9832e3 Tom Herbert 2016-03-07 594 * it and we'll retry the message.
ab7ac4eb9832e3 Tom Herbert 2016-03-07 595 */
ab7ac4eb9832e3 Tom Herbert 2016-03-07 596 unreserve_psock(kcm);
cd6e111bf5be5c Tom Herbert 2016-03-07 597 kcm_report_tx_retry(kcm);
ab7ac4eb9832e3 Tom Herbert 2016-03-07 598 if (skb_queue_empty(&sk->sk_write_queue))
ab7ac4eb9832e3 Tom Herbert 2016-03-07 599 return 0;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 600
c31a25e1db486f David Howells 2023-06-09 601 kcm_tx_msg(skb_peek(&sk->sk_write_queue))->started_tx = false;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 602 }
ab7ac4eb9832e3 Tom Herbert 2016-03-07 603
c31a25e1db486f David Howells 2023-06-09 604 retry:
c31a25e1db486f David Howells 2023-06-09 605 while ((head = skb_peek(&sk->sk_write_queue))) {
c31a25e1db486f David Howells 2023-06-09 606 struct msghdr msg = {
c31a25e1db486f David Howells 2023-06-09 607 .msg_flags = MSG_DONTWAIT | MSG_SPLICE_PAGES,
c31a25e1db486f David Howells 2023-06-09 608 };
c31a25e1db486f David Howells 2023-06-09 609 struct kcm_tx_msg *txm = kcm_tx_msg(head);
c31a25e1db486f David Howells 2023-06-09 610 struct sk_buff *skb;
c31a25e1db486f David Howells 2023-06-09 611 unsigned int msize;
c31a25e1db486f David Howells 2023-06-09 612 int i;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 613
c31a25e1db486f David Howells 2023-06-09 614 if (!txm->started_tx) {
c31a25e1db486f David Howells 2023-06-09 615 psock = reserve_psock(kcm);
c31a25e1db486f David Howells 2023-06-09 616 if (!psock)
c31a25e1db486f David Howells 2023-06-09 617 goto out;
c31a25e1db486f David Howells 2023-06-09 618 skb = head;
c31a25e1db486f David Howells 2023-06-09 619 txm->frag_offset = 0;
c31a25e1db486f David Howells 2023-06-09 620 txm->sent = 0;
c31a25e1db486f David Howells 2023-06-09 621 txm->started_tx = true;
c31a25e1db486f David Howells 2023-06-09 622 } else {
ab7ac4eb9832e3 Tom Herbert 2016-03-07 623 if (WARN_ON(!psock)) {
ab7ac4eb9832e3 Tom Herbert 2016-03-07 624 ret = -EINVAL;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 625 goto out;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 626 }
ab7ac4eb9832e3 Tom Herbert 2016-03-07 627 skb = txm->frag_skb;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 628 }
ab7ac4eb9832e3 Tom Herbert 2016-03-07 629
ab7ac4eb9832e3 Tom Herbert 2016-03-07 630 if (WARN_ON(!skb_shinfo(skb)->nr_frags)) {
ab7ac4eb9832e3 Tom Herbert 2016-03-07 631 ret = -EINVAL;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 632 goto out;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 633 }
ab7ac4eb9832e3 Tom Herbert 2016-03-07 634
c31a25e1db486f David Howells 2023-06-09 635 msize = 0;
c31a25e1db486f David Howells 2023-06-09 636 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
c31a25e1db486f David Howells 2023-06-09 @637 msize += skb_shinfo(skb)->frags[i].bv_len;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 638
b2e5852793b6eb Mina Almasry 2023-12-20 639 /* The cast to struct bio_vec* here assumes the frags are
b2e5852793b6eb Mina Almasry 2023-12-20 640 * struct page based. WARN if there is no page in this skb.
b2e5852793b6eb Mina Almasry 2023-12-20 641 */
b2e5852793b6eb Mina Almasry 2023-12-20 642 DEBUG_NET_WARN_ON_ONCE(
b2e5852793b6eb Mina Almasry 2023-12-20 643 !skb_frag_page(&skb_shinfo(skb)->frags[0]));
b2e5852793b6eb Mina Almasry 2023-12-20 644
c31a25e1db486f David Howells 2023-06-09 645 iov_iter_bvec(&msg.msg_iter, ITER_SOURCE,
b2e5852793b6eb Mina Almasry 2023-12-20 646 (const struct bio_vec *)skb_shinfo(skb)->frags,
b2e5852793b6eb Mina Almasry 2023-12-20 647 skb_shinfo(skb)->nr_frags, msize);
c31a25e1db486f David Howells 2023-06-09 648 iov_iter_advance(&msg.msg_iter, txm->frag_offset);
ab7ac4eb9832e3 Tom Herbert 2016-03-07 649
c31a25e1db486f David Howells 2023-06-09 650 do {
264ba53fac79b0 David Howells 2023-06-09 651 ret = sock_sendmsg(psock->sk->sk_socket, &msg);
ab7ac4eb9832e3 Tom Herbert 2016-03-07 652 if (ret <= 0) {
ab7ac4eb9832e3 Tom Herbert 2016-03-07 653 if (ret == -EAGAIN) {
ab7ac4eb9832e3 Tom Herbert 2016-03-07 654 /* Save state to try again when there's
ab7ac4eb9832e3 Tom Herbert 2016-03-07 655 * write space on the socket
ab7ac4eb9832e3 Tom Herbert 2016-03-07 656 */
ab7ac4eb9832e3 Tom Herbert 2016-03-07 657 txm->frag_skb = skb;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 658 ret = 0;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 659 goto out;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 660 }
ab7ac4eb9832e3 Tom Herbert 2016-03-07 661
ab7ac4eb9832e3 Tom Herbert 2016-03-07 662 /* Hard failure in sending message, abort this
ab7ac4eb9832e3 Tom Herbert 2016-03-07 663 * psock since it has lost framing
71a2fae50895b3 Bhaskar Chowdhury 2021-03-27 664 * synchronization and retry sending the
ab7ac4eb9832e3 Tom Herbert 2016-03-07 665 * message from the beginning.
ab7ac4eb9832e3 Tom Herbert 2016-03-07 666 */
ab7ac4eb9832e3 Tom Herbert 2016-03-07 667 kcm_abort_tx_psock(psock, ret ? -ret : EPIPE,
ab7ac4eb9832e3 Tom Herbert 2016-03-07 668 true);
ab7ac4eb9832e3 Tom Herbert 2016-03-07 669 unreserve_psock(kcm);
9f8d0dc0ec4a4b David Howells 2023-06-15 670 psock = NULL;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 671
c31a25e1db486f David Howells 2023-06-09 672 txm->started_tx = false;
cd6e111bf5be5c Tom Herbert 2016-03-07 673 kcm_report_tx_retry(kcm);
ab7ac4eb9832e3 Tom Herbert 2016-03-07 674 ret = 0;
c31a25e1db486f David Howells 2023-06-09 675 goto retry;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 676 }
ab7ac4eb9832e3 Tom Herbert 2016-03-07 677
c31a25e1db486f David Howells 2023-06-09 678 txm->sent += ret;
c31a25e1db486f David Howells 2023-06-09 679 txm->frag_offset += ret;
cd6e111bf5be5c Tom Herbert 2016-03-07 680 KCM_STATS_ADD(psock->stats.tx_bytes, ret);
c31a25e1db486f David Howells 2023-06-09 681 } while (msg.msg_iter.count > 0);
ab7ac4eb9832e3 Tom Herbert 2016-03-07 682
ab7ac4eb9832e3 Tom Herbert 2016-03-07 683 if (skb == head) {
ab7ac4eb9832e3 Tom Herbert 2016-03-07 684 if (skb_has_frag_list(skb)) {
c31a25e1db486f David Howells 2023-06-09 685 txm->frag_skb = skb_shinfo(skb)->frag_list;
c31a25e1db486f David Howells 2023-06-09 686 txm->frag_offset = 0;
c31a25e1db486f David Howells 2023-06-09 687 continue;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 688 }
ab7ac4eb9832e3 Tom Herbert 2016-03-07 689 } else if (skb->next) {
c31a25e1db486f David Howells 2023-06-09 690 txm->frag_skb = skb->next;
c31a25e1db486f David Howells 2023-06-09 691 txm->frag_offset = 0;
c31a25e1db486f David Howells 2023-06-09 692 continue;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 693 }
ab7ac4eb9832e3 Tom Herbert 2016-03-07 694
ab7ac4eb9832e3 Tom Herbert 2016-03-07 695 /* Successfully sent the whole packet, account for it. */
c31a25e1db486f David Howells 2023-06-09 696 sk->sk_wmem_queued -= txm->sent;
c31a25e1db486f David Howells 2023-06-09 697 total_sent += txm->sent;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 698 skb_dequeue(&sk->sk_write_queue);
ab7ac4eb9832e3 Tom Herbert 2016-03-07 699 kfree_skb(head);
cd6e111bf5be5c Tom Herbert 2016-03-07 700 KCM_STATS_INCR(psock->stats.tx_msgs);
c31a25e1db486f David Howells 2023-06-09 701 }
ab7ac4eb9832e3 Tom Herbert 2016-03-07 702 out:
ab7ac4eb9832e3 Tom Herbert 2016-03-07 703 if (!head) {
ab7ac4eb9832e3 Tom Herbert 2016-03-07 704 /* Done with all queued messages. */
ab7ac4eb9832e3 Tom Herbert 2016-03-07 705 WARN_ON(!skb_queue_empty(&sk->sk_write_queue));
9f8d0dc0ec4a4b David Howells 2023-06-15 706 if (psock)
ab7ac4eb9832e3 Tom Herbert 2016-03-07 707 unreserve_psock(kcm);
ab7ac4eb9832e3 Tom Herbert 2016-03-07 708 }
ab7ac4eb9832e3 Tom Herbert 2016-03-07 709
ab7ac4eb9832e3 Tom Herbert 2016-03-07 710 /* Check if write space is available */
ab7ac4eb9832e3 Tom Herbert 2016-03-07 711 sk->sk_write_space(sk);
ab7ac4eb9832e3 Tom Herbert 2016-03-07 712
ab7ac4eb9832e3 Tom Herbert 2016-03-07 713 return total_sent ? : ret;
ab7ac4eb9832e3 Tom Herbert 2016-03-07 714 }
ab7ac4eb9832e3 Tom Herbert 2016-03-07 715

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki