Hi Bobby, 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/Bobby-Eshleman/net-devmem-refactor-sock_devmem_dontneed-for-autorelease-split/20260108-095740 base: net-next/main patch link: https://lore.kernel.org/r/20260107-scratch-bobbyeshleman-devmem-tcp-token-upstream-v8-3-92c968631496%40meta.com patch subject: [PATCH net-next v8 3/5] net: devmem: implement autorelease token management config: openrisc-defconfig (https://download.01.org/0day-ci/archive/20260109/[email protected]/config) compiler: or1k-linux-gcc (GCC) 15.1.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260109/[email protected]/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 <[email protected]> | Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/ All errors (new ones prefixed by >>): net/ipv4/tcp.c: In function 'tcp_recvmsg_dmabuf': >> net/ipv4/tcp.c:2600:41: error: implicit declaration of function >> 'net_devmem_dmabuf_binding_get'; did you mean >> 'net_devmem_dmabuf_binding_put'? [-Wimplicit-function-declaration] 2600 | net_devmem_dmabuf_binding_get(binding); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | net_devmem_dmabuf_binding_put vim +2600 net/ipv4/tcp.c 2498 2499 /* On error, returns the -errno. On success, returns number of bytes sent to the 2500 * user. May not consume all of @remaining_len. 2501 */ 2502 static int tcp_recvmsg_dmabuf(struct sock *sk, const struct sk_buff *skb, 2503 unsigned int offset, struct msghdr *msg, 2504 int remaining_len) 2505 { 2506 struct dmabuf_cmsg dmabuf_cmsg = { 0 }; 2507 struct tcp_xa_pool tcp_xa_pool; 2508 unsigned int start; 2509 int i, copy, n; 2510 int sent = 0; 2511 int err = 0; 2512 2513 tcp_xa_pool.max = 0; 2514 tcp_xa_pool.idx = 0; 2515 do { 2516 start = skb_headlen(skb); 2517 2518 if (skb_frags_readable(skb)) { 2519 err = -ENODEV; 2520 goto out; 2521 } 2522 2523 /* Copy header. */ 2524 copy = start - offset; 2525 if (copy > 0) { 2526 copy = min(copy, remaining_len); 2527 2528 n = copy_to_iter(skb->data + offset, copy, 2529 &msg->msg_iter); 2530 if (n != copy) { 2531 err = -EFAULT; 2532 goto out; 2533 } 2534 2535 offset += copy; 2536 remaining_len -= copy; 2537 2538 /* First a dmabuf_cmsg for # bytes copied to user 2539 * buffer. 2540 */ 2541 memset(&dmabuf_cmsg, 0, sizeof(dmabuf_cmsg)); 2542 dmabuf_cmsg.frag_size = copy; 2543 err = put_cmsg_notrunc(msg, SOL_SOCKET, 2544 SO_DEVMEM_LINEAR, 2545 sizeof(dmabuf_cmsg), 2546 &dmabuf_cmsg); 2547 if (err) 2548 goto out; 2549 2550 sent += copy; 2551 2552 if (remaining_len == 0) 2553 goto out; 2554 } 2555 2556 /* after that, send information of dmabuf pages through a 2557 * sequence of cmsg 2558 */ 2559 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { 2560 struct net_devmem_dmabuf_binding *binding = NULL; 2561 skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; 2562 struct net_iov *niov; 2563 u64 frag_offset; 2564 int end; 2565 2566 /* !skb_frags_readable() should indicate that ALL the 2567 * frags in this skb are dmabuf net_iovs. We're checking 2568 * for that flag above, but also check individual frags 2569 * here. If the tcp stack is not setting 2570 * skb_frags_readable() correctly, we still don't want 2571 * to crash here. 2572 */ 2573 if (!skb_frag_net_iov(frag)) { 2574 net_err_ratelimited("Found non-dmabuf skb with net_iov"); 2575 err = -ENODEV; 2576 goto out; 2577 } 2578 2579 niov = skb_frag_net_iov(frag); 2580 if (!net_is_devmem_iov(niov)) { 2581 err = -ENODEV; 2582 goto out; 2583 } 2584 2585 end = start + skb_frag_size(frag); 2586 copy = end - offset; 2587 2588 if (copy > 0) { 2589 copy = min(copy, remaining_len); 2590 2591 frag_offset = net_iov_virtual_addr(niov) + 2592 skb_frag_off(frag) + offset - 2593 start; 2594 dmabuf_cmsg.frag_offset = frag_offset; 2595 dmabuf_cmsg.frag_size = copy; 2596 2597 binding = net_devmem_iov_binding(niov); 2598 2599 if (!sk->sk_devmem_info.binding) { > 2600 > net_devmem_dmabuf_binding_get(binding); 2601 sk->sk_devmem_info.binding = binding; 2602 } 2603 2604 if (sk->sk_devmem_info.binding != binding) { 2605 err = -EFAULT; 2606 goto out; 2607 } 2608 2609 if (static_branch_unlikely(&tcp_devmem_ar_key)) { 2610 err = tcp_xa_pool_refill(sk, 2611 &tcp_xa_pool, 2612 skb_shinfo(skb)->nr_frags - i); 2613 if (err) 2614 goto out; 2615 2616 dmabuf_cmsg.frag_token = 2617 tcp_xa_pool.tokens[tcp_xa_pool.idx]; 2618 } else { 2619 dmabuf_cmsg.frag_token = 2620 net_iov_virtual_addr(niov) >> PAGE_SHIFT; 2621 } 2622 2623 2624 /* Will perform the exchange later */ 2625 dmabuf_cmsg.dmabuf_id = net_devmem_iov_binding_id(niov); 2626 2627 offset += copy; 2628 remaining_len -= copy; 2629 2630 err = put_cmsg_notrunc(msg, SOL_SOCKET, 2631 SO_DEVMEM_DMABUF, 2632 sizeof(dmabuf_cmsg), 2633 &dmabuf_cmsg); 2634 if (err) 2635 goto out; 2636 2637 tcp_xa_pool_inc_pp_ref_count(&tcp_xa_pool, frag); 2638 2639 sent += copy; 2640 2641 if (remaining_len == 0) 2642 goto out; 2643 } 2644 start = end; 2645 } 2646 2647 tcp_xa_pool_commit(sk, &tcp_xa_pool); 2648 if (!remaining_len) 2649 goto out; 2650 2651 /* if remaining_len is not satisfied yet, we need to go to the 2652 * next frag in the frag_list to satisfy remaining_len. 2653 */ 2654 skb = skb_shinfo(skb)->frag_list ?: skb->next; 2655 2656 offset = offset - start; 2657 } while (skb); 2658 2659 if (remaining_len) { 2660 err = -EFAULT; 2661 goto out; 2662 } 2663 2664 out: 2665 tcp_xa_pool_commit(sk, &tcp_xa_pool); 2666 if (!sent) 2667 sent = err; 2668 2669 return sent; 2670 } 2671 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
