From c14d7f0a30c7a72d0f0906a75f268003e64c2df6 Mon Sep 17 00:00:00 2001 From: Alex Vakulenko Date: Mon, 11 Jul 2016 17:26:35 -0700 Subject: [PATCH] Fix pty.bug_28979140 test in Bionic The test relies on the fact/assumes that CPU 0 is available to the test process. This is not necessarily the case. Instead of allocating CPU 0 to the main thread, find the first available CPU and use that instead. BUG=b/29991929 TEST=dreamos/platform/buildbot/integration_tests.py --test_filter "bionic_app_tests" Change-Id: I36b311cdba57112d663d652757fd5114183fc780 --- tests/pty_test.cpp | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/tests/pty_test.cpp b/tests/pty_test.cpp index a3714341b..74415d539 100644 --- a/tests/pty_test.cpp +++ b/tests/pty_test.cpp @@ -72,17 +72,18 @@ TEST(pty, forkpty) { } struct PtyReader_28979140_Arg { - int slave_fd; - uint32_t data_count; - bool finished; - std::atomic matched; + int main_cpu_id; + int slave_fd; + uint32_t data_count; + bool finished; + std::atomic matched; }; static void PtyReader_28979140(PtyReader_28979140_Arg* arg) { arg->finished = false; cpu_set_t cpus; ASSERT_EQ(0, sched_getaffinity(0, sizeof(cpu_set_t), &cpus)); - CPU_CLR(0, &cpus); + CPU_CLR(arg->main_cpu_id, &cpus); ASSERT_EQ(0, sched_setaffinity(0, sizeof(cpu_set_t), &cpus)); uint32_t counter = 0; @@ -105,7 +106,9 @@ static void PtyReader_28979140(PtyReader_28979140_Arg* arg) { TEST(pty, bug_28979140) { // This test is to test a kernel bug, which uses a lock free ring-buffer to // pass data through a raw pty, but missing necessary memory barriers. - if (sysconf(_SC_NPROCESSORS_ONLN) == 1) { + cpu_set_t cpus; + ASSERT_EQ(0, sched_getaffinity(0, sizeof(cpu_set_t), &cpus)); + if (CPU_COUNT(&cpus) < 2) { GTEST_LOG_(INFO) << "This test tests bug happens only on multiprocessors."; return; } @@ -120,9 +123,20 @@ TEST(pty, bug_28979140) { cfmakeraw(&tattr); ASSERT_EQ(0, tcsetattr(slave, TCSADRAIN, &tattr)); - // 2. Create thread for slave reader. - pthread_t thread; + // 2. Make master thread and slave thread running on different cpus: + // master thread uses first available cpu, and slave thread uses other cpus. PtyReader_28979140_Arg arg; + arg.main_cpu_id = -1; + for (int i = 0; i < CPU_SETSIZE; i++) { + if (CPU_ISSET(i, &cpus)) { + arg.main_cpu_id = i; + break; + } + } + ASSERT_GE(arg.main_cpu_id, 0); + + // 3. Create thread for slave reader. + pthread_t thread; arg.slave_fd = slave; arg.data_count = TEST_DATA_COUNT; arg.matched = true; @@ -130,11 +144,8 @@ TEST(pty, bug_28979140) { reinterpret_cast(PtyReader_28979140), &arg)); - // 3. Make master thread and slave thread running on different cpus: - // master thread uses cpu 0, and slave thread uses other cpus. - cpu_set_t cpus; CPU_ZERO(&cpus); - CPU_SET(0, &cpus); + CPU_SET(arg.main_cpu_id, &cpus); ASSERT_EQ(0, sched_setaffinity(0, sizeof(cpu_set_t), &cpus)); // 4. Send data to slave.