1*501cbbd2SBill Wendling // SPDX-License-Identifier: GPL-2.0-only 2*501cbbd2SBill Wendling #include <kunit/test.h> 3*501cbbd2SBill Wendling #include <linux/fdtable.h> 4*501cbbd2SBill Wendling #include <linux/file.h> 5*501cbbd2SBill Wendling 6*501cbbd2SBill Wendling static void test_alloc_fdtable(struct kunit *test) 7*501cbbd2SBill Wendling { 8*501cbbd2SBill Wendling struct fdtable *fdt; 9*501cbbd2SBill Wendling unsigned int slots = 64; 10*501cbbd2SBill Wendling 11*501cbbd2SBill Wendling fdt = alloc_fdtable(slots); 12*501cbbd2SBill Wendling KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fdt); 13*501cbbd2SBill Wendling 14*501cbbd2SBill Wendling /* Check that max_fds is set correctly and is >= slots */ 15*501cbbd2SBill Wendling KUNIT_EXPECT_GE(test, fdt->max_fds, slots); 16*501cbbd2SBill Wendling 17*501cbbd2SBill Wendling /* Check that fd is allocated */ 18*501cbbd2SBill Wendling KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fdt->fd); 19*501cbbd2SBill Wendling 20*501cbbd2SBill Wendling /* 21*501cbbd2SBill Wendling * Check dynamic object size of fdt->fd if compiler supports 22*501cbbd2SBill Wendling * __counted_by_ptr. 23*501cbbd2SBill Wendling */ 24*501cbbd2SBill Wendling #ifdef CONFIG_CC_HAS_COUNTED_BY_PTR 25*501cbbd2SBill Wendling KUNIT_EXPECT_EQ(test, __builtin_dynamic_object_size(fdt->fd, 0), 26*501cbbd2SBill Wendling fdt->max_fds * sizeof(struct file *)); 27*501cbbd2SBill Wendling #endif 28*501cbbd2SBill Wendling 29*501cbbd2SBill Wendling __free_fdtable(fdt); 30*501cbbd2SBill Wendling } 31*501cbbd2SBill Wendling 32*501cbbd2SBill Wendling static void test_dup_fd(struct kunit *test) 33*501cbbd2SBill Wendling { 34*501cbbd2SBill Wendling struct files_struct *newf; 35*501cbbd2SBill Wendling struct fdtable *fdt; 36*501cbbd2SBill Wendling 37*501cbbd2SBill Wendling newf = dup_fd(&init_files, NULL); 38*501cbbd2SBill Wendling KUNIT_ASSERT_NOT_ERR_OR_NULL(test, newf); 39*501cbbd2SBill Wendling 40*501cbbd2SBill Wendling fdt = rcu_dereference_raw(newf->fdt); 41*501cbbd2SBill Wendling KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fdt); 42*501cbbd2SBill Wendling 43*501cbbd2SBill Wendling /* Check that max_fds is set correctly and is >= NR_OPEN_DEFAULT */ 44*501cbbd2SBill Wendling KUNIT_EXPECT_GE(test, fdt->max_fds, NR_OPEN_DEFAULT); 45*501cbbd2SBill Wendling 46*501cbbd2SBill Wendling /* Check that fd is allocated */ 47*501cbbd2SBill Wendling KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fdt->fd); 48*501cbbd2SBill Wendling 49*501cbbd2SBill Wendling /* 50*501cbbd2SBill Wendling * Check dynamic object size of fdt->fd if compiler supports 51*501cbbd2SBill Wendling * __counted_by_ptr. 52*501cbbd2SBill Wendling */ 53*501cbbd2SBill Wendling #ifdef CONFIG_CC_HAS_COUNTED_BY_PTR 54*501cbbd2SBill Wendling KUNIT_EXPECT_EQ(test, __builtin_dynamic_object_size(fdt->fd, 0), 55*501cbbd2SBill Wendling fdt->max_fds * sizeof(struct file *)); 56*501cbbd2SBill Wendling #endif 57*501cbbd2SBill Wendling 58*501cbbd2SBill Wendling put_files_struct(newf); 59*501cbbd2SBill Wendling } 60*501cbbd2SBill Wendling 61*501cbbd2SBill Wendling static struct kunit_case fdtable_test_cases[] = { 62*501cbbd2SBill Wendling KUNIT_CASE(test_alloc_fdtable), 63*501cbbd2SBill Wendling KUNIT_CASE(test_dup_fd), 64*501cbbd2SBill Wendling {} 65*501cbbd2SBill Wendling }; 66*501cbbd2SBill Wendling 67*501cbbd2SBill Wendling static struct kunit_suite fdtable_test_suite = { 68*501cbbd2SBill Wendling .name = "fdtable", 69*501cbbd2SBill Wendling .test_cases = fdtable_test_cases, 70*501cbbd2SBill Wendling }; 71*501cbbd2SBill Wendling 72*501cbbd2SBill Wendling kunit_test_suite(fdtable_test_suite); 73