lib/tests/list-test.c
Source file repositories/reference/linux-study-clean/lib/tests/list-test.c
File Facts
- System
- Linux kernel
- Corpus path
lib/tests/list-test.c- Extension
.c- Size
- 36133 bytes
- Lines
- 1506
- Domain
- Kernel Services
- Bucket
- lib
- Inferred role
- Kernel Services: implementation source
- Status
- source implementation candidate
Why This File Exists
Shared kernel service surface used by multiple subsystems, including helpers, cryptography, virtualization support, and async I/O infrastructure.
- Shared kernel service surface used by multiple subsystems, including helpers, cryptography, virtualization support, and async I/O infrastructure.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
kunit/test.hlinux/list.hlinux/klist.h
Detected Declarations
struct list_test_structstruct hlist_test_structfunction list_test_list_initfunction list_test_list_addfunction list_test_list_add_tailfunction list_test_list_delfunction list_test_list_replacefunction list_test_list_replace_initfunction list_test_list_swapfunction list_test_list_del_initfunction list_test_list_del_init_carefulfunction list_test_list_movefunction list_test_list_move_tailfunction list_test_list_bulk_move_tailfunction list_for_eachfunction list_test_list_is_headfunction list_test_list_is_firstfunction list_test_list_is_lastfunction list_test_list_emptyfunction list_test_list_empty_carefulfunction list_test_list_rotate_leftfunction list_test_list_rotate_to_frontfunction list_for_eachfunction list_test_list_is_singularfunction list_test_list_cut_positionfunction list_for_eachfunction list_for_eachfunction list_test_list_cut_beforefunction list_for_eachfunction list_for_eachfunction list_test_list_splicefunction list_for_eachfunction list_test_list_splice_tailfunction list_for_eachfunction list_test_list_splice_initfunction list_for_eachfunction list_test_list_splice_tail_initfunction list_for_eachfunction list_test_list_entryfunction list_test_list_entry_is_headfunction list_test_list_first_entryfunction list_test_list_last_entryfunction list_test_list_first_entry_or_nullfunction list_test_list_next_entryfunction list_test_list_prev_entryfunction list_test_list_for_eachfunction list_for_eachfunction list_test_list_for_each_prev
Annotated Snippet
struct list_test_struct {
int data;
struct list_head list;
};
static void list_test_list_init(struct kunit *test)
{
/* Test the different ways of initialising a list. */
struct list_head list1 = LIST_HEAD_INIT(list1);
struct list_head list2;
LIST_HEAD(list3);
struct list_head *list4;
struct list_head *list5;
INIT_LIST_HEAD(&list2);
list4 = kzalloc_obj(*list4, GFP_KERNEL | __GFP_NOFAIL);
INIT_LIST_HEAD(list4);
list5 = kmalloc_obj(*list5, GFP_KERNEL | __GFP_NOFAIL);
memset(list5, 0xFF, sizeof(*list5));
INIT_LIST_HEAD(list5);
/* list_empty_careful() checks both next and prev. */
KUNIT_EXPECT_TRUE(test, list_empty_careful(&list1));
KUNIT_EXPECT_TRUE(test, list_empty_careful(&list2));
KUNIT_EXPECT_TRUE(test, list_empty_careful(&list3));
KUNIT_EXPECT_TRUE(test, list_empty_careful(list4));
KUNIT_EXPECT_TRUE(test, list_empty_careful(list5));
kfree(list4);
kfree(list5);
}
static void list_test_list_add(struct kunit *test)
{
struct list_head a, b;
LIST_HEAD(list);
list_add(&a, &list);
list_add(&b, &list);
/* should be [list] -> b -> a */
KUNIT_EXPECT_PTR_EQ(test, list.next, &b);
KUNIT_EXPECT_PTR_EQ(test, b.prev, &list);
KUNIT_EXPECT_PTR_EQ(test, b.next, &a);
}
static void list_test_list_add_tail(struct kunit *test)
{
struct list_head a, b;
LIST_HEAD(list);
list_add_tail(&a, &list);
list_add_tail(&b, &list);
/* should be [list] -> a -> b */
KUNIT_EXPECT_PTR_EQ(test, list.next, &a);
KUNIT_EXPECT_PTR_EQ(test, a.prev, &list);
KUNIT_EXPECT_PTR_EQ(test, a.next, &b);
}
static void list_test_list_del(struct kunit *test)
{
struct list_head a, b;
LIST_HEAD(list);
list_add_tail(&a, &list);
list_add_tail(&b, &list);
/* before: [list] -> a -> b */
list_del(&a);
/* now: [list] -> b */
KUNIT_EXPECT_PTR_EQ(test, list.next, &b);
KUNIT_EXPECT_PTR_EQ(test, b.prev, &list);
}
static void list_test_list_replace(struct kunit *test)
{
struct list_head a_old, a_new, b;
LIST_HEAD(list);
list_add_tail(&a_old, &list);
list_add_tail(&b, &list);
/* before: [list] -> a_old -> b */
list_replace(&a_old, &a_new);
/* now: [list] -> a_new -> b */
Annotation
- Immediate include surface: `kunit/test.h`, `linux/list.h`, `linux/klist.h`.
- Detected declarations: `struct list_test_struct`, `struct hlist_test_struct`, `function list_test_list_init`, `function list_test_list_add`, `function list_test_list_add_tail`, `function list_test_list_del`, `function list_test_list_replace`, `function list_test_list_replace_init`, `function list_test_list_swap`, `function list_test_list_del_init`.
- Atlas domain: Kernel Services / lib.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.