aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLingfeng Yang <lfy@google.com>2020-05-29 18:45:54 -0700
committerLingfeng Yang <lfy@google.com>2020-05-30 01:47:08 +0000
commitce8c0591be4b1b5d0b30b9ea71357556c2d117c2 (patch)
treebfba27118bd578544691c9e1582daa1a8adb994e
parent6a2544969bfdb0e72aa9f70678ab4287e3ae4785 (diff)
downloaddevice_generic_goldfish-opengl-ce8c0591be4b1b5d0b30b9ea71357556c2d117c2.tar.gz
device_generic_goldfish-opengl-ce8c0591be4b1b5d0b30b9ea71357556c2d117c2.tar.bz2
device_generic_goldfish-opengl-ce8c0591be4b1b5d0b30b9ea71357556c2d117c2.zip
asg: add a backoff to the guest
if the host is slow lets wait for it, don't priority invert Change-Id: If680b01098c7f3918fa9dbcf6b0683ec49bbc888
-rw-r--r--system/OpenglSystemCommon/AddressSpaceStream.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/system/OpenglSystemCommon/AddressSpaceStream.cpp b/system/OpenglSystemCommon/AddressSpaceStream.cpp
index ce7c7209..7c0f1546 100644
--- a/system/OpenglSystemCommon/AddressSpaceStream.cpp
+++ b/system/OpenglSystemCommon/AddressSpaceStream.cpp
@@ -388,7 +388,12 @@ ssize_t AddressSpaceStream::speculativeRead(unsigned char* readBuffer, size_t tr
ensureType1Finished();
size_t actuallyRead = 0;
+ size_t readIters = 0;
+ size_t backedOffIters = 0;
+ const size_t kSpeculativeReadBackoffIters = 10000000ULL;
while (!actuallyRead) {
+ ++readIters;
+
uint32_t readAvail =
ring_buffer_available_read(
m_context.from_host_large_xfer.ring,
@@ -399,6 +404,11 @@ ssize_t AddressSpaceStream::speculativeRead(unsigned char* readBuffer, size_t tr
continue;
}
+ if (readAvail && readIters > kSpeculativeReadBackoffIters) {
+ usleep(10);
+ ++backedOffIters;
+ }
+
uint32_t toRead = readAvail > trySize ? trySize : readAvail;
long stepsRead = ring_buffer_view_read(
@@ -413,6 +423,12 @@ ssize_t AddressSpaceStream::speculativeRead(unsigned char* readBuffer, size_t tr
}
}
+ if (backedOffIters > 0) {
+ ALOGE("%s: warning: backed off %zu times due to host slowness.\n",
+ __func__,
+ backedOffIters);
+ }
+
return actuallyRead;
}