Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: gso_test: support CONFIG_MAX_SKB_FRAGS up to 45

The test allocs a single page to hold all the frag_list skbs. This
is insufficient on kernels with CONFIG_MAX_SKB_FRAGS=45, due to the
increased skb_shared_info frags[] array length.

gso_test_func: ASSERTION FAILED at net/core/gso_test.c:210
Expected alloc_size <= ((1UL) << 12), but
alloc_size == 5075 (0x13d3)
((1UL) << 12) == 4096 (0x1000)

Simplify the logic. Just allocate a page for each frag_list skb.

Fixes: 4688ecb1385f ("net: expand skb_segment unit test with frag_list coverage")
Signed-off-by: Willem de Bruijn <willemb@google.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Willem de Bruijn and committed by
David S. Miller
e6daf129 438cbcdf

+5 -9
+5 -9
net/core/gso_test.c
··· 180 180 } 181 181 182 182 if (tcase->frag_skbs) { 183 - unsigned int total_size = 0, total_true_size = 0, alloc_size = 0; 183 + unsigned int total_size = 0, total_true_size = 0; 184 184 struct sk_buff *frag_skb, *prev = NULL; 185 - 186 - page = alloc_page(GFP_KERNEL); 187 - KUNIT_ASSERT_NOT_NULL(test, page); 188 - page_ref_add(page, tcase->nr_frag_skbs - 1); 189 185 190 186 for (i = 0; i < tcase->nr_frag_skbs; i++) { 191 187 unsigned int frag_size; 192 188 189 + page = alloc_page(GFP_KERNEL); 190 + KUNIT_ASSERT_NOT_NULL(test, page); 191 + 193 192 frag_size = tcase->frag_skbs[i]; 194 - frag_skb = build_skb(page_address(page) + alloc_size, 193 + frag_skb = build_skb(page_address(page), 195 194 frag_size + shinfo_size); 196 195 KUNIT_ASSERT_NOT_NULL(test, frag_skb); 197 196 __skb_put(frag_skb, frag_size); ··· 203 204 204 205 total_size += frag_size; 205 206 total_true_size += frag_skb->truesize; 206 - alloc_size += frag_size + shinfo_size; 207 207 } 208 - 209 - KUNIT_ASSERT_LE(test, alloc_size, PAGE_SIZE); 210 208 211 209 skb->len += total_size; 212 210 skb->data_len += total_size;