The kunit_remove_resource() function is used to unlink a resource from the list of resources in the test, making it no longer show up in kunit_find_resource(). However, this could lead to a race condition if two threads called kunit_remove_resource() on the same resource at the same time: the resource would be removed from the list twice (causing a crash at the second list_del()), and the refcount for the resource would be decremented twice (instead of once, for the reference held by the resource list). Fix both problems, the first by using list_del_init(), and the second by checking if the resource has already been removed using list_empty(), and only decrementing its refcount if it has not. Also add a KUnit test for the kunit_remove_resource() function which tests this behaviour. Reported-by: Daniel Latypov <dlatypov@google.com> Signed-off-by: David Gow <davidgow@google.com> Reviewed-by: Brendan Higgins <brendanhiggins@google.com> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org> |
||
|---|---|---|
| .. | ||
| .kunitconfig | ||
| assert.c | ||
| debugfs.c | ||
| debugfs.h | ||
| executor_test.c | ||
| executor.c | ||
| Kconfig | ||
| kunit-example-test.c | ||
| kunit-test.c | ||
| Makefile | ||
| resource.c | ||
| string-stream-test.c | ||
| string-stream.c | ||
| string-stream.h | ||
| test.c | ||
| try-catch-impl.h | ||
| try-catch.c | ||