On Thu 27-08-26 04:17:30, Bill Wendling wrote:
> This adds a KUnit test suite for fdtable to verify correct allocation,
> max_fds initialization, and dynamic object size of the fd array under
> __counted_by_ptr when CONFIG_CC_HAS_COUNTED_BY_PTR is enabled.
> 
> Assisted-by: Gemini:3.1-pro-preview
> Signed-off-by: Bill Wendling <[email protected]>

Looks sensible. Feel free to add:

Reviewed-by: Jan Kara <[email protected]>

                                                                Honza

> ---
> v2 - Added 'test_dup_fd' testcase for separate allocation path.
> v3 - Add version to the PATCH subject line
> ---
> Cc: Alexander Viro <[email protected]>
> Cc: Christian Brauner <[email protected]>
> Cc: Jan Kara <[email protected]>
> Cc: Kees Cook <[email protected]>
> Cc: "Gustavo A. R. Silva" <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> ---
>  fs/Kconfig               |  8 +++++
>  fs/file.c                |  4 +++
>  fs/tests/.kunitconfig    |  2 ++
>  fs/tests/fdtable_kunit.c | 72 ++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 86 insertions(+)
>  create mode 100644 fs/tests/.kunitconfig
>  create mode 100644 fs/tests/fdtable_kunit.c
> 
> diff --git a/fs/Kconfig b/fs/Kconfig
> index e05917adcd60..05b63f7506a7 100644
> --- a/fs/Kconfig
> +++ b/fs/Kconfig
> @@ -421,4 +421,12 @@ source "fs/unicode/Kconfig"
>  config IO_WQ
>       bool
>  
> +config FDTABLE_KUNIT_TEST
> +     bool "KUnit test for fdtable" if !KUNIT_ALL_TESTS
> +     depends on KUNIT=y
> +     default KUNIT_ALL_TESTS
> +     help
> +       This builds the fdtable KUnit tests, which tests various aspects
> +       of the fdtable structure and allocation.
> +
>  endmenu
> diff --git a/fs/file.c b/fs/file.c
> index 628ca07dc4b1..9c7001b901cf 100644
> --- a/fs/file.c
> +++ b/fs/file.c
> @@ -1529,3 +1529,7 @@ int iterate_fd(struct files_struct *files, unsigned n,
>       return res;
>  }
>  EXPORT_SYMBOL(iterate_fd);
> +
> +#ifdef CONFIG_FDTABLE_KUNIT_TEST
> +#include "tests/fdtable_kunit.c"
> +#endif
> diff --git a/fs/tests/.kunitconfig b/fs/tests/.kunitconfig
> new file mode 100644
> index 000000000000..de67125a9421
> --- /dev/null
> +++ b/fs/tests/.kunitconfig
> @@ -0,0 +1,2 @@
> +CONFIG_KUNIT=y
> +CONFIG_FDTABLE_KUNIT_TEST=y
> diff --git a/fs/tests/fdtable_kunit.c b/fs/tests/fdtable_kunit.c
> new file mode 100644
> index 000000000000..6abd2a8d8f5d
> --- /dev/null
> +++ b/fs/tests/fdtable_kunit.c
> @@ -0,0 +1,72 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +#include <kunit/test.h>
> +#include <linux/fdtable.h>
> +#include <linux/file.h>
> +
> +static void test_alloc_fdtable(struct kunit *test)
> +{
> +     struct fdtable *fdt;
> +     unsigned int slots = 64;
> +
> +     fdt = alloc_fdtable(slots);
> +     KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fdt);
> +
> +     /* Check that max_fds is set correctly and is >= slots */
> +     KUNIT_EXPECT_GE(test, fdt->max_fds, slots);
> +
> +     /* Check that fd is allocated */
> +     KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fdt->fd);
> +
> +     /*
> +      * Check dynamic object size of fdt->fd if compiler supports
> +      * __counted_by_ptr.
> +      */
> +#ifdef CONFIG_CC_HAS_COUNTED_BY_PTR
> +     KUNIT_EXPECT_EQ(test, __builtin_dynamic_object_size(fdt->fd, 0),
> +                     fdt->max_fds * sizeof(struct file *));
> +#endif
> +
> +     __free_fdtable(fdt);
> +}
> +
> +static void test_dup_fd(struct kunit *test)
> +{
> +     struct files_struct *newf;
> +     struct fdtable *fdt;
> +
> +     newf = dup_fd(&init_files, NULL);
> +     KUNIT_ASSERT_NOT_ERR_OR_NULL(test, newf);
> +
> +     fdt = rcu_dereference_raw(newf->fdt);
> +     KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fdt);
> +
> +     /* Check that max_fds is set correctly and is >= NR_OPEN_DEFAULT */
> +     KUNIT_EXPECT_GE(test, fdt->max_fds, NR_OPEN_DEFAULT);
> +
> +     /* Check that fd is allocated */
> +     KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fdt->fd);
> +
> +     /*
> +      * Check dynamic object size of fdt->fd if compiler supports
> +      * __counted_by_ptr.
> +      */
> +#ifdef CONFIG_CC_HAS_COUNTED_BY_PTR
> +     KUNIT_EXPECT_EQ(test, __builtin_dynamic_object_size(fdt->fd, 0),
> +                     fdt->max_fds * sizeof(struct file *));
> +#endif
> +
> +     put_files_struct(newf);
> +}
> +
> +static struct kunit_case fdtable_test_cases[] = {
> +     KUNIT_CASE(test_alloc_fdtable),
> +     KUNIT_CASE(test_dup_fd),
> +     {}
> +};
> +
> +static struct kunit_suite fdtable_test_suite = {
> +     .name = "fdtable",
> +     .test_cases = fdtable_test_cases,
> +};
> +
> +kunit_test_suite(fdtable_test_suite);
> -- 
> 2.55.0.897.gb25b4bd76c-goog
> 
-- 
Jan Kara <[email protected]>
SUSE Labs, CR

Reply via email to