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

Configure Feed

Select the types of activity you want to include in your feed.

char: misc: Add a case to test registering miscdevice again without reinitialization

For miscdevice who wants dynamic minor, add a cast to test if it can be
successfully registered again without reinitialization:

1) Provide Both miscdevice @dev_A and @dev_B want to request dynamic
minor by initializing their minor to MISC_DYNAMIC_MINOR.

2) Register then de-register @dev_A.

3) Register @dev_B.

4) Register @dev_A again without reinitialization.

5) Check if @dev_A can be successfully registered.

Signed-off-by: Zijun Hu <zijun.hu@oss.qualcomm.com>
Link: https://lore.kernel.org/r/20250714-rfc_miscdev-v6-4-2ed949665bde@oss.qualcomm.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Zijun Hu and committed by
Greg Kroah-Hartman
2334668a f5597840

+44
+44
drivers/char/misc_minor_kunit.c
··· 602 602 misc_deregister(&misc_test); 603 603 } 604 604 605 + /* 606 + * Verify if @miscdyn_a can still be registered successfully without 607 + * reinitialization even if its minor ever owned was requested by 608 + * another miscdevice such as @miscdyn_b. 609 + */ 610 + static void miscdev_test_dynamic_reentry(struct kunit *test) 611 + { 612 + struct miscdevice miscdyn_a = { 613 + .name = "miscdyn_a", 614 + .minor = MISC_DYNAMIC_MINOR, 615 + .fops = &miscdev_test_fops, 616 + }; 617 + struct miscdevice miscdyn_b = { 618 + .name = "miscdyn_b", 619 + .minor = MISC_DYNAMIC_MINOR, 620 + .fops = &miscdev_test_fops, 621 + }; 622 + int ret, minor_a; 623 + 624 + ret = misc_register(&miscdyn_a); 625 + KUNIT_ASSERT_EQ(test, ret, 0); 626 + KUNIT_EXPECT_TRUE(test, is_valid_dynamic_minor(miscdyn_a.minor)); 627 + minor_a = miscdyn_a.minor; 628 + if (ret != 0) 629 + return; 630 + misc_deregister(&miscdyn_a); 631 + 632 + ret = misc_register(&miscdyn_b); 633 + KUNIT_ASSERT_EQ(test, ret, 0); 634 + KUNIT_EXPECT_EQ(test, miscdyn_b.minor, minor_a); 635 + if (ret != 0) 636 + return; 637 + 638 + ret = misc_register(&miscdyn_a); 639 + KUNIT_ASSERT_EQ(test, ret, 0); 640 + KUNIT_EXPECT_TRUE(test, is_valid_dynamic_minor(miscdyn_a.minor)); 641 + KUNIT_EXPECT_NE(test, miscdyn_a.minor, miscdyn_b.minor); 642 + if (ret == 0) 643 + misc_deregister(&miscdyn_a); 644 + 645 + misc_deregister(&miscdyn_b); 646 + } 647 + 605 648 static struct kunit_case test_cases[] = { 606 649 KUNIT_CASE(kunit_static_minor), 607 650 KUNIT_CASE(kunit_misc_dynamic_minor), ··· 654 611 KUNIT_CASE(miscdev_test_duplicate_name), 655 612 KUNIT_CASE(miscdev_test_duplicate_name_leak), 656 613 KUNIT_CASE_PARAM(miscdev_test_duplicate_error, miscdev_gen_params), 614 + KUNIT_CASE(miscdev_test_dynamic_reentry), 657 615 {} 658 616 }; 659 617