drivers/char/misc_minor_kunit.c
Source file repositories/reference/linux-study-clean/drivers/char/misc_minor_kunit.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/char/misc_minor_kunit.c- Extension
.c- Size
- 16785 bytes
- Lines
- 690
- Domain
- Driver Families
- Bucket
- drivers/char
- Inferred role
- Driver Families: operation-table or driver-model contract
- Status
- pattern implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Defines an operation table; this is where Linux turns generic core objects into subsystem-specific behavior.
- 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.hkunit/test-bug.hlinux/module.hlinux/miscdevice.hlinux/fs.hlinux/file.hlinux/init_syscalls.h
Detected Declarations
struct miscdev_test_casefunction kunit_static_minorfunction kunit_misc_dynamic_minorfunction miscdev_find_minorsfunction is_valid_dynamic_minorfunction miscdev_test_openfunction miscdev_test_can_openfunction miscdev_test_static_basicfunction miscdev_test_dynamic_basicfunction miscdev_test_twicefunction miscdev_test_duplicate_minorfunction miscdev_test_duplicate_namefunction miscdev_test_duplicate_name_leakfunction miscdev_test_duplicate_errorfunction miscdev_test_dynamic_only_rangefunction miscdev_test_collisionfunction miscdev_test_collision_reversefunction miscdev_test_conflictfunction miscdev_test_conflict_reversefunction miscdev_test_invalid_inputfunction miscdev_test_dynamic_reentry
Annotated Snippet
static const struct file_operations miscdev_test_fops = {
.open = miscdev_test_open,
};
static void __init miscdev_test_can_open(struct kunit *test, struct miscdevice *misc)
{
int ret;
struct file *filp;
char *devname;
devname = kasprintf(GFP_KERNEL, "/dev/%s", misc->name);
ret = init_mknod(devname, S_IFCHR | 0600,
new_encode_dev(MKDEV(MISC_MAJOR, misc->minor)));
if (ret != 0)
KUNIT_FAIL(test, "failed to create node\n");
filp = filp_open(devname, O_RDONLY, 0);
if (IS_ERR(filp))
KUNIT_FAIL(test, "failed to open misc device: %ld\n", PTR_ERR(filp));
else
fput(filp);
init_unlink(devname);
kfree(devname);
}
static void __init miscdev_test_static_basic(struct kunit *test)
{
struct miscdevice misc_test = {
.name = "misc_test",
.fops = &miscdev_test_fops,
};
int ret;
const struct miscdev_test_case *params = test->param_value;
misc_test.minor = params->minor;
ret = misc_register(&misc_test);
KUNIT_EXPECT_EQ(test, ret, 0);
KUNIT_EXPECT_EQ(test, misc_test.minor, params->minor);
if (ret == 0) {
miscdev_test_can_open(test, &misc_test);
misc_deregister(&misc_test);
}
}
static void __init miscdev_test_dynamic_basic(struct kunit *test)
{
struct miscdevice misc_test = {
.minor = MISC_DYNAMIC_MINOR,
.name = "misc_test",
.fops = &miscdev_test_fops,
};
int ret;
ret = misc_register(&misc_test);
KUNIT_EXPECT_EQ(test, ret, 0);
KUNIT_EXPECT_TRUE(test, is_valid_dynamic_minor(misc_test.minor));
if (ret == 0) {
miscdev_test_can_open(test, &misc_test);
misc_deregister(&misc_test);
}
}
static void miscdev_test_twice(struct kunit *test)
{
struct miscdevice misc_test = {
.name = "misc_test",
.fops = &miscdev_test_fops,
};
int ret;
const struct miscdev_test_case *params = test->param_value;
misc_test.minor = params->minor;
ret = misc_register(&misc_test);
KUNIT_EXPECT_EQ(test, ret, 0);
KUNIT_EXPECT_EQ(test, misc_test.minor, params->minor);
if (ret == 0)
misc_deregister(&misc_test);
ret = misc_register(&misc_test);
KUNIT_EXPECT_EQ(test, ret, 0);
KUNIT_EXPECT_EQ(test, misc_test.minor, params->minor);
if (ret == 0)
misc_deregister(&misc_test);
}
Annotation
- Immediate include surface: `kunit/test.h`, `kunit/test-bug.h`, `linux/module.h`, `linux/miscdevice.h`, `linux/fs.h`, `linux/file.h`, `linux/init_syscalls.h`.
- Detected declarations: `struct miscdev_test_case`, `function kunit_static_minor`, `function kunit_misc_dynamic_minor`, `function miscdev_find_minors`, `function is_valid_dynamic_minor`, `function miscdev_test_open`, `function miscdev_test_can_open`, `function miscdev_test_static_basic`, `function miscdev_test_dynamic_basic`, `function miscdev_test_twice`.
- Atlas domain: Driver Families / drivers/char.
- Implementation status: pattern 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.