Re: [PATCH v3] mm, slub: change run-time assertion in kmalloc_index() to compile-time
From: Hyeonggon Yoo <hidden>
Date: 2021-05-13 03:12:29
Also in:
lkml
On Wed, May 12, 2021 at 07:52:27PM -0700, Andrew Morton wrote:
quoted hunk ↗ jump to hunk
This explodes in mysterious ways. The patch as I have it is appended, for reference. gcc-10.3.0 allmodconfig. This patch suppresses the error:--- a/mm/kfence/kfence_test.c~a +++ a/mm/kfence/kfence_test.c@@ -318,13 +318,13 @@ static void test_out_of_bounds_read(stru /* Test both sides. */ - buf = test_alloc(test, size, GFP_KERNEL, ALLOCATE_LEFT); + buf = test_alloc(test, 32, GFP_KERNEL, ALLOCATE_LEFT); expect.addr = buf - 1; READ_ONCE(*expect.addr); KUNIT_EXPECT_TRUE(test, report_matches(&expect)); test_free(buf); - buf = test_alloc(test, size, GFP_KERNEL, ALLOCATE_RIGHT); + buf = test_alloc(test, 32, GFP_KERNEL, ALLOCATE_RIGHT); expect.addr = buf + size; READ_ONCE(*expect.addr); KUNIT_EXPECT_TRUE(test, report_matches(&expect));@@ -519,11 +519,11 @@ static void test_free_bulk(struct kunit const size_t size = setup_test_cache(test, 8 + prandom_u32_max(300), 0, (iter & 1) ? ctor_set_x : NULL); void *objects[] = { - test_alloc(test, size, GFP_KERNEL, ALLOCATE_RIGHT), - test_alloc(test, size, GFP_KERNEL, ALLOCATE_NONE), - test_alloc(test, size, GFP_KERNEL, ALLOCATE_LEFT), - test_alloc(test, size, GFP_KERNEL, ALLOCATE_NONE), - test_alloc(test, size, GFP_KERNEL, ALLOCATE_NONE), + test_alloc(test, 32, GFP_KERNEL, ALLOCATE_RIGHT), + test_alloc(test, 32, GFP_KERNEL, ALLOCATE_NONE), + test_alloc(test, 32, GFP_KERNEL, ALLOCATE_LEFT), + test_alloc(test, 32, GFP_KERNEL, ALLOCATE_NONE), + test_alloc(test, 32, GFP_KERNEL, ALLOCATE_NONE), }; kmem_cache_free_bulk(test_cache, ARRAY_SIZE(objects), objects);Is gcc-10.3.0 simply confused? test_out_of_bounds_read() is clearly calling kmalloc_index(32) which is OK. Anyway, I'll drop this patch for now so I can compile a kernel!
The error messages isn't so clear to me. but one problem I can see is in kfence_test.c, there are many places that are using size which is not constant. in kmalloc if size is not constant, it calls dummy function __kmalloc which does not make use of size.