[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <202509031855.54vuvsX1-lkp@intel.com>
Date: Wed, 3 Sep 2025 18:50:32 +0800
From: kernel test robot <lkp@...el.com>
To: Bobby Eshleman <bobbyeshleman@...il.com>,
"David S. Miller" <davem@...emloft.net>,
Eric Dumazet <edumazet@...gle.com>,
Jakub Kicinski <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com>,
Simon Horman <horms@...nel.org>,
Kuniyuki Iwashima <kuniyu@...gle.com>,
Willem de Bruijn <willemb@...gle.com>,
Neal Cardwell <ncardwell@...gle.com>,
David Ahern <dsahern@...nel.org>
Cc: oe-kbuild-all@...ts.linux.dev, netdev@...r.kernel.org,
linux-kernel@...r.kernel.org, Stanislav Fomichev <sdf@...ichev.me>,
Mina Almasry <almasrymina@...gle.com>,
Bobby Eshleman <bobbyeshleman@...a.com>
Subject: Re: [PATCH net-next 2/2] net: devmem: use niov array for token
management
Hi Bobby,
kernel test robot noticed the following build errors:
[auto build test ERROR on cd8a4cfa6bb43a441901e82f5c222dddc75a18a3]
url: https://github.com/intel-lab-lkp/linux/commits/Bobby-Eshleman/net-devmem-rename-tx_vec-to-vec-in-dmabuf-binding/20250903-054553
base: cd8a4cfa6bb43a441901e82f5c222dddc75a18a3
patch link: https://lore.kernel.org/r/20250902-scratch-bobbyeshleman-devmem-tcp-token-upstream-v1-2-d946169b5550%40meta.com
patch subject: [PATCH net-next 2/2] net: devmem: use niov array for token management
config: x86_64-defconfig (https://download.01.org/0day-ci/archive/20250903/202509031855.54vuvsX1-lkp@intel.com/config)
compiler: gcc-11 (Debian 11.3.0-12) 11.3.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250903/202509031855.54vuvsX1-lkp@intel.com/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@...el.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202509031855.54vuvsX1-lkp@intel.com/
All errors (new ones prefixed by >>):
net/ipv4/tcp.c: In function 'tcp_recvmsg_dmabuf':
>> net/ipv4/tcp.c:2502:41: error: implicit declaration of function 'net_devmem_dmabuf_binding_get'; did you mean 'net_devmem_dmabuf_binding_put'? [-Werror=implicit-function-declaration]
2502 | net_devmem_dmabuf_binding_get(binding);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| net_devmem_dmabuf_binding_put
cc1: some warnings being treated as errors
vim +2502 net/ipv4/tcp.c
2390
2391 /* On error, returns the -errno. On success, returns number of bytes sent to the
2392 * user. May not consume all of @remaining_len.
2393 */
2394 static int tcp_recvmsg_dmabuf(struct sock *sk, const struct sk_buff *skb,
2395 unsigned int offset, struct msghdr *msg,
2396 int remaining_len)
2397 {
2398 struct dmabuf_cmsg dmabuf_cmsg = { 0 };
2399 unsigned int start;
2400 int i, copy, n;
2401 int sent = 0;
2402 int err = 0;
2403
2404 do {
2405 start = skb_headlen(skb);
2406
2407 if (skb_frags_readable(skb)) {
2408 err = -ENODEV;
2409 goto out;
2410 }
2411
2412 /* Copy header. */
2413 copy = start - offset;
2414 if (copy > 0) {
2415 copy = min(copy, remaining_len);
2416
2417 n = copy_to_iter(skb->data + offset, copy,
2418 &msg->msg_iter);
2419 if (n != copy) {
2420 err = -EFAULT;
2421 goto out;
2422 }
2423
2424 offset += copy;
2425 remaining_len -= copy;
2426
2427 /* First a dmabuf_cmsg for # bytes copied to user
2428 * buffer.
2429 */
2430 memset(&dmabuf_cmsg, 0, sizeof(dmabuf_cmsg));
2431 dmabuf_cmsg.frag_size = copy;
2432 err = put_cmsg_notrunc(msg, SOL_SOCKET,
2433 SO_DEVMEM_LINEAR,
2434 sizeof(dmabuf_cmsg),
2435 &dmabuf_cmsg);
2436 if (err)
2437 goto out;
2438
2439 sent += copy;
2440
2441 if (remaining_len == 0)
2442 goto out;
2443 }
2444
2445 /* after that, send information of dmabuf pages through a
2446 * sequence of cmsg
2447 */
2448 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
2449 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
2450 struct net_devmem_dmabuf_binding *binding;
2451 struct net_iov *niov;
2452 u64 frag_offset;
2453 size_t size;
2454 u32 token;
2455 int end;
2456
2457 /* !skb_frags_readable() should indicate that ALL the
2458 * frags in this skb are dmabuf net_iovs. We're checking
2459 * for that flag above, but also check individual frags
2460 * here. If the tcp stack is not setting
2461 * skb_frags_readable() correctly, we still don't want
2462 * to crash here.
2463 */
2464 if (!skb_frag_net_iov(frag)) {
2465 net_err_ratelimited("Found non-dmabuf skb with net_iov");
2466 err = -ENODEV;
2467 goto out;
2468 }
2469
2470 niov = skb_frag_net_iov(frag);
2471 if (!net_is_devmem_iov(niov)) {
2472 err = -ENODEV;
2473 goto out;
2474 }
2475
2476 end = start + skb_frag_size(frag);
2477 copy = end - offset;
2478
2479 if (copy > 0) {
2480 copy = min(copy, remaining_len);
2481
2482 frag_offset = net_iov_virtual_addr(niov) +
2483 skb_frag_off(frag) + offset -
2484 start;
2485 dmabuf_cmsg.frag_offset = frag_offset;
2486 dmabuf_cmsg.frag_size = copy;
2487
2488 binding = net_devmem_iov_binding(niov);
2489
2490 if (!sk->sk_user_frags.binding) {
2491 sk->sk_user_frags.binding = binding;
2492
2493 size = binding->dmabuf->size / PAGE_SIZE;
2494 sk->sk_user_frags.urefs = kzalloc(size,
2495 GFP_KERNEL);
2496 if (!sk->sk_user_frags.urefs) {
2497 sk->sk_user_frags.binding = NULL;
2498 err = -ENOMEM;
2499 goto out;
2500 }
2501
> 2502 net_devmem_dmabuf_binding_get(binding);
2503 }
2504
2505 if (WARN_ONCE(sk->sk_user_frags.binding != binding,
2506 "binding changed for devmem socket")) {
2507 err = -EFAULT;
2508 goto out;
2509 }
2510
2511 token = net_iov_virtual_addr(niov) >> PAGE_SHIFT;
2512 binding->vec[token] = niov;
2513 dmabuf_cmsg.frag_token = token;
2514
2515 /* Will perform the exchange later */
2516 dmabuf_cmsg.dmabuf_id = net_devmem_iov_binding_id(niov);
2517
2518 offset += copy;
2519 remaining_len -= copy;
2520
2521 err = put_cmsg_notrunc(msg, SOL_SOCKET,
2522 SO_DEVMEM_DMABUF,
2523 sizeof(dmabuf_cmsg),
2524 &dmabuf_cmsg);
2525 if (err)
2526 goto out;
2527
2528 atomic_inc(&sk->sk_user_frags.urefs[token]);
2529
2530 atomic_long_inc(&niov->pp_ref_count);
2531
2532 sent += copy;
2533
2534 if (remaining_len == 0)
2535 goto out;
2536 }
2537 start = end;
2538 }
2539
2540 if (!remaining_len)
2541 goto out;
2542
2543 /* if remaining_len is not satisfied yet, we need to go to the
2544 * next frag in the frag_list to satisfy remaining_len.
2545 */
2546 skb = skb_shinfo(skb)->frag_list ?: skb->next;
2547
2548 offset = offset - start;
2549 } while (skb);
2550
2551 if (remaining_len) {
2552 err = -EFAULT;
2553 goto out;
2554 }
2555
2556 out:
2557 if (!sent)
2558 sent = err;
2559
2560 return sent;
2561 }
2562
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Powered by blists - more mailing lists