-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
perf tests: Add map groups sharing with thread object test
This test create 2 processes abstractions, with several threads and checks they properly share and maintain map groups info. Acked-by: Namhyung Kim <namhyung@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Arnaldo Carvalho de Melo <acme@kernel.org> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> Cc: David Ahern <dsahern@gmail.com> Cc: Don Zickus <dzickus@redhat.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1397490723-1992-6-git-send-email-jolsa@redhat.com Signed-off-by: Jiri Olsa <jolsa@kernel.org>
- Loading branch information
Jiri Olsa
committed
Apr 28, 2014
1 parent
cddcef6
commit fabf012
Showing
4 changed files
with
96 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
#include "tests.h" | ||
#include "machine.h" | ||
#include "thread.h" | ||
#include "map.h" | ||
|
||
int test__thread_mg_share(void) | ||
{ | ||
struct machines machines; | ||
struct machine *machine; | ||
|
||
/* thread group */ | ||
struct thread *leader; | ||
struct thread *t1, *t2, *t3; | ||
struct map_groups *mg; | ||
|
||
/* other process */ | ||
struct thread *other, *other_leader; | ||
struct map_groups *other_mg; | ||
|
||
/* | ||
* This test create 2 processes abstractions (struct thread) | ||
* with several threads and checks they properly share and | ||
* maintain map groups info (struct map_groups). | ||
* | ||
* thread group (pid: 0, tids: 0, 1, 2, 3) | ||
* other group (pid: 4, tids: 4, 5) | ||
*/ | ||
|
||
machines__init(&machines); | ||
machine = &machines.host; | ||
|
||
/* create process with 4 threads */ | ||
leader = machine__findnew_thread(machine, 0, 0); | ||
t1 = machine__findnew_thread(machine, 0, 1); | ||
t2 = machine__findnew_thread(machine, 0, 2); | ||
t3 = machine__findnew_thread(machine, 0, 3); | ||
|
||
/* and create 1 separated process, without thread leader */ | ||
other = machine__findnew_thread(machine, 4, 5); | ||
|
||
TEST_ASSERT_VAL("failed to create threads", | ||
leader && t1 && t2 && t3 && other); | ||
|
||
mg = leader->mg; | ||
TEST_ASSERT_VAL("wrong refcnt", mg->refcnt == 4); | ||
|
||
/* test the map groups pointer is shared */ | ||
TEST_ASSERT_VAL("map groups don't match", mg == t1->mg); | ||
TEST_ASSERT_VAL("map groups don't match", mg == t2->mg); | ||
TEST_ASSERT_VAL("map groups don't match", mg == t3->mg); | ||
|
||
/* | ||
* Verify the other leader was created by previous call. | ||
* It should have shared map groups with no change in | ||
* refcnt. | ||
*/ | ||
other_leader = machine__find_thread(machine, 4, 4); | ||
TEST_ASSERT_VAL("failed to find other leader", other_leader); | ||
|
||
other_mg = other->mg; | ||
TEST_ASSERT_VAL("wrong refcnt", other_mg->refcnt == 2); | ||
|
||
TEST_ASSERT_VAL("map groups don't match", other_mg == other_leader->mg); | ||
|
||
/* release thread group */ | ||
thread__delete(leader); | ||
TEST_ASSERT_VAL("wrong refcnt", mg->refcnt == 3); | ||
|
||
thread__delete(t1); | ||
TEST_ASSERT_VAL("wrong refcnt", mg->refcnt == 2); | ||
|
||
thread__delete(t2); | ||
TEST_ASSERT_VAL("wrong refcnt", mg->refcnt == 1); | ||
|
||
thread__delete(t3); | ||
|
||
/* release other group */ | ||
thread__delete(other_leader); | ||
TEST_ASSERT_VAL("wrong refcnt", other_mg->refcnt == 1); | ||
|
||
thread__delete(other); | ||
|
||
/* | ||
* Cannot call machine__delete_threads(machine) now, | ||
* because we've already released all the threads. | ||
*/ | ||
|
||
machines__exit(&machines); | ||
return 0; | ||
} |