diff options
author | Manish Varma <varmam@google.com> | 2021-08-10 15:07:55 -0700 |
---|---|---|
committer | Manish Varma <varmam@google.com> | 2021-08-13 14:57:57 -0700 |
commit | 5e3700ea441ff21328b0cd1f417974feaf30153c (patch) | |
tree | 538073ef06289b37e6463f16240a47df4a28c3d4 /suspend/1.0/default/SystemSuspend.h | |
parent | e2f08410be0dc611b674db50c68f8a15c78cbffa (diff) | |
download | interfaces-5e3700ea441ff21328b0cd1f417974feaf30153c.tar.gz |
system_suspend: allow SystemSuspend to re-open the fd if found stale
Based on the BR it is evedent that when kernel fails to write any
wakeup reasons in /sys/kernel/wakeup_reasons/last_resume_reason, i.e.
if the file is read empty by system_suspend then the file descriptor
associated with that file becomes stale and cannot read the file
contents anymore, and all the subsequent attempts to read the
wakeup_reason returns empty which causes flurry of "unknown" wakeup
reasons.
Also, kernel only writes the wakeup reason in the sysfs node upon read()
call to the sysfs node, and hence it is not possible to know ahead of
time if the kernel is going to return empty file.
While we cannot prevent this error condition, we can certainly receover
re-opening the fd associated with "last_resume_reason" file.
Since it's main that opens all the files and pass their file descriptors
to SystemSuspend.cpp to do further file handling. This change will
re-open file for that stale fd using "/proc/self/fd/<fd>" when it
detects the failure condition, i.e. when an attempt to read
last_resume_reason file returns empty.
Bug: 192813633
Test: SystemSuspendV1_0UnitTest
Signed-off-by: Manish Varma <varmam@google.com>
Change-Id: I9e142f6526a1c0f836202725b593c624536c0f64
Diffstat (limited to 'suspend/1.0/default/SystemSuspend.h')
-rw-r--r-- | suspend/1.0/default/SystemSuspend.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/suspend/1.0/default/SystemSuspend.h b/suspend/1.0/default/SystemSuspend.h index 5632325..e5a0e84 100644 --- a/suspend/1.0/default/SystemSuspend.h +++ b/suspend/1.0/default/SystemSuspend.h @@ -114,6 +114,7 @@ class SystemSuspend : public ISystemSuspend { Result<SuspendStats> getSuspendStats(); void getSuspendInfo(SuspendInfo* info); std::chrono::milliseconds getSleepTime() const; + unique_fd reopenFileUsingFd(const int pid, const int fd, int permission); private: void initAutosuspend(); |