diff options
author | Li Li <dualli@google.com> | 2021-09-15 04:00:04 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2021-09-15 04:00:04 +0000 |
commit | 4095348d8f6d5472289eecebe03ecd667684c247 (patch) | |
tree | 18ab058001db29e61922f0c402026f129bc0cf18 | |
parent | 81274cba0f038554c7ce58421676042df6c8de10 (diff) | |
parent | 60d69037e7d8dd2271d9da33d1a5f2643fc29f33 (diff) | |
download | native-4095348d8f6d5472289eecebe03ecd667684c247.tar.gz |
Merge "getProcessFreezeInfo reads more info from kernel" into sc-qpr1-dev
-rw-r--r-- | libs/binder/IPCThreadState.cpp | 19 | ||||
-rw-r--r-- | libs/binder/binder_module.h | 2 | ||||
-rw-r--r-- | libs/binder/include/binder/IPCThreadState.h | 7 | ||||
-rw-r--r-- | libs/binder/libbinder.arm32.map | 1 | ||||
-rw-r--r-- | libs/binder/libbinder.arm64.map | 1 | ||||
-rw-r--r-- | libs/binder/tests/binderLibTest.cpp | 35 |
6 files changed, 51 insertions, 14 deletions
diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp index 445df9eeff..c415ea02e2 100644 --- a/libs/binder/IPCThreadState.cpp +++ b/libs/binder/IPCThreadState.cpp @@ -1398,6 +1398,25 @@ status_t IPCThreadState::getProcessFreezeInfo(pid_t pid, bool *sync_received, bo return ret; } +#ifndef __ANDROID_VNDK__ +status_t IPCThreadState::getProcessFreezeInfo(pid_t pid, uint32_t *sync_received, + uint32_t *async_received) +{ + int ret = 0; + binder_frozen_status_info info; + info.pid = pid; + +#if defined(__ANDROID__) + if (ioctl(self()->mProcess->mDriverFD, BINDER_GET_FROZEN_INFO, &info) < 0) + ret = -errno; +#endif + *sync_received = info.sync_recv; + *async_received = info.async_recv; + + return ret; +} +#endif + status_t IPCThreadState::freeze(pid_t pid, bool enable, uint32_t timeout_ms) { struct binder_freeze_info info; int ret = 0; diff --git a/libs/binder/binder_module.h b/libs/binder/binder_module.h index 9dea3b448b..793795e1d4 100644 --- a/libs/binder/binder_module.h +++ b/libs/binder/binder_module.h @@ -74,6 +74,8 @@ struct binder_frozen_status_info { // // Indicates whether the process has received any sync calls since last // freeze (cleared at freeze/unfreeze) + // bit 0: received sync transaction after being frozen + // bit 1: new pending sync transaction during freezing // __u32 sync_recv; // diff --git a/libs/binder/include/binder/IPCThreadState.h b/libs/binder/include/binder/IPCThreadState.h index 196a41ba55..b401ea96cb 100644 --- a/libs/binder/include/binder/IPCThreadState.h +++ b/libs/binder/include/binder/IPCThreadState.h @@ -53,6 +53,13 @@ public: // Provide information about the state of a frozen process static status_t getProcessFreezeInfo(pid_t pid, bool *sync_received, bool *async_received); + + // TODO: Remove the above legacy duplicated function in next version +#ifndef __ANDROID_VNDK__ + static status_t getProcessFreezeInfo(pid_t pid, uint32_t *sync_received, + uint32_t *async_received); +#endif + sp<ProcessState> process(); status_t clearLastError(); diff --git a/libs/binder/libbinder.arm32.map b/libs/binder/libbinder.arm32.map index f26c33dff5..9f10b677bd 100644 --- a/libs/binder/libbinder.arm32.map +++ b/libs/binder/libbinder.arm32.map @@ -149,6 +149,7 @@ LIBBINDER { _ZN7android14IPCThreadState20clearCallingIdentityEv; _ZN7android14IPCThreadState20getAndExecuteCommandEv; _ZN7android14IPCThreadState20getProcessFreezeInfoEiPbS1_; + _ZN7android14IPCThreadState20getProcessFreezeInfoEiPjS1_; _ZN7android14IPCThreadState20handlePolledCommandsEv; _ZN7android14IPCThreadState20processPendingDerefsEv; _ZN7android14IPCThreadState20writeTransactionDataEijijRKNS_6ParcelEPi; diff --git a/libs/binder/libbinder.arm64.map b/libs/binder/libbinder.arm64.map index 62112502ab..1d3da4c81a 100644 --- a/libs/binder/libbinder.arm64.map +++ b/libs/binder/libbinder.arm64.map @@ -150,6 +150,7 @@ LIBBINDER { _ZN7android14IPCThreadState20clearCallingIdentityEv; _ZN7android14IPCThreadState20getAndExecuteCommandEv; _ZN7android14IPCThreadState20getProcessFreezeInfoEiPbS1_; + _ZN7android14IPCThreadState20getProcessFreezeInfoEiPjS1_; _ZN7android14IPCThreadState20handlePolledCommandsEv; _ZN7android14IPCThreadState20processPendingDerefsEv; _ZN7android14IPCThreadState20writeTransactionDataEijijRKNS_6ParcelEPi; diff --git a/libs/binder/tests/binderLibTest.cpp b/libs/binder/tests/binderLibTest.cpp index 5612d1db66..64196ba30f 100644 --- a/libs/binder/tests/binderLibTest.cpp +++ b/libs/binder/tests/binderLibTest.cpp @@ -425,31 +425,30 @@ TEST_F(BinderLibTest, NopTransactionClear) { TEST_F(BinderLibTest, Freeze) { Parcel data, reply, replypid; - std::ifstream freezer_file("/sys/fs/cgroup/freezer/cgroup.freeze"); + std::ifstream freezer_file("/sys/fs/cgroup/uid_0/cgroup.freeze"); - //Pass test on devices where the freezer is not supported + // Pass test on devices where the cgroup v2 freezer is not supported if (freezer_file.fail()) { GTEST_SKIP(); return; } - std::string freezer_enabled; - std::getline(freezer_file, freezer_enabled); - - //Pass test on devices where the freezer is disabled - if (freezer_enabled != "1") { - GTEST_SKIP(); - return; - } - EXPECT_THAT(m_server->transact(BINDER_LIB_TEST_GETPID, data, &replypid), StatusEq(NO_ERROR)); int32_t pid = replypid.readInt32(); for (int i = 0; i < 10; i++) { EXPECT_EQ(NO_ERROR, m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION_WAIT, data, &reply, TF_ONE_WAY)); } - EXPECT_EQ(-EAGAIN, IPCThreadState::self()->freeze(pid, 1, 0)); - EXPECT_EQ(-EAGAIN, IPCThreadState::self()->freeze(pid, 1, 0)); - EXPECT_EQ(NO_ERROR, IPCThreadState::self()->freeze(pid, 1, 1000)); + + // Pass test on devices where BINDER_FREEZE ioctl is not supported + int ret = IPCThreadState::self()->freeze(pid, false, 0); + if (ret != 0) { + GTEST_SKIP(); + return; + } + + EXPECT_EQ(-EAGAIN, IPCThreadState::self()->freeze(pid, true, 0)); + EXPECT_EQ(-EAGAIN, IPCThreadState::self()->freeze(pid, true, 0)); + EXPECT_EQ(NO_ERROR, IPCThreadState::self()->freeze(pid, true, 1000)); EXPECT_EQ(FAILED_TRANSACTION, m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply)); bool sync_received, async_received; @@ -460,6 +459,14 @@ TEST_F(BinderLibTest, Freeze) { EXPECT_EQ(sync_received, 1); EXPECT_EQ(async_received, 0); + uint32_t sync_received2, async_received2; + + EXPECT_EQ(NO_ERROR, IPCThreadState::self()->getProcessFreezeInfo(pid, &sync_received2, + &async_received2)); + + EXPECT_EQ(sync_received2, 1); + EXPECT_EQ(async_received2, 0); + EXPECT_EQ(NO_ERROR, IPCThreadState::self()->freeze(pid, 0, 0)); EXPECT_EQ(NO_ERROR, m_server->transact(BINDER_LIB_TEST_NOP_TRANSACTION, data, &reply)); } |