Re: [PATCH v1 net 3/3] selftest: net: Check wraparounds for sk->sk_rmem_alloc.
From: Kuniyuki Iwashima <hidden>
Date: 2025-03-24 18:26:33
From: Willem de Bruijn <willemdebruijn.kernel@gmail.com> Date: Mon, 24 Mar 2025 11:58:06 -0400
quoted
+TEST_F(so_rcvbuf, rmem_max) +{ + char buf[16] = {}; + int ret, i; + + create_socketpair(_metadata, self, variant); + + ret = setsockopt(self->server, SOL_SOCKET, SO_RCVBUFFORCE, + &(int){INT_MAX}, sizeof(int)); + ASSERT_EQ(ret, 0); + + ASSERT_EQ(get_prot_pages(_metadata, variant), 0); + + for (i = 1; ; i++) { + ret = send(self->client, buf, sizeof(buf), 0); + ASSERT_EQ(ret, sizeof(buf)); + + if (i % 10000 == 0) { + int pages = get_prot_pages(_metadata, variant); + + /* sk_rmem_alloc wrapped around too much ? */ + ASSERT_LE(pages, *variant->max_pages); + + if (pages == *variant->max_pages) + break;Does correctness depend here on max_pages being a multiple of 10K?
10K may be too conservative, but at least we need to ensure that the size of accumulated skbs exceeds 1 PAGE_SIZE to fail on the ASSERT_LE(), otherwise we can't detect the multiple wraparounds even without patch 1. The later sleep for call_rcu() was dominant than this loop on my machine. Thanks!