1 // SPDX-License-Identifier: GPL-2.0
8 int test__thread_mg_share(struct test
*test __maybe_unused
, int subtest __maybe_unused
)
10 struct machines machines
;
11 struct machine
*machine
;
14 struct thread
*leader
;
15 struct thread
*t1
, *t2
, *t3
;
16 struct map_groups
*mg
;
19 struct thread
*other
, *other_leader
;
20 struct map_groups
*other_mg
;
23 * This test create 2 processes abstractions (struct thread)
24 * with several threads and checks they properly share and
25 * maintain map groups info (struct map_groups).
27 * thread group (pid: 0, tids: 0, 1, 2, 3)
28 * other group (pid: 4, tids: 4, 5)
31 machines__init(&machines
);
32 machine
= &machines
.host
;
34 /* create process with 4 threads */
35 leader
= machine__findnew_thread(machine
, 0, 0);
36 t1
= machine__findnew_thread(machine
, 0, 1);
37 t2
= machine__findnew_thread(machine
, 0, 2);
38 t3
= machine__findnew_thread(machine
, 0, 3);
40 /* and create 1 separated process, without thread leader */
41 other
= machine__findnew_thread(machine
, 4, 5);
43 TEST_ASSERT_VAL("failed to create threads",
44 leader
&& t1
&& t2
&& t3
&& other
);
47 TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&mg
->refcnt
), 4);
49 /* test the map groups pointer is shared */
50 TEST_ASSERT_VAL("map groups don't match", mg
== t1
->mg
);
51 TEST_ASSERT_VAL("map groups don't match", mg
== t2
->mg
);
52 TEST_ASSERT_VAL("map groups don't match", mg
== t3
->mg
);
55 * Verify the other leader was created by previous call.
56 * It should have shared map groups with no change in
59 other_leader
= machine__find_thread(machine
, 4, 4);
60 TEST_ASSERT_VAL("failed to find other leader", other_leader
);
63 * Ok, now that all the rbtree related operations were done,
64 * lets remove all of them from there so that we can do the
67 machine__remove_thread(machine
, leader
);
68 machine__remove_thread(machine
, t1
);
69 machine__remove_thread(machine
, t2
);
70 machine__remove_thread(machine
, t3
);
71 machine__remove_thread(machine
, other
);
72 machine__remove_thread(machine
, other_leader
);
75 TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&other_mg
->refcnt
), 2);
77 TEST_ASSERT_VAL("map groups don't match", other_mg
== other_leader
->mg
);
79 /* release thread group */
81 TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&mg
->refcnt
), 3);
84 TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&mg
->refcnt
), 2);
87 TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&mg
->refcnt
), 1);
91 /* release other group */
92 thread__put(other_leader
);
93 TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&other_mg
->refcnt
), 1);
97 machines__exit(&machines
);