Commit 97ec9715 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'linux_kselftest-kunit-6.9-rc1' of...

Merge tag 'linux_kselftest-kunit-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest

Pull KUnit updates from Shuah Khan:

 - fix to make kunit_bus_type const

 - kunit tool change to Print UML command

 - DRM device creation helpers are now using the new kunit device
   creation helpers. This change resulted in DRM helpers switching from
   using a platform_device, to a dedicated bus and device type used by
   kunit. kunit devices don't set DMA mask and this caused regression on
   some drm tests as they can't allocate DMA buffers. Fix this problem
   by setting DMA masks on the kunit device during initialization.

 - KUnit has several macros which accept a log message, which can
   contain printf format specifiers. Some of these (the explicit log
   macros) already use the __printf() gcc attribute to ensure the format
   specifiers are valid, but those which could fail the test, and hence
   used __kunit_do_failed_assertion() behind the scenes, did not.

   These include: KUNIT_EXPECT_*_MSG(), KUNIT_ASSERT_*_MSG(), and
   KUNIT_FAIL()

   A nine-patch series adds the __printf() attribute, and fixes all of
   the issues uncovered.

* tag 'linux_kselftest-kunit-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest:
  kunit: Annotate _MSG assertion variants with gnu printf specifiers
  drm: tests: Fix invalid printf format specifiers in KUnit tests
  drm/xe/tests: Fix printf format specifiers in xe_migrate test
  net: test: Fix printf format specifier in skb_segment kunit test
  rtc: test: Fix invalid format specifier.
  time: test: Fix incorrect format specifier
  lib: memcpy_kunit: Fix an invalid format specifier in an assertion msg
  lib/cmdline: Fix an invalid format specifier in an assertion msg
  kunit: test: Log the correct filter string in executor_test
  kunit: Setup DMA masks on the kunit device
  kunit: make kunit_bus_type const
  kunit: Mark filter* params as rw
  kunit: tool: Print UML command
parents d451b075 806cb227
...@@ -260,30 +260,30 @@ static void drm_test_buddy_alloc_contiguous(struct kunit *test) ...@@ -260,30 +260,30 @@ static void drm_test_buddy_alloc_contiguous(struct kunit *test)
KUNIT_ASSERT_FALSE_MSG(test, KUNIT_ASSERT_FALSE_MSG(test,
drm_buddy_alloc_blocks(&mm, 0, mm_size, drm_buddy_alloc_blocks(&mm, 0, mm_size,
ps, ps, list, 0), ps, ps, list, 0),
"buddy_alloc hit an error size=%u\n", "buddy_alloc hit an error size=%lu\n",
ps); ps);
} while (++i < n_pages); } while (++i < n_pages);
KUNIT_ASSERT_TRUE_MSG(test, drm_buddy_alloc_blocks(&mm, 0, mm_size, KUNIT_ASSERT_TRUE_MSG(test, drm_buddy_alloc_blocks(&mm, 0, mm_size,
3 * ps, ps, &allocated, 3 * ps, ps, &allocated,
DRM_BUDDY_CONTIGUOUS_ALLOCATION), DRM_BUDDY_CONTIGUOUS_ALLOCATION),
"buddy_alloc didn't error size=%u\n", 3 * ps); "buddy_alloc didn't error size=%lu\n", 3 * ps);
drm_buddy_free_list(&mm, &middle); drm_buddy_free_list(&mm, &middle);
KUNIT_ASSERT_TRUE_MSG(test, drm_buddy_alloc_blocks(&mm, 0, mm_size, KUNIT_ASSERT_TRUE_MSG(test, drm_buddy_alloc_blocks(&mm, 0, mm_size,
3 * ps, ps, &allocated, 3 * ps, ps, &allocated,
DRM_BUDDY_CONTIGUOUS_ALLOCATION), DRM_BUDDY_CONTIGUOUS_ALLOCATION),
"buddy_alloc didn't error size=%u\n", 3 * ps); "buddy_alloc didn't error size=%lu\n", 3 * ps);
KUNIT_ASSERT_TRUE_MSG(test, drm_buddy_alloc_blocks(&mm, 0, mm_size, KUNIT_ASSERT_TRUE_MSG(test, drm_buddy_alloc_blocks(&mm, 0, mm_size,
2 * ps, ps, &allocated, 2 * ps, ps, &allocated,
DRM_BUDDY_CONTIGUOUS_ALLOCATION), DRM_BUDDY_CONTIGUOUS_ALLOCATION),
"buddy_alloc didn't error size=%u\n", 2 * ps); "buddy_alloc didn't error size=%lu\n", 2 * ps);
drm_buddy_free_list(&mm, &right); drm_buddy_free_list(&mm, &right);
KUNIT_ASSERT_TRUE_MSG(test, drm_buddy_alloc_blocks(&mm, 0, mm_size, KUNIT_ASSERT_TRUE_MSG(test, drm_buddy_alloc_blocks(&mm, 0, mm_size,
3 * ps, ps, &allocated, 3 * ps, ps, &allocated,
DRM_BUDDY_CONTIGUOUS_ALLOCATION), DRM_BUDDY_CONTIGUOUS_ALLOCATION),
"buddy_alloc didn't error size=%u\n", 3 * ps); "buddy_alloc didn't error size=%lu\n", 3 * ps);
/* /*
* At this point we should have enough contiguous space for 2 blocks, * At this point we should have enough contiguous space for 2 blocks,
* however they are never buddies (since we freed middle and right) so * however they are never buddies (since we freed middle and right) so
...@@ -292,13 +292,13 @@ static void drm_test_buddy_alloc_contiguous(struct kunit *test) ...@@ -292,13 +292,13 @@ static void drm_test_buddy_alloc_contiguous(struct kunit *test)
KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_alloc_blocks(&mm, 0, mm_size, KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_alloc_blocks(&mm, 0, mm_size,
2 * ps, ps, &allocated, 2 * ps, ps, &allocated,
DRM_BUDDY_CONTIGUOUS_ALLOCATION), DRM_BUDDY_CONTIGUOUS_ALLOCATION),
"buddy_alloc hit an error size=%u\n", 2 * ps); "buddy_alloc hit an error size=%lu\n", 2 * ps);
drm_buddy_free_list(&mm, &left); drm_buddy_free_list(&mm, &left);
KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_alloc_blocks(&mm, 0, mm_size, KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_alloc_blocks(&mm, 0, mm_size,
3 * ps, ps, &allocated, 3 * ps, ps, &allocated,
DRM_BUDDY_CONTIGUOUS_ALLOCATION), DRM_BUDDY_CONTIGUOUS_ALLOCATION),
"buddy_alloc hit an error size=%u\n", 3 * ps); "buddy_alloc hit an error size=%lu\n", 3 * ps);
total = 0; total = 0;
list_for_each_entry(block, &allocated, link) list_for_each_entry(block, &allocated, link)
......
...@@ -157,7 +157,7 @@ static void drm_test_mm_init(struct kunit *test) ...@@ -157,7 +157,7 @@ static void drm_test_mm_init(struct kunit *test)
/* After creation, it should all be one massive hole */ /* After creation, it should all be one massive hole */
if (!assert_one_hole(test, &mm, 0, size)) { if (!assert_one_hole(test, &mm, 0, size)) {
KUNIT_FAIL(test, ""); KUNIT_FAIL(test, "mm not one hole on creation");
goto out; goto out;
} }
...@@ -171,14 +171,14 @@ static void drm_test_mm_init(struct kunit *test) ...@@ -171,14 +171,14 @@ static void drm_test_mm_init(struct kunit *test)
/* After filling the range entirely, there should be no holes */ /* After filling the range entirely, there should be no holes */
if (!assert_no_holes(test, &mm)) { if (!assert_no_holes(test, &mm)) {
KUNIT_FAIL(test, ""); KUNIT_FAIL(test, "mm has holes when filled");
goto out; goto out;
} }
/* And then after emptying it again, the massive hole should be back */ /* And then after emptying it again, the massive hole should be back */
drm_mm_remove_node(&tmp); drm_mm_remove_node(&tmp);
if (!assert_one_hole(test, &mm, 0, size)) { if (!assert_one_hole(test, &mm, 0, size)) {
KUNIT_FAIL(test, ""); KUNIT_FAIL(test, "mm does not have single hole after emptying");
goto out; goto out;
} }
......
...@@ -114,21 +114,21 @@ static void test_copy(struct xe_migrate *m, struct xe_bo *bo, ...@@ -114,21 +114,21 @@ static void test_copy(struct xe_migrate *m, struct xe_bo *bo,
region | region |
XE_BO_NEEDS_CPU_ACCESS); XE_BO_NEEDS_CPU_ACCESS);
if (IS_ERR(remote)) { if (IS_ERR(remote)) {
KUNIT_FAIL(test, "Failed to allocate remote bo for %s: %li\n", KUNIT_FAIL(test, "Failed to allocate remote bo for %s: %pe\n",
str, PTR_ERR(remote)); str, remote);
return; return;
} }
err = xe_bo_validate(remote, NULL, false); err = xe_bo_validate(remote, NULL, false);
if (err) { if (err) {
KUNIT_FAIL(test, "Failed to validate system bo for %s: %li\n", KUNIT_FAIL(test, "Failed to validate system bo for %s: %i\n",
str, err); str, err);
goto out_unlock; goto out_unlock;
} }
err = xe_bo_vmap(remote); err = xe_bo_vmap(remote);
if (err) { if (err) {
KUNIT_FAIL(test, "Failed to vmap system bo for %s: %li\n", KUNIT_FAIL(test, "Failed to vmap system bo for %s: %i\n",
str, err); str, err);
goto out_unlock; goto out_unlock;
} }
......
...@@ -54,7 +54,7 @@ static void rtc_time64_to_tm_test_date_range(struct kunit *test) ...@@ -54,7 +54,7 @@ static void rtc_time64_to_tm_test_date_range(struct kunit *test)
days = div_s64(secs, 86400); days = div_s64(secs, 86400);
#define FAIL_MSG "%d/%02d/%02d (%2d) : %ld", \ #define FAIL_MSG "%d/%02d/%02d (%2d) : %lld", \
year, month, mday, yday, days year, month, mday, yday, days
KUNIT_ASSERT_EQ_MSG(test, year - 1900, result.tm_year, FAIL_MSG); KUNIT_ASSERT_EQ_MSG(test, year - 1900, result.tm_year, FAIL_MSG);
......
...@@ -579,7 +579,7 @@ void __printf(2, 3) kunit_log_append(struct string_stream *log, const char *fmt, ...@@ -579,7 +579,7 @@ void __printf(2, 3) kunit_log_append(struct string_stream *log, const char *fmt,
void __noreturn __kunit_abort(struct kunit *test); void __noreturn __kunit_abort(struct kunit *test);
void __kunit_do_failed_assertion(struct kunit *test, void __printf(6, 7) __kunit_do_failed_assertion(struct kunit *test,
const struct kunit_loc *loc, const struct kunit_loc *loc,
enum kunit_assert_type type, enum kunit_assert_type type,
const struct kunit_assert *assert, const struct kunit_assert *assert,
......
...@@ -73,7 +73,7 @@ static void time64_to_tm_test_date_range(struct kunit *test) ...@@ -73,7 +73,7 @@ static void time64_to_tm_test_date_range(struct kunit *test)
days = div_s64(secs, 86400); days = div_s64(secs, 86400);
#define FAIL_MSG "%05ld/%02d/%02d (%2d) : %ld", \ #define FAIL_MSG "%05ld/%02d/%02d (%2d) : %lld", \
year, month, mdday, yday, days year, month, mdday, yday, days
KUNIT_ASSERT_EQ_MSG(test, year - 1900, result.tm_year, FAIL_MSG); KUNIT_ASSERT_EQ_MSG(test, year - 1900, result.tm_year, FAIL_MSG);
......
...@@ -124,7 +124,7 @@ static void cmdline_do_one_range_test(struct kunit *test, const char *in, ...@@ -124,7 +124,7 @@ static void cmdline_do_one_range_test(struct kunit *test, const char *in,
n, e[0], r[0]); n, e[0], r[0]);
p = memchr_inv(&r[1], 0, sizeof(r) - sizeof(r[0])); p = memchr_inv(&r[1], 0, sizeof(r) - sizeof(r[0]));
KUNIT_EXPECT_PTR_EQ_MSG(test, p, NULL, "in test %u at %u out of bound", n, p - r); KUNIT_EXPECT_PTR_EQ_MSG(test, p, NULL, "in test %u at %td out of bound", n, p - r);
} }
static void cmdline_test_range(struct kunit *test) static void cmdline_test_range(struct kunit *test)
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
*/ */
#include <linux/device.h> #include <linux/device.h>
#include <linux/dma-mapping.h>
#include <kunit/test.h> #include <kunit/test.h>
#include <kunit/device.h> #include <kunit/device.h>
...@@ -35,7 +36,7 @@ struct kunit_device { ...@@ -35,7 +36,7 @@ struct kunit_device {
#define to_kunit_device(d) container_of_const(d, struct kunit_device, dev) #define to_kunit_device(d) container_of_const(d, struct kunit_device, dev)
static struct bus_type kunit_bus_type = { static const struct bus_type kunit_bus_type = {
.name = "kunit", .name = "kunit",
}; };
...@@ -133,6 +134,9 @@ static struct kunit_device *kunit_device_register_internal(struct kunit *test, ...@@ -133,6 +134,9 @@ static struct kunit_device *kunit_device_register_internal(struct kunit *test,
return ERR_PTR(err); return ERR_PTR(err);
} }
kunit_dev->dev.dma_mask = &kunit_dev->dev.coherent_dma_mask;
kunit_dev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
kunit_add_action(test, device_unregister_wrapper, &kunit_dev->dev); kunit_add_action(test, device_unregister_wrapper, &kunit_dev->dev);
return kunit_dev; return kunit_dev;
......
...@@ -33,13 +33,13 @@ static char *filter_glob_param; ...@@ -33,13 +33,13 @@ static char *filter_glob_param;
static char *filter_param; static char *filter_param;
static char *filter_action_param; static char *filter_action_param;
module_param_named(filter_glob, filter_glob_param, charp, 0400); module_param_named(filter_glob, filter_glob_param, charp, 0600);
MODULE_PARM_DESC(filter_glob, MODULE_PARM_DESC(filter_glob,
"Filter which KUnit test suites/tests run at boot-time, e.g. list* or list*.*del_test"); "Filter which KUnit test suites/tests run at boot-time, e.g. list* or list*.*del_test");
module_param_named(filter, filter_param, charp, 0400); module_param_named(filter, filter_param, charp, 0600);
MODULE_PARM_DESC(filter, MODULE_PARM_DESC(filter,
"Filter which KUnit test suites/tests run at boot-time using attributes, e.g. speed>slow"); "Filter which KUnit test suites/tests run at boot-time using attributes, e.g. speed>slow");
module_param_named(filter_action, filter_action_param, charp, 0400); module_param_named(filter_action, filter_action_param, charp, 0600);
MODULE_PARM_DESC(filter_action, MODULE_PARM_DESC(filter_action,
"Changes behavior of filtered tests using attributes, valid values are:\n" "Changes behavior of filtered tests using attributes, valid values are:\n"
"<none>: do not run filtered tests as normal\n" "<none>: do not run filtered tests as normal\n"
......
...@@ -129,7 +129,7 @@ static void parse_filter_attr_test(struct kunit *test) ...@@ -129,7 +129,7 @@ static void parse_filter_attr_test(struct kunit *test)
GFP_KERNEL); GFP_KERNEL);
for (j = 0; j < filter_count; j++) { for (j = 0; j < filter_count; j++) {
parsed_filters[j] = kunit_next_attr_filter(&filter, &err); parsed_filters[j] = kunit_next_attr_filter(&filter, &err);
KUNIT_ASSERT_EQ_MSG(test, err, 0, "failed to parse filter '%s'", filters[j]); KUNIT_ASSERT_EQ_MSG(test, err, 0, "failed to parse filter from '%s'", filters);
} }
KUNIT_EXPECT_STREQ(test, kunit_attr_filter_name(parsed_filters[0]), "speed"); KUNIT_EXPECT_STREQ(test, kunit_attr_filter_name(parsed_filters[0]), "speed");
......
...@@ -32,7 +32,7 @@ struct some_bytes { ...@@ -32,7 +32,7 @@ struct some_bytes {
BUILD_BUG_ON(sizeof(instance.data) != 32); \ BUILD_BUG_ON(sizeof(instance.data) != 32); \
for (size_t i = 0; i < sizeof(instance.data); i++) { \ for (size_t i = 0; i < sizeof(instance.data); i++) { \
KUNIT_ASSERT_EQ_MSG(test, instance.data[i], v, \ KUNIT_ASSERT_EQ_MSG(test, instance.data[i], v, \
"line %d: '%s' not initialized to 0x%02x @ %d (saw 0x%02x)\n", \ "line %d: '%s' not initialized to 0x%02x @ %zu (saw 0x%02x)\n", \
__LINE__, #instance, v, i, instance.data[i]); \ __LINE__, #instance, v, i, instance.data[i]); \
} \ } \
} while (0) } while (0)
...@@ -41,7 +41,7 @@ struct some_bytes { ...@@ -41,7 +41,7 @@ struct some_bytes {
BUILD_BUG_ON(sizeof(one) != sizeof(two)); \ BUILD_BUG_ON(sizeof(one) != sizeof(two)); \
for (size_t i = 0; i < sizeof(one); i++) { \ for (size_t i = 0; i < sizeof(one); i++) { \
KUNIT_EXPECT_EQ_MSG(test, one.data[i], two.data[i], \ KUNIT_EXPECT_EQ_MSG(test, one.data[i], two.data[i], \
"line %d: %s.data[%d] (0x%02x) != %s.data[%d] (0x%02x)\n", \ "line %d: %s.data[%zu] (0x%02x) != %s.data[%zu] (0x%02x)\n", \
__LINE__, #one, i, one.data[i], #two, i, two.data[i]); \ __LINE__, #one, i, one.data[i], #two, i, two.data[i]); \
} \ } \
kunit_info(test, "ok: " TEST_OP "() " name "\n"); \ kunit_info(test, "ok: " TEST_OP "() " name "\n"); \
......
...@@ -225,7 +225,7 @@ static void gso_test_func(struct kunit *test) ...@@ -225,7 +225,7 @@ static void gso_test_func(struct kunit *test)
segs = skb_segment(skb, features); segs = skb_segment(skb, features);
if (IS_ERR(segs)) { if (IS_ERR(segs)) {
KUNIT_FAIL(test, "segs error %lld", PTR_ERR(segs)); KUNIT_FAIL(test, "segs error %pe", segs);
goto free_gso_skb; goto free_gso_skb;
} else if (!segs) { } else if (!segs) {
KUNIT_FAIL(test, "no segments"); KUNIT_FAIL(test, "no segments");
......
...@@ -146,6 +146,7 @@ class LinuxSourceTreeOperationsUml(LinuxSourceTreeOperations): ...@@ -146,6 +146,7 @@ class LinuxSourceTreeOperationsUml(LinuxSourceTreeOperations):
"""Runs the Linux UML binary. Must be named 'linux'.""" """Runs the Linux UML binary. Must be named 'linux'."""
linux_bin = os.path.join(build_dir, 'linux') linux_bin = os.path.join(build_dir, 'linux')
params.extend(['mem=1G', 'console=tty', 'kunit_shutdown=halt']) params.extend(['mem=1G', 'console=tty', 'kunit_shutdown=halt'])
print('Running tests with:\n$', linux_bin, ' '.join(shlex.quote(arg) for arg in params))
return subprocess.Popen([linux_bin] + params, return subprocess.Popen([linux_bin] + params,
stdin=subprocess.PIPE, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment