From: Guenter Roeck <[email protected]>

The drm_test_rect_calc_hscale and drm_test_rect_calc_vscale unit tests
intentionally trigger warning backtraces by providing invalid parameters
the tested functions. Suppress the backtraces to avoid clogging the
kernel log and distracting from real problems.

The suppression API also exposes a warning counter, which is used
to assert that the expected warning was actually triggered. On
CONFIG_BUG=n, WARN_ON() is a no-op and the counter stays zero;
the expected count is adjusted accordingly, preserving the return
value check on all configurations.

Tested-by: Linux Kernel Functional Testing <[email protected]>
Acked-by: Dan Carpenter <[email protected]>
Acked-by: MaĆ­ra Canal <[email protected]>
Cc: Maarten Lankhorst <[email protected]>
Cc: David Airlie <[email protected]>
Cc: Daniel Vetter <[email protected]>
Signed-off-by: Guenter Roeck <[email protected]>
Signed-off-by: Alessandro Carminati <[email protected]>
Acked-by: David Gow <[email protected]>
Signed-off-by: Albert Esteve <[email protected]>
---
 drivers/gpu/drm/tests/drm_rect_test.c | 36 +++++++++++++++++++++++++++++------
 1 file changed, 30 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/tests/drm_rect_test.c 
b/drivers/gpu/drm/tests/drm_rect_test.c
index 17e1f34b76101..5aa8ec5fc4d64 100644
--- a/drivers/gpu/drm/tests/drm_rect_test.c
+++ b/drivers/gpu/drm/tests/drm_rect_test.c
@@ -10,6 +10,7 @@
 #include <drm/drm_rect.h>
 #include <drm/drm_mode.h>
 
+#include <linux/limits.h>
 #include <linux/string_helpers.h>
 #include <linux/errno.h>
 
@@ -407,10 +408,22 @@ KUNIT_ARRAY_PARAM(drm_rect_scale, drm_rect_scale_cases, 
drm_rect_scale_case_desc
 static void drm_test_rect_calc_hscale(struct kunit *test)
 {
        const struct drm_rect_scale_case *params = test->param_value;
-       int scaling_factor;
+       /* With CONFIG_BUG=n, WARN_ON() is a no-op so no warning fires. */
+       int expected_warnings = IS_ENABLED(CONFIG_BUG) ?
+                       (params->expected_scaling_factor == -EINVAL) : 0;
+       int scaling_factor = INT_MIN;
 
-       scaling_factor = drm_rect_calc_hscale(&params->src, &params->dst,
-                                             params->min_range, 
params->max_range);
+       /*
+        * drm_rect_calc_hscale() generates a warning backtrace whenever bad
+        * parameters are passed to it. This affects unit tests with -EINVAL
+        * error code in expected_scaling_factor.
+        */
+       kunit_warning_suppress(test) {
+               scaling_factor = drm_rect_calc_hscale(&params->src, 
&params->dst,
+                                                     params->min_range,
+                                                     params->max_range);
+               KUNIT_EXPECT_SUPPRESSED_WARNING_COUNT(test, expected_warnings);
+       }
 
        KUNIT_EXPECT_EQ(test, scaling_factor, params->expected_scaling_factor);
 }
@@ -418,10 +431,21 @@ static void drm_test_rect_calc_hscale(struct kunit *test)
 static void drm_test_rect_calc_vscale(struct kunit *test)
 {
        const struct drm_rect_scale_case *params = test->param_value;
-       int scaling_factor;
+       /* With CONFIG_BUG=n, WARN_ON() is a no-op so no warning fires. */
+       int expected_warnings = IS_ENABLED(CONFIG_BUG) ?
+                       (params->expected_scaling_factor == -EINVAL) : 0;
+       int scaling_factor = INT_MIN;
 
-       scaling_factor = drm_rect_calc_vscale(&params->src, &params->dst,
-                                             params->min_range, 
params->max_range);
+       /*
+        * drm_rect_calc_vscale() generates a warning backtrace whenever bad
+        * parameters are passed to it. This affects unit tests with -EINVAL
+        * error code in expected_scaling_factor.
+        */
+       kunit_warning_suppress(test) {
+               scaling_factor = drm_rect_calc_vscale(&params->src, 
&params->dst,
+                                                     params->min_range, 
params->max_range);
+               KUNIT_EXPECT_SUPPRESSED_WARNING_COUNT(test, expected_warnings);
+       }
 
        KUNIT_EXPECT_EQ(test, scaling_factor, params->expected_scaling_factor);
 }

-- 
2.53.0


Reply via email to