diff mbox series

[kmsxx] testpat: Fix memory mapping in threaded drawing

Message ID 20231114193036.27049-1-laurent.pinchart@ideasonboard.com (mailing list archive)
State New
Delegated to: Kieran Bingham
Headers show
Series [kmsxx] testpat: Fix memory mapping in threaded drawing | expand

Commit Message

Laurent Pinchart Nov. 14, 2023, 7:30 p.m. UTC
The IFramebuffer::map() function is not thread-safe, which is why the
threaded implementation of draw_test_pattern_impl() maps all planes
before starting to draw. A typo slipped in the code, resulting in only
plane 0 being mapped. This didn't result in an immediate segfault, as
drawing operations in the worker threads map the remaining planes.
However, due to the implementation of DumbFramebuffer::map(), this can
result in the same plane being mapped multiple times, with only one of
the mapping recorded in the mapping cache. The other mappings are then
leaked, leading not only to extra memory consumption, but also to the
DRM device never being released even after the destruction of the Card
object.

Fix this.

Fixes: 40d96062a37c ("Revert "testpat: remove threaded drawing"")
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
I've noticed this issue when running the DU KMS tests, when the tests
run right after multi-planar format tests would sometimes fail, while
running fine in isolation. It was "fun" to debug, for some definition of
"fun".
---
 kms++util/src/testpat.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)


base-commit: c23e7548ee317c043660f9b992388257e99f1776

Comments

Tomi Valkeinen Nov. 15, 2023, 6:57 a.m. UTC | #1
On 14/11/2023 21:30, Laurent Pinchart wrote:
> The IFramebuffer::map() function is not thread-safe, which is why the
> threaded implementation of draw_test_pattern_impl() maps all planes
> before starting to draw. A typo slipped in the code, resulting in only
> plane 0 being mapped. This didn't result in an immediate segfault, as
> drawing operations in the worker threads map the remaining planes.
> However, due to the implementation of DumbFramebuffer::map(), this can
> result in the same plane being mapped multiple times, with only one of
> the mapping recorded in the mapping cache. The other mappings are then
> leaked, leading not only to extra memory consumption, but also to the
> DRM device never being released even after the destruction of the Card
> object.
> 
> Fix this.
> 
> Fixes: 40d96062a37c ("Revert "testpat: remove threaded drawing"")
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
> I've noticed this issue when running the DU KMS tests, when the tests
> run right after multi-planar format tests would sometimes fail, while
> running fine in isolation. It was "fun" to debug, for some definition of
> "fun".

Thanks, good catch. I have applied this. And I'm "glad" that I was able 
to provide you some late-night "fun", for some definitions of "glad" and 
"fun"!

  Tomi

> ---
>   kms++util/src/testpat.cpp | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/kms++util/src/testpat.cpp b/kms++util/src/testpat.cpp
> index 78c9d19a5ad7..1102588cc9f7 100644
> --- a/kms++util/src/testpat.cpp
> +++ b/kms++util/src/testpat.cpp
> @@ -173,7 +173,7 @@ static void draw_test_pattern_impl(IFramebuffer& fb, YUVType yuvt)
>   
>   	// Create the mmaps before starting the threads
>   	for (unsigned i = 0; i < fb.num_planes(); ++i)
> -		fb.map(0);
> +		fb.map(i);
>   
>   	unsigned num_threads = thread::hardware_concurrency();
>   	vector<thread> workers;
> 
> base-commit: c23e7548ee317c043660f9b992388257e99f1776
diff mbox series

Patch

diff --git a/kms++util/src/testpat.cpp b/kms++util/src/testpat.cpp
index 78c9d19a5ad7..1102588cc9f7 100644
--- a/kms++util/src/testpat.cpp
+++ b/kms++util/src/testpat.cpp
@@ -173,7 +173,7 @@  static void draw_test_pattern_impl(IFramebuffer& fb, YUVType yuvt)
 
 	// Create the mmaps before starting the threads
 	for (unsigned i = 0; i < fb.num_planes(); ++i)
-		fb.map(0);
+		fb.map(i);
 
 	unsigned num_threads = thread::hardware_concurrency();
 	vector<thread> workers;