[RFC v2 1/3] drm/ttm: Introduce KUnit tests
Christian König
christian.koenig at amd.com
Fri Jun 30 11:18:23 UTC 2023
Am 30.06.23 um 13:09 schrieb Karolina Stolarek:
> Hi Christian,
>
> I'm taking a second look at this, and I wonder what would be the
> benefit of combining the initialization of device and ttm_device.
> (drm_)device can be initialized indepedently from the test params, so
> we can utilize .init and .exit callbacks offered by KUnit[1] to
> prepare and release the device indepedently of our setup. If we were
> to change it so ttm_device is also initialized there, we'd have to
> manually call init/fini in every single test. What's more, ttm_pool
> tests don't depend on ttm_device, and I can imagine that some structs
> can be tested in a similar way.
>
> Would it be fine with you to rename ttm_kunit_helper_alloc_device(),
> but leave its definition as it is?
Yeah, sure. It's perfectly up to you how to structurize that, I wasn't
even aware that there are .init and .exit callbacks.
I just found that the function name didn't match what the function was
doing.
Regards,
Christian.
>
> All the best,
> Karolina
> -------------------------------------------------------------------
> [1] -
> https://kunit.dev/third_party/kernel/docs/api/test.html#c.kunit_suite
>
> On 29.06.2023 12:05, Karolina Stolarek wrote:
>> Hi Christian,
>>
>> Thanks a lot for taking a look at my patches.
>>
>> On 29.06.2023 09:50, Christian König wrote:
>>> Am 27.06.23 um 10:32 schrieb Karolina Stolarek:
>>>> Add the initial version of unit tests for ttm_device struct, together
>>>> with helper functions.
>>>>
>>>> Signed-off-by: Karolina Stolarek <karolina.stolarek at intel.com>
>>>> ---
>>>> drivers/gpu/drm/Kconfig | 15 +++++
>>>> drivers/gpu/drm/ttm/Makefile | 1 +
>>>> drivers/gpu/drm/ttm/tests/.kunitconfig | 4 ++
>>>> drivers/gpu/drm/ttm/tests/Makefile | 5 ++
>>>> drivers/gpu/drm/ttm/tests/ttm_device_test.c | 54 +++++++++++++++++
>>>> drivers/gpu/drm/ttm/tests/ttm_kunit_helpers.c | 59
>>>> +++++++++++++++++++
>>>> drivers/gpu/drm/ttm/tests/ttm_kunit_helpers.h | 29 +++++++++
>>>> 7 files changed, 167 insertions(+)
>>>> create mode 100644 drivers/gpu/drm/ttm/tests/.kunitconfig
>>>> create mode 100644 drivers/gpu/drm/ttm/tests/Makefile
>>>> create mode 100644 drivers/gpu/drm/ttm/tests/ttm_device_test.c
>>>> create mode 100644 drivers/gpu/drm/ttm/tests/ttm_kunit_helpers.c
>>>> create mode 100644 drivers/gpu/drm/ttm/tests/ttm_kunit_helpers.h
>>>>
>>>> diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
>>>> index afb3b2f5f425..53024e44a2d5 100644
>>>> --- a/drivers/gpu/drm/Kconfig
>>>> +++ b/drivers/gpu/drm/Kconfig
>>>> @@ -194,6 +194,21 @@ config DRM_TTM
>>>> GPU memory types. Will be enabled automatically if a device
>>>> driver
>>>> uses it.
>>>> +config DRM_TTM_KUNIT_TEST
>>>> + tristate "KUnit tests for TTM" if !KUNIT_ALL_TESTS
>>>> + default n
>>>> + depends on DRM && KUNIT
>>>> + select DRM_TTM
>>>> + select DRM_EXPORT_FOR_TESTS if m
>>>> + select DRM_KUNIT_TEST_HELPERS
>>>> + default KUNIT_ALL_TESTS
>>>> + help
>>>> + Enables unit tests for TTM, a GPU memory manager
>>>> subsystem used
>>>> + to manage memory buffers. This option is mostly useful
>>>> for kernel
>>>> + developers.
>>>> +
>>>> + If in doubt, say "N".
>>>> +
>>>> config DRM_BUDDY
>>>> tristate
>>>> depends on DRM
>>>> diff --git a/drivers/gpu/drm/ttm/Makefile
>>>> b/drivers/gpu/drm/ttm/Makefile
>>>> index f906b22959cf..dad298127226 100644
>>>> --- a/drivers/gpu/drm/ttm/Makefile
>>>> +++ b/drivers/gpu/drm/ttm/Makefile
>>>> @@ -8,3 +8,4 @@ ttm-y := ttm_tt.o ttm_bo.o ttm_bo_util.o
>>>> ttm_bo_vm.o ttm_module.o \
>>>> ttm-$(CONFIG_AGP) += ttm_agp_backend.o
>>>> obj-$(CONFIG_DRM_TTM) += ttm.o
>>>> +obj-$(CONFIG_DRM_TTM_KUNIT_TEST) += tests/
>>>> diff --git a/drivers/gpu/drm/ttm/tests/.kunitconfig
>>>> b/drivers/gpu/drm/ttm/tests/.kunitconfig
>>>> new file mode 100644
>>>> index 000000000000..75fdce0cd98e
>>>> --- /dev/null
>>>> +++ b/drivers/gpu/drm/ttm/tests/.kunitconfig
>>>> @@ -0,0 +1,4 @@
>>>> +CONFIG_KUNIT=y
>>>> +CONFIG_DRM=y
>>>> +CONFIG_DRM_KUNIT_TEST_HELPERS=y
>>>> +CONFIG_DRM_TTM_KUNIT_TEST=y
>>>> diff --git a/drivers/gpu/drm/ttm/tests/Makefile
>>>> b/drivers/gpu/drm/ttm/tests/Makefile
>>>> new file mode 100644
>>>> index 000000000000..7917805f37af
>>>> --- /dev/null
>>>> +++ b/drivers/gpu/drm/ttm/tests/Makefile
>>>> @@ -0,0 +1,5 @@
>>>> +# SPDX-License-Identifier: GPL-2.0 AND MIT
>>>> +
>>>> +obj-$(CONFIG_DRM_TTM_KUNIT_TEST) += \
>>>> + ttm_device_test.o \
>>>> + ttm_kunit_helpers.o
>>>> diff --git a/drivers/gpu/drm/ttm/tests/ttm_device_test.c
>>>> b/drivers/gpu/drm/ttm/tests/ttm_device_test.c
>>>> new file mode 100644
>>>> index 000000000000..08d7314b1e35
>>>> --- /dev/null
>>>> +++ b/drivers/gpu/drm/ttm/tests/ttm_device_test.c
>>>> @@ -0,0 +1,54 @@
>>>> +// SPDX-License-Identifier: GPL-2.0 AND MIT
>>>> +/*
>>>> + * Copyright © 2023 Intel Corporation
>>>> + */
>>>> +#include <drm/ttm/ttm_resource.h>
>>>> +#include <drm/ttm/ttm_device.h>
>>>> +#include <drm/ttm/ttm_placement.h>
>>>> +
>>>> +#include "ttm_kunit_helpers.h"
>>>> +
>>>> +static void ttm_device_init_basic(struct kunit *test)
>>>> +{
>>>> + struct ttm_test_devices_priv *priv = test->priv;
>>>> + struct ttm_device *ttm_dev;
>>>> + struct ttm_resource_manager *ttm_sys_man;
>>>> + int err;
>>>> +
>>>> + ttm_dev = kunit_kzalloc(test, sizeof(*ttm_dev), GFP_KERNEL);
>>>> + KUNIT_ASSERT_NOT_NULL(test, ttm_dev);
>>>> +
>>>> + err = ttm_kunit_helper_alloc_device(test, ttm_dev, false, false);
>>>> + KUNIT_ASSERT_EQ(test, err, 0);
>>>> +
>>>> + KUNIT_EXPECT_PTR_EQ(test, ttm_dev->funcs, &ttm_dev_funcs);
>>>> + KUNIT_ASSERT_NOT_NULL(test, ttm_dev->wq);
>>>> + KUNIT_ASSERT_NOT_NULL(test, ttm_dev->man_drv[TTM_PL_SYSTEM]);
>>>> +
>>>> + ttm_sys_man = &ttm_dev->sysman;
>>>> + KUNIT_ASSERT_NOT_NULL(test, ttm_sys_man);
>>>> + KUNIT_EXPECT_TRUE(test, ttm_sys_man->use_tt);
>>>> + KUNIT_EXPECT_TRUE(test, ttm_sys_man->use_type);
>>>> + KUNIT_ASSERT_NOT_NULL(test, ttm_sys_man->func);
>>>> +
>>>> + KUNIT_EXPECT_PTR_EQ(test, ttm_dev->dev_mapping,
>>>> + priv->drm->anon_inode->i_mapping);
>>>> +
>>>> + ttm_device_fini(ttm_dev);
>>>> +}
>>>> +
>>>> +static struct kunit_case ttm_device_test_cases[] = {
>>>> + KUNIT_CASE(ttm_device_init_basic),
>>>> + {}
>>>> +};
>>>> +
>>>> +static struct kunit_suite ttm_device_test_suite = {
>>>> + .name = "ttm_device",
>>>> + .init = ttm_test_devices_init,
>>>> + .exit = ttm_test_devices_fini,
>>>> + .test_cases = ttm_device_test_cases,
>>>> +};
>>>> +
>>>> +kunit_test_suites(&ttm_device_test_suite);
>>>> +
>>>> +MODULE_LICENSE("GPL");
>>>> diff --git a/drivers/gpu/drm/ttm/tests/ttm_kunit_helpers.c
>>>> b/drivers/gpu/drm/ttm/tests/ttm_kunit_helpers.c
>>>> new file mode 100644
>>>> index 000000000000..d03db0405484
>>>> --- /dev/null
>>>> +++ b/drivers/gpu/drm/ttm/tests/ttm_kunit_helpers.c
>>>> @@ -0,0 +1,59 @@
>>>> +// SPDX-License-Identifier: GPL-2.0 AND MIT
>>>> +/*
>>>> + * Copyright © 2023 Intel Corporation
>>>> + */
>>>> +#include "ttm_kunit_helpers.h"
>>>> +
>>>> +struct ttm_device_funcs ttm_dev_funcs = {
>>>> +};
>>>> +EXPORT_SYMBOL_GPL(ttm_dev_funcs);
>>>> +
>>>> +int ttm_kunit_helper_alloc_device(struct kunit *test,
>>>
>>> Since this function is only initializing the ttm device I think we
>>> should name it ttm_kunit_helper_init_device().
>>>
>>> On the other hand I don't see a good reason why it can't also
>>> allocate the device.
>>
>> I believe that's a leftover from times when I thought I'll reuse DRM
>> device between the tests. No problem, I can put them into one function.
>>
>> All the best,
>> Karolina
>>
>>>
>>> Apart from that looks like a good start,
>>> Christian.
>>>
>>>> + struct ttm_device *ttm,
>>>> + bool use_dma_alloc,
>>>> + bool use_dma32)
>>>> +{
>>>> + struct ttm_test_devices_priv *priv = test->priv;
>>>> + struct drm_device *drm = priv->drm;
>>>> + int err;
>>>> +
>>>> + err = ttm_device_init(ttm, &ttm_dev_funcs, drm->dev,
>>>> + drm->anon_inode->i_mapping,
>>>> + drm->vma_offset_manager,
>>>> + use_dma_alloc, use_dma32);
>>>> +
>>>> + return err;
>>>> +}
>>>> +EXPORT_SYMBOL_GPL(ttm_kunit_helper_alloc_device);
>>>> +
>>>> +int ttm_test_devices_init(struct kunit *test)
>>>> +{
>>>> + struct ttm_test_devices_priv *priv;
>>>> +
>>>> + priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL);
>>>> + KUNIT_ASSERT_NOT_NULL(test, priv);
>>>> +
>>>> + test->priv = priv;
>>>> +
>>>> + priv->dev = drm_kunit_helper_alloc_device(test);
>>>> + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->dev);
>>>> +
>>>> + priv->drm = __drm_kunit_helper_alloc_drm_device(test, priv->dev,
>>>> + sizeof(*priv->drm), 0,
>>>> + DRIVER_GEM);
>>>> + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->drm);
>>>> +
>>>> + return 0;
>>>> +}
>>>> +EXPORT_SYMBOL_GPL(ttm_test_devices_init);
>>>> +
>>>> +void ttm_test_devices_fini(struct kunit *test)
>>>> +{
>>>> + struct ttm_test_devices_priv *priv = test->priv;
>>>> +
>>>> + drm_kunit_helper_free_device(test, priv->dev);
>>>> + drm_dev_put(priv->drm);
>>>> +}
>>>> +EXPORT_SYMBOL_GPL(ttm_test_devices_fini);
>>>> +
>>>> +MODULE_LICENSE("GPL");
>>>> diff --git a/drivers/gpu/drm/ttm/tests/ttm_kunit_helpers.h
>>>> b/drivers/gpu/drm/ttm/tests/ttm_kunit_helpers.h
>>>> new file mode 100644
>>>> index 000000000000..69fb03b9c4d2
>>>> --- /dev/null
>>>> +++ b/drivers/gpu/drm/ttm/tests/ttm_kunit_helpers.h
>>>> @@ -0,0 +1,29 @@
>>>> +/* SPDX-License-Identifier: GPL-2.0 AND MIT */
>>>> +/*
>>>> + * Copyright © 2023 Intel Corporation
>>>> + */
>>>> +#ifndef TTM_KUNIT_HELPERS_H
>>>> +#define TTM_KUNIT_HELPERS_H
>>>> +
>>>> +#include <drm/drm_drv.h>
>>>> +#include <drm/ttm/ttm_device.h>
>>>> +
>>>> +#include <drm/drm_kunit_helpers.h>
>>>> +#include <kunit/test.h>
>>>> +
>>>> +extern struct ttm_device_funcs ttm_dev_funcs;
>>>> +
>>>> +struct ttm_test_devices_priv {
>>>> + struct drm_device *drm;
>>>> + struct device *dev;
>>>> +};
>>>> +
>>>> +int ttm_kunit_helper_alloc_device(struct kunit *test,
>>>> + struct ttm_device *ttm,
>>>> + bool use_dma_alloc,
>>>> + bool use_dma32);
>>>> +
>>>> +int ttm_test_devices_init(struct kunit *test);
>>>> +void ttm_test_devices_fini(struct kunit *test);
>>>> +
>>>> +#endif // TTM_KUNIT_HELPERS_H
>>>
More information about the dri-devel
mailing list