forked from mirrors/linux
		
	make allmodconfig && make W=1 C=1 reports for lib/test_*.ko: WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_hexdump.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_dhry.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_firmware.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_sysctl.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_hash.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_ida.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_list_sort.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_min_heap.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_module.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_sort.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_static_keys.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_static_key_base.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_memcat_p.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_blackhole_dev.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_meminit.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_free_pages.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_kprobes.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_ref_tracker.o WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_bits.o Add the missing invocations of the MODULE_DESCRIPTION() macro. Link: https://lkml.kernel.org/r/20240619-md-lib-test-v2-1-301e30eeba1e@quicinc.com Signed-off-by: Jeff Johnson <quic_jjohnson@quicinc.com> Reviewed-by: Kees Cook <kees@kernel.org> Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> Cc: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> Cc: "David S. Miller" <davem@davemloft.net> Cc: Masami Hiramatsu (Google) <mhiramat@kernel.org> Cc: "Naveen N. Rao" <naveen.n.rao@linux.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
		
			
				
	
	
		
			123 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0-only
 | 
						|
#include <kunit/test.h>
 | 
						|
 | 
						|
#include <linux/kernel.h>
 | 
						|
#include <linux/list_sort.h>
 | 
						|
#include <linux/list.h>
 | 
						|
#include <linux/module.h>
 | 
						|
#include <linux/printk.h>
 | 
						|
#include <linux/slab.h>
 | 
						|
#include <linux/random.h>
 | 
						|
 | 
						|
/*
 | 
						|
 * The pattern of set bits in the list length determines which cases
 | 
						|
 * are hit in list_sort().
 | 
						|
 */
 | 
						|
#define TEST_LIST_LEN (512+128+2) /* not including head */
 | 
						|
 | 
						|
#define TEST_POISON1 0xDEADBEEF
 | 
						|
#define TEST_POISON2 0xA324354C
 | 
						|
 | 
						|
struct debug_el {
 | 
						|
	unsigned int poison1;
 | 
						|
	struct list_head list;
 | 
						|
	unsigned int poison2;
 | 
						|
	int value;
 | 
						|
	unsigned int serial;
 | 
						|
};
 | 
						|
 | 
						|
static void check(struct kunit *test, struct debug_el *ela, struct debug_el *elb)
 | 
						|
{
 | 
						|
	struct debug_el **elts = test->priv;
 | 
						|
 | 
						|
	KUNIT_EXPECT_LT_MSG(test, ela->serial, (unsigned int)TEST_LIST_LEN, "incorrect serial");
 | 
						|
	KUNIT_EXPECT_LT_MSG(test, elb->serial, (unsigned int)TEST_LIST_LEN, "incorrect serial");
 | 
						|
 | 
						|
	KUNIT_EXPECT_PTR_EQ_MSG(test, elts[ela->serial], ela, "phantom element");
 | 
						|
	KUNIT_EXPECT_PTR_EQ_MSG(test, elts[elb->serial], elb, "phantom element");
 | 
						|
 | 
						|
	KUNIT_EXPECT_EQ_MSG(test, ela->poison1, TEST_POISON1, "bad poison");
 | 
						|
	KUNIT_EXPECT_EQ_MSG(test, ela->poison2, TEST_POISON2, "bad poison");
 | 
						|
 | 
						|
	KUNIT_EXPECT_EQ_MSG(test, elb->poison1, TEST_POISON1, "bad poison");
 | 
						|
	KUNIT_EXPECT_EQ_MSG(test, elb->poison2, TEST_POISON2, "bad poison");
 | 
						|
}
 | 
						|
 | 
						|
/* `priv` is the test pointer so check() can fail the test if the list is invalid. */
 | 
						|
static int cmp(void *priv, const struct list_head *a, const struct list_head *b)
 | 
						|
{
 | 
						|
	struct debug_el *ela, *elb;
 | 
						|
 | 
						|
	ela = container_of(a, struct debug_el, list);
 | 
						|
	elb = container_of(b, struct debug_el, list);
 | 
						|
 | 
						|
	check(priv, ela, elb);
 | 
						|
	return ela->value - elb->value;
 | 
						|
}
 | 
						|
 | 
						|
static void list_sort_test(struct kunit *test)
 | 
						|
{
 | 
						|
	int i, count = 1;
 | 
						|
	struct debug_el *el, **elts;
 | 
						|
	struct list_head *cur;
 | 
						|
	LIST_HEAD(head);
 | 
						|
 | 
						|
	elts = kunit_kcalloc(test, TEST_LIST_LEN, sizeof(*elts), GFP_KERNEL);
 | 
						|
	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, elts);
 | 
						|
	test->priv = elts;
 | 
						|
 | 
						|
	for (i = 0; i < TEST_LIST_LEN; i++) {
 | 
						|
		el = kunit_kmalloc(test, sizeof(*el), GFP_KERNEL);
 | 
						|
		KUNIT_ASSERT_NOT_ERR_OR_NULL(test, el);
 | 
						|
 | 
						|
		 /* force some equivalencies */
 | 
						|
		el->value = get_random_u32_below(TEST_LIST_LEN / 3);
 | 
						|
		el->serial = i;
 | 
						|
		el->poison1 = TEST_POISON1;
 | 
						|
		el->poison2 = TEST_POISON2;
 | 
						|
		elts[i] = el;
 | 
						|
		list_add_tail(&el->list, &head);
 | 
						|
	}
 | 
						|
 | 
						|
	list_sort(test, &head, cmp);
 | 
						|
 | 
						|
	for (cur = head.next; cur->next != &head; cur = cur->next) {
 | 
						|
		struct debug_el *el1;
 | 
						|
		int cmp_result;
 | 
						|
 | 
						|
		KUNIT_ASSERT_PTR_EQ_MSG(test, cur->next->prev, cur,
 | 
						|
					"list is corrupted");
 | 
						|
 | 
						|
		cmp_result = cmp(test, cur, cur->next);
 | 
						|
		KUNIT_ASSERT_LE_MSG(test, cmp_result, 0, "list is not sorted");
 | 
						|
 | 
						|
		el = container_of(cur, struct debug_el, list);
 | 
						|
		el1 = container_of(cur->next, struct debug_el, list);
 | 
						|
		if (cmp_result == 0) {
 | 
						|
			KUNIT_ASSERT_LE_MSG(test, el->serial, el1->serial,
 | 
						|
					    "order of equivalent elements not preserved");
 | 
						|
		}
 | 
						|
 | 
						|
		check(test, el, el1);
 | 
						|
		count++;
 | 
						|
	}
 | 
						|
	KUNIT_EXPECT_PTR_EQ_MSG(test, head.prev, cur, "list is corrupted");
 | 
						|
 | 
						|
	KUNIT_EXPECT_EQ_MSG(test, count, TEST_LIST_LEN,
 | 
						|
			    "list length changed after sorting!");
 | 
						|
}
 | 
						|
 | 
						|
static struct kunit_case list_sort_cases[] = {
 | 
						|
	KUNIT_CASE(list_sort_test),
 | 
						|
	{}
 | 
						|
};
 | 
						|
 | 
						|
static struct kunit_suite list_sort_suite = {
 | 
						|
	.name = "list_sort",
 | 
						|
	.test_cases = list_sort_cases,
 | 
						|
};
 | 
						|
 | 
						|
kunit_test_suites(&list_sort_suite);
 | 
						|
 | 
						|
MODULE_DESCRIPTION("list_sort() KUnit test suite");
 | 
						|
MODULE_LICENSE("GPL");
 |