Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e218fc67 authored by Elliott Hughes's avatar Elliott Hughes Committed by Gerrit Code Review
Browse files

Merge "Replace the "coldboot" timeout with a property."

parents 4b447530 331cf2fb
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -121,7 +121,7 @@ void Action::ExecuteCommand(const Command& command) const {
    Timer t;
    Timer t;
    int result = command.InvokeFunc();
    int result = command.InvokeFunc();


    double duration_ms = t.duration() * 1000;
    double duration_ms = t.duration_s() * 1000;
    // Any action longer than 50ms will be warned to user as slow operation
    // Any action longer than 50ms will be warned to user as slow operation
    if (duration_ms > 50.0 ||
    if (duration_ms > 50.0 ||
        android::base::GetMinimumLogSeverity() <= android::base::DEBUG) {
        android::base::GetMinimumLogSeverity() <= android::base::DEBUG) {
+4 −6
Original line number Original line Diff line number Diff line
@@ -146,8 +146,7 @@ static int wipe_data_via_recovery(const std::string& reason) {
        LOG(ERROR) << "failed to set bootloader message: " << err;
        LOG(ERROR) << "failed to set bootloader message: " << err;
        return -1;
        return -1;
    }
    }
    android_reboot(ANDROID_RB_RESTART2, 0, "recovery");
    reboot("recovery");
    while (1) { pause(); }  // never reached
}
}


static void unmount_and_fsck(const struct mntent *entry) {
static void unmount_and_fsck(const struct mntent *entry) {
@@ -727,7 +726,7 @@ static int do_powerctl(const std::vector<std::string>& args) {
        ServiceManager::GetInstance().ForEachService(
        ServiceManager::GetInstance().ForEachService(
            [] (Service* s) { s->Terminate(); });
            [] (Service* s) { s->Terminate(); });


        while (t.duration() < delay) {
        while (t.duration_s() < delay) {
            ServiceManager::GetInstance().ReapAnyOutstandingChildren();
            ServiceManager::GetInstance().ReapAnyOutstandingChildren();


            int service_count = 0;
            int service_count = 0;
@@ -751,11 +750,10 @@ static int do_powerctl(const std::vector<std::string>& args) {
            // Wait a bit before recounting the number or running services.
            // Wait a bit before recounting the number or running services.
            std::this_thread::sleep_for(50ms);
            std::this_thread::sleep_for(50ms);
        }
        }
        LOG(VERBOSE) << "Terminating running services took " << t.duration() << " seconds";
        LOG(VERBOSE) << "Terminating running services took " << t;
    }
    }


    return android_reboot_with_callback(cmd, 0, reboot_target,
    return android_reboot_with_callback(cmd, 0, reboot_target, callback_on_ro_remount);
                                        callback_on_ro_remount);
}
}


static int do_trigger(const std::vector<std::string>& args) {
static int do_trigger(const std::vector<std::string>& args) {
+2 −2
Original line number Original line Diff line number Diff line
@@ -868,7 +868,7 @@ static void handle_firmware_event(uevent* uevent) {
    if (pid == 0) {
    if (pid == 0) {
        Timer t;
        Timer t;
        process_firmware_event(uevent);
        process_firmware_event(uevent);
        LOG(INFO) << "loading " << uevent->path << " took " << t.duration() << "s";
        LOG(INFO) << "loading " << uevent->path << " took " << t;
        _exit(EXIT_SUCCESS);
        _exit(EXIT_SUCCESS);
    } else if (pid == -1) {
    } else if (pid == -1) {
        PLOG(ERROR) << "could not fork to process firmware event for " << uevent->firmware;
        PLOG(ERROR) << "could not fork to process firmware event for " << uevent->firmware;
@@ -1043,7 +1043,7 @@ void device_init() {
    coldboot("/sys/block");
    coldboot("/sys/block");
    coldboot("/sys/devices");
    coldboot("/sys/devices");
    close(open(COLDBOOT_DONE, O_WRONLY|O_CREAT|O_CLOEXEC, 0000));
    close(open(COLDBOOT_DONE, O_WRONLY|O_CREAT|O_CLOEXEC, 0000));
    LOG(INFO) << "Coldboot took " << t.duration() << "s.";
    LOG(INFO) << "Coldboot took " << t;
}
}


int get_device_fd() {
int get_device_fd() {
+23 −12
Original line number Original line Diff line number Diff line
@@ -43,7 +43,6 @@
#include <android-base/file.h>
#include <android-base/file.h>
#include <android-base/stringprintf.h>
#include <android-base/stringprintf.h>
#include <android-base/strings.h>
#include <android-base/strings.h>
#include <cutils/android_reboot.h>
#include <cutils/fs.h>
#include <cutils/fs.h>
#include <cutils/iosched_policy.h>
#include <cutils/iosched_policy.h>
#include <cutils/list.h>
#include <cutils/list.h>
@@ -163,14 +162,21 @@ static int wait_for_coldboot_done_action(const std::vector<std::string>& args) {
    Timer t;
    Timer t;


    LOG(VERBOSE) << "Waiting for " COLDBOOT_DONE "...";
    LOG(VERBOSE) << "Waiting for " COLDBOOT_DONE "...";
    // Any longer than 1s is an unreasonable length of time to delay booting.

    // If you're hitting this timeout, check that you didn't make your
    // Historically we had a 1s timeout here because we weren't otherwise
    // sepolicy regular expressions too expensive (http://b/19899875).
    // tracking boot time, and many OEMs made their sepolicy regular
    if (wait_for_file(COLDBOOT_DONE, 1s)) {
    // expressions too expensive (http://b/19899875).

    // Now we're tracking boot time, just log the time taken to a system
    // property. We still panic if it takes more than a minute though,
    // because any build that slow isn't likely to boot at all, and we'd
    // rather any test lab devices fail back to the bootloader.
    if (wait_for_file(COLDBOOT_DONE, 60s) < 0) {
        LOG(ERROR) << "Timed out waiting for " COLDBOOT_DONE;
        LOG(ERROR) << "Timed out waiting for " COLDBOOT_DONE;
        panic();
    }
    }


    LOG(VERBOSE) << "Waiting for " COLDBOOT_DONE " took " << t.duration() << "s.";
    property_set("ro.boottime.init.cold_boot_wait", std::to_string(t.duration_ns()).c_str());
    return 0;
    return 0;
}
}


@@ -409,9 +415,8 @@ static int audit_callback(void *data, security_class_t /*cls*/, char *buf, size_
}
}


static void security_failure() {
static void security_failure() {
    LOG(ERROR) << "Security failure; rebooting into recovery mode...";
    LOG(ERROR) << "Security failure...";
    android_reboot(ANDROID_RB_RESTART2, 0, "recovery");
    panic();
    while (true) { pause(); }  // never reached
}
}


static void selinux_initialize(bool in_kernel_domain) {
static void selinux_initialize(bool in_kernel_domain) {
@@ -443,8 +448,8 @@ static void selinux_initialize(bool in_kernel_domain) {
            security_failure();
            security_failure();
        }
        }


        LOG(INFO) << "(Initializing SELinux " << (is_enforcing ? "enforcing" : "non-enforcing")
        // init's first stage can't set properties, so pass the time to the second stage.
                  << " took " << t.duration() << "s.)";
        setenv("INIT_SELINUX_TOOK", std::to_string(t.duration_ns()).c_str(), 1);
    } else {
    } else {
        selinux_init_all_handles();
        selinux_init_all_handles();
    }
    }
@@ -650,7 +655,13 @@ int main(int argc, char** argv) {
        export_kernel_boot_props();
        export_kernel_boot_props();


        // Make the time that init started available for bootstat to log.
        // Make the time that init started available for bootstat to log.
        property_set("init.start", getenv("INIT_STARTED_AT"));
        property_set("ro.boottime.init", getenv("INIT_STARTED_AT"));
        property_set("ro.boottime.init.selinux", getenv("INIT_SELINUX_TOOK"));

        // Clean up our environment.
        unsetenv("INIT_SECOND_STAGE");
        unsetenv("INIT_STARTED_AT");
        unsetenv("INIT_SELINUX_TOOK");


        // Now set up SELinux for second stage.
        // Now set up SELinux for second stage.
        selinux_initialize(false);
        selinux_initialize(false);
+1 −1
Original line number Original line Diff line number Diff line
@@ -110,7 +110,7 @@ bool Parser::ParseConfigFile(const std::string& path) {
    // Nexus 9 boot time, so it's disabled by default.
    // Nexus 9 boot time, so it's disabled by default.
    if (false) DumpState();
    if (false) DumpState();


    LOG(VERBOSE) << "(Parsing " << path << " took " << t.duration() << "s.)";
    LOG(VERBOSE) << "(Parsing " << path << " took " << t << ".)";
    return true;
    return true;
}
}


Loading