Warn loudly and do not set bpf.progs_loaded property on critical bpf load failure.
Reasoning: critical load failures for netd bpf programs will just result
in unpredictable behaviour later on. For example netd/systemserver
crash loops.
Test: builds
Bug: 150040815
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Iefa01e60cd0a9a223e96411726a199bfb4857a5a
diff --git a/bpfloader/BpfLoader.cpp b/bpfloader/BpfLoader.cpp
index 9e348e5..e67c469 100644
--- a/bpfloader/BpfLoader.cpp
+++ b/bpfloader/BpfLoader.cpp
@@ -53,7 +53,8 @@
#define BPF_PROG_PATH "/system/etc/bpf/"
-void loadAllElfObjects(void) {
+int loadAllElfObjects(void) {
+ int retVal = 0;
DIR* dir;
struct dirent* ent;
@@ -64,21 +65,35 @@
string progPath = BPF_PROG_PATH + s;
- int ret = android::bpf::loadProg(progPath.c_str());
- ALOGI("Attempted load object: %s, ret: %s", progPath.c_str(), std::strerror(-ret));
+ bool critical;
+ int ret = android::bpf::loadProg(progPath.c_str(), &critical);
+ if (ret) {
+ if (critical) retVal = ret;
+ ALOGE("Failed to load object: %s, ret: %s", progPath.c_str(), std::strerror(-ret));
+ } else {
+ ALOGI("Loaded object: %s", progPath.c_str());
+ }
}
closedir(dir);
}
+ return retVal;
}
int main() {
if (!android::bpf::isBpfSupported()) return 0;
// Load all ELF objects, create programs and maps, and pin them
- loadAllElfObjects();
+ if (loadAllElfObjects() != 0) {
+ ALOGE("=== CRITICAL FAILURE LOADING BPF PROGRAMS ===");
+ ALOGE("If this triggers reliably, you're probably missing kernel options or patches.");
+ ALOGE("If this triggers randomly, you might be hitting some memory allocation problems or "
+ "startup script race.");
+ ALOGE("--- DO NOT EXPECT SYSTEM TO BOOT SUCCESSFULLY ---");
+ return 2;
+ }
if (android::base::SetProperty("bpf.progs_loaded", "1") == false) {
- ALOGE("Failed to set bpf.progs_loaded property\n");
+ ALOGE("Failed to set bpf.progs_loaded property");
return 1;
}