init: Add diagnostics for signalfd epoll failures. Bug: 222441619 Test: inject failure with close, check for log messages Change-Id: Ia18b88841779e230d00a6c47aaed4952b1444f85
diff --git a/init/epoll.cpp b/init/epoll.cpp index 74d8aac..0580f86 100644 --- a/init/epoll.cpp +++ b/init/epoll.cpp
@@ -23,6 +23,8 @@ #include <functional> #include <map> +#include <android-base/logging.h> + namespace android { namespace init { @@ -42,8 +44,11 @@ if (!events) { return Error() << "Must specify events"; } - auto sp = std::make_shared<decltype(handler)>(std::move(handler)); - auto [it, inserted] = epoll_handlers_.emplace(fd, std::move(sp)); + + Info info; + info.events = events; + info.handler = std::make_shared<decltype(handler)>(std::move(handler)); + auto [it, inserted] = epoll_handlers_.emplace(fd, std::move(info)); if (!inserted) { return Error() << "Cannot specify two epoll handlers for a given FD"; } @@ -84,8 +89,14 @@ } std::vector<std::shared_ptr<Handler>> pending_functions; for (int i = 0; i < num_events; ++i) { - auto sp = *reinterpret_cast<std::shared_ptr<Handler>*>(ev[i].data.ptr); - pending_functions.emplace_back(std::move(sp)); + auto& info = *reinterpret_cast<Info*>(ev[i].data.ptr); + if ((info.events & (EPOLLIN | EPOLLPRI)) == (EPOLLIN | EPOLLPRI) && + (ev[i].events & EPOLLIN) != ev[i].events) { + // This handler wants to know about exception events, and just got one. + // Log something informational. + LOG(ERROR) << "Received unexpected epoll event set: " << ev[i].events; + } + pending_functions.emplace_back(info.handler); } return pending_functions;
diff --git a/init/epoll.h b/init/epoll.h index 0df5289..f58ae8d 100644 --- a/init/epoll.h +++ b/init/epoll.h
@@ -46,8 +46,13 @@ std::optional<std::chrono::milliseconds> timeout); private: + struct Info { + std::shared_ptr<Handler> handler; + uint32_t events; + }; + android::base::unique_fd epoll_fd_; - std::map<int, std::shared_ptr<Handler>> epoll_handlers_; + std::map<int, Info> epoll_handlers_; }; } // namespace init
diff --git a/init/init.cpp b/init/init.cpp index 1df4c44..9616805 100644 --- a/init/init.cpp +++ b/init/init.cpp
@@ -646,7 +646,8 @@ PLOG(FATAL) << "failed to create signalfd"; } - if (auto result = epoll->RegisterHandler(signal_fd, HandleSignalFd); !result.ok()) { + constexpr int flags = EPOLLIN | EPOLLPRI; + if (auto result = epoll->RegisterHandler(signal_fd, HandleSignalFd, flags); !result.ok()) { LOG(FATAL) << result.error(); } }
diff --git a/init/sigchld_handler.cpp b/init/sigchld_handler.cpp index 9b2c7d9..6fc64df 100644 --- a/init/sigchld_handler.cpp +++ b/init/sigchld_handler.cpp
@@ -95,7 +95,10 @@ LOG(INFO) << name << " received signal " << siginfo.si_status << wait_string; } - if (!service) return pid; + if (!service) { + LOG(INFO) << name << " did not have an associated service entry and will not be reaped"; + return pid; + } service->Reap(siginfo);