continue read file when returned count > 0

In android, we met a lot of watchdog timeout which
caused by read file "/d/wakeup_sources".

The root cause is that in kernel side wakeup.c, it uses single_open()
interface to show the stats. But single_open() interface
requires that the whole output must fit into a single
buffer(physical continuous). This will lead to timeout when system
memory is not in a good situation.

Problem in kenrel side has been merged in [1]. Then kernel will return
max a page bytes to user space. So in KernelWakelockReader, we
need to read again when returned count > 0.

[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v5.0-rc4&id=00ee22c28915d111ba415750a3311d7678fd1206

Change-Id: If7886514c609c8d6338532c67c1cee79f2754ab1
Signed-off-by: Ganesh Mahendran <opensource.ganesh@gmail.com>
This commit is contained in:
Ganesh Mahendran
2018-03-05 19:07:06 +08:00
parent fad9571dc5
commit baff465f66

View File

@@ -66,7 +66,7 @@ public class KernelWakelockReader {
*/
public final KernelWakelockStats readKernelWakelockStats(KernelWakelockStats staleStats) {
byte[] buffer = new byte[32*1024];
int len;
int len = 0;
boolean wakeup_sources;
final long startTime = SystemClock.uptimeMillis();
@@ -87,7 +87,11 @@ public class KernelWakelockReader {
}
}
len = is.read(buffer);
int cnt;
while ((cnt = is.read(buffer, len, buffer.length - len)) > 0) {
len += cnt;
}
is.close();
} catch (java.io.IOException e) {
Slog.wtf(TAG, "failed to read kernel wakelocks", e);