init: failed to set sys.usb.controller

With GKI we find in certain situations the timing of the drivers
loading is delayed as compared to a monolithic kernel.  This
introduces a race where during second stage init, the attributes
inside /sys/class/udc/ might not be set by the time
SetUsbController() is called.

To address this, we also call SetUsbController() until the property
sys.usb.controller is set at the bottom of the event loop.

Signed-off-by: Mark Salyzyn <salyzyn@google.com>
Bug: 151950334
Test: make sure user space fastbootd comes up reliably for a GKI kernel
Change-Id: Iececd8ffa3e6641554d215d622d8dab72d85d34d
This commit is contained in:
Mark Salyzyn 2020-05-12 18:13:14 -07:00
parent 7937f29be8
commit 6fca594fc2

View file

@ -509,7 +509,9 @@ static Result<void> queue_property_triggers_action(const BuiltinArguments& args)
// Set the UDC controller for the ConfigFS USB Gadgets.
// Read the UDC controller in use from "/sys/class/udc".
// In case of multiple UDC controllers select the first one.
static void set_usb_controller() {
static void SetUsbController() {
static auto controller_set = false;
if (controller_set) return;
std::unique_ptr<DIR, decltype(&closedir)>dir(opendir("/sys/class/udc"), closedir);
if (!dir) return;
@ -518,6 +520,7 @@ static void set_usb_controller() {
if (dp->d_name[0] == '.') continue;
SetProperty("sys.usb.controller", dp->d_name);
controller_set = true;
break;
}
}
@ -772,7 +775,7 @@ int SecondStageMain(int argc, char** argv) {
fs_mgr_vendor_overlay_mount_all();
export_oem_lock_status();
MountHandler mount_handler(&epoll);
set_usb_controller();
SetUsbController();
const BuiltinFunctionMap& function_map = GetBuiltinFunctionMap();
Action::set_function_map(&function_map);
@ -879,6 +882,7 @@ int SecondStageMain(int argc, char** argv) {
}
if (!IsShuttingDown()) {
HandleControlMessages();
SetUsbController();
}
}