Loading llkd/README.md +8 −1 Original line number Original line Diff line number Diff line Loading @@ -89,7 +89,14 @@ Android Properties Android Properties llkd respond to (*prop*_ms parms are in milliseconds): Android Properties llkd respond to (*prop*_ms parms are in milliseconds): #### ro.config.low_ram #### ro.config.low_ram default false, if true do not sysrq t (dump all threads). device is configured with limited memory. #### ro.debuggable device is configured for userdebug or eng build. #### ro.llk.sysrq_t default not ro.config.low_ram, or ro.debuggable if property is "eng". if true do sysrq t (dump all threads). #### ro.llk.enable #### ro.llk.enable default false, allow live-lock daemon to be enabled. default false, allow live-lock daemon to be enabled. Loading llkd/include/llkd.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -35,6 +35,8 @@ unsigned llkCheckMilliseconds(void); #define LLK_ENABLE_DEFAULT false /* "eng" and userdebug true */ #define LLK_ENABLE_DEFAULT false /* "eng" and userdebug true */ #define KHT_ENABLE_WRITEABLE_PROPERTY "khungtask.enable" #define KHT_ENABLE_WRITEABLE_PROPERTY "khungtask.enable" #define KHT_ENABLE_PROPERTY "ro." KHT_ENABLE_WRITEABLE_PROPERTY #define KHT_ENABLE_PROPERTY "ro." KHT_ENABLE_WRITEABLE_PROPERTY #define LLK_ENABLE_SYSRQ_T_PROPERTY "ro.llk.sysrq_t" #define LLK_ENABLE_SYSRQ_T_DEFAULT true #define LLK_MLOCKALL_PROPERTY "ro.llk.mlockall" #define LLK_MLOCKALL_PROPERTY "ro.llk.mlockall" #define LLK_MLOCKALL_DEFAULT true #define LLK_MLOCKALL_DEFAULT true #define LLK_KILLTEST_PROPERTY "ro.llk.killtest" #define LLK_KILLTEST_PROPERTY "ro.llk.killtest" Loading llkd/libllkd.cpp +15 −4 Original line number Original line Diff line number Diff line Loading @@ -85,6 +85,7 @@ milliseconds llkStateTimeoutMs[llkNumStates]; // timeout override for eac milliseconds llkCheckMs; // checking interval to inspect any milliseconds llkCheckMs; // checking interval to inspect any // persistent live-locked states // persistent live-locked states bool llkLowRam; // ro.config.low_ram bool llkLowRam; // ro.config.low_ram bool llkEnableSysrqT = LLK_ENABLE_SYSRQ_T_DEFAULT; // sysrq stack trace dump bool khtEnable = LLK_ENABLE_DEFAULT; // [khungtaskd] panic bool khtEnable = LLK_ENABLE_DEFAULT; // [khungtaskd] panic // [khungtaskd] should have a timeout beyond the granularity of llkTimeoutMs. // [khungtaskd] should have a timeout beyond the granularity of llkTimeoutMs. // Provides a wide angle of margin b/c khtTimeout is also its granularity. // Provides a wide angle of margin b/c khtTimeout is also its granularity. Loading Loading @@ -525,7 +526,7 @@ void llkPanicKernel(bool dump, pid_t tid, const char* state) { android::base::WriteStringToFd("d", sysrqTriggerFd); android::base::WriteStringToFd("d", sysrqTriggerFd); // This can trigger hardware watchdog, that is somewhat _ok_. // This can trigger hardware watchdog, that is somewhat _ok_. // But useless if pstore configured for <256KB, low ram devices ... // But useless if pstore configured for <256KB, low ram devices ... if (!llkLowRam) { if (llkEnableSysrqT) { android::base::WriteStringToFd("t", sysrqTriggerFd); android::base::WriteStringToFd("t", sysrqTriggerFd); } } ::usleep(200000); // let everything settle ::usleep(200000); // let everything settle Loading Loading @@ -799,6 +800,7 @@ void llkCheckSchedUpdate(proc* procp, const std::string& piddir) { void llkLogConfig(void) { void llkLogConfig(void) { LOG(INFO) << "ro.config.low_ram=" << llkFormat(llkLowRam) << "\n" LOG(INFO) << "ro.config.low_ram=" << llkFormat(llkLowRam) << "\n" << LLK_ENABLE_SYSRQ_T_PROPERTY "=" << llkFormat(llkEnableSysrqT) << "\n" << LLK_ENABLE_PROPERTY "=" << llkFormat(llkEnable) << "\n" << LLK_ENABLE_PROPERTY "=" << llkFormat(llkEnable) << "\n" << KHT_ENABLE_PROPERTY "=" << llkFormat(khtEnable) << "\n" << KHT_ENABLE_PROPERTY "=" << llkFormat(khtEnable) << "\n" << LLK_MLOCKALL_PROPERTY "=" << llkFormat(llkMlockall) << "\n" << LLK_MLOCKALL_PROPERTY "=" << llkFormat(llkMlockall) << "\n" Loading Loading @@ -1150,13 +1152,22 @@ unsigned llkCheckMilliseconds() { return duration_cast<milliseconds>(llkCheck()).count(); return duration_cast<milliseconds>(llkCheck()).count(); } } bool llkCheckEng(const std::string& property) { return android::base::GetProperty(property, "eng") == "eng"; } bool llkInit(const char* threadname) { bool llkInit(const char* threadname) { auto debuggable = android::base::GetBoolProperty("ro.debuggable", false); auto debuggable = android::base::GetBoolProperty("ro.debuggable", false); llkLowRam = android::base::GetBoolProperty("ro.config.low_ram", false); llkLowRam = android::base::GetBoolProperty("ro.config.low_ram", false); if (!LLK_ENABLE_DEFAULT && debuggable) { llkEnableSysrqT &= !llkLowRam; llkEnable = android::base::GetProperty(LLK_ENABLE_PROPERTY, "eng") == "eng"; if (debuggable) { khtEnable = android::base::GetProperty(KHT_ENABLE_PROPERTY, "eng") == "eng"; llkEnableSysrqT |= llkCheckEng(LLK_ENABLE_SYSRQ_T_PROPERTY); if (!LLK_ENABLE_DEFAULT) { // NB: default is currently true ... llkEnable |= llkCheckEng(LLK_ENABLE_PROPERTY); khtEnable |= llkCheckEng(KHT_ENABLE_PROPERTY); } } } llkEnableSysrqT = android::base::GetBoolProperty(LLK_ENABLE_SYSRQ_T_PROPERTY, llkEnableSysrqT); llkEnable = android::base::GetBoolProperty(LLK_ENABLE_PROPERTY, llkEnable); llkEnable = android::base::GetBoolProperty(LLK_ENABLE_PROPERTY, llkEnable); if (llkEnable && !llkTopDirectory.reset(procdir)) { if (llkEnable && !llkTopDirectory.reset(procdir)) { // Most likely reason we could be here is llkd was started // Most likely reason we could be here is llkd was started Loading Loading
llkd/README.md +8 −1 Original line number Original line Diff line number Diff line Loading @@ -89,7 +89,14 @@ Android Properties Android Properties llkd respond to (*prop*_ms parms are in milliseconds): Android Properties llkd respond to (*prop*_ms parms are in milliseconds): #### ro.config.low_ram #### ro.config.low_ram default false, if true do not sysrq t (dump all threads). device is configured with limited memory. #### ro.debuggable device is configured for userdebug or eng build. #### ro.llk.sysrq_t default not ro.config.low_ram, or ro.debuggable if property is "eng". if true do sysrq t (dump all threads). #### ro.llk.enable #### ro.llk.enable default false, allow live-lock daemon to be enabled. default false, allow live-lock daemon to be enabled. Loading
llkd/include/llkd.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -35,6 +35,8 @@ unsigned llkCheckMilliseconds(void); #define LLK_ENABLE_DEFAULT false /* "eng" and userdebug true */ #define LLK_ENABLE_DEFAULT false /* "eng" and userdebug true */ #define KHT_ENABLE_WRITEABLE_PROPERTY "khungtask.enable" #define KHT_ENABLE_WRITEABLE_PROPERTY "khungtask.enable" #define KHT_ENABLE_PROPERTY "ro." KHT_ENABLE_WRITEABLE_PROPERTY #define KHT_ENABLE_PROPERTY "ro." KHT_ENABLE_WRITEABLE_PROPERTY #define LLK_ENABLE_SYSRQ_T_PROPERTY "ro.llk.sysrq_t" #define LLK_ENABLE_SYSRQ_T_DEFAULT true #define LLK_MLOCKALL_PROPERTY "ro.llk.mlockall" #define LLK_MLOCKALL_PROPERTY "ro.llk.mlockall" #define LLK_MLOCKALL_DEFAULT true #define LLK_MLOCKALL_DEFAULT true #define LLK_KILLTEST_PROPERTY "ro.llk.killtest" #define LLK_KILLTEST_PROPERTY "ro.llk.killtest" Loading
llkd/libllkd.cpp +15 −4 Original line number Original line Diff line number Diff line Loading @@ -85,6 +85,7 @@ milliseconds llkStateTimeoutMs[llkNumStates]; // timeout override for eac milliseconds llkCheckMs; // checking interval to inspect any milliseconds llkCheckMs; // checking interval to inspect any // persistent live-locked states // persistent live-locked states bool llkLowRam; // ro.config.low_ram bool llkLowRam; // ro.config.low_ram bool llkEnableSysrqT = LLK_ENABLE_SYSRQ_T_DEFAULT; // sysrq stack trace dump bool khtEnable = LLK_ENABLE_DEFAULT; // [khungtaskd] panic bool khtEnable = LLK_ENABLE_DEFAULT; // [khungtaskd] panic // [khungtaskd] should have a timeout beyond the granularity of llkTimeoutMs. // [khungtaskd] should have a timeout beyond the granularity of llkTimeoutMs. // Provides a wide angle of margin b/c khtTimeout is also its granularity. // Provides a wide angle of margin b/c khtTimeout is also its granularity. Loading Loading @@ -525,7 +526,7 @@ void llkPanicKernel(bool dump, pid_t tid, const char* state) { android::base::WriteStringToFd("d", sysrqTriggerFd); android::base::WriteStringToFd("d", sysrqTriggerFd); // This can trigger hardware watchdog, that is somewhat _ok_. // This can trigger hardware watchdog, that is somewhat _ok_. // But useless if pstore configured for <256KB, low ram devices ... // But useless if pstore configured for <256KB, low ram devices ... if (!llkLowRam) { if (llkEnableSysrqT) { android::base::WriteStringToFd("t", sysrqTriggerFd); android::base::WriteStringToFd("t", sysrqTriggerFd); } } ::usleep(200000); // let everything settle ::usleep(200000); // let everything settle Loading Loading @@ -799,6 +800,7 @@ void llkCheckSchedUpdate(proc* procp, const std::string& piddir) { void llkLogConfig(void) { void llkLogConfig(void) { LOG(INFO) << "ro.config.low_ram=" << llkFormat(llkLowRam) << "\n" LOG(INFO) << "ro.config.low_ram=" << llkFormat(llkLowRam) << "\n" << LLK_ENABLE_SYSRQ_T_PROPERTY "=" << llkFormat(llkEnableSysrqT) << "\n" << LLK_ENABLE_PROPERTY "=" << llkFormat(llkEnable) << "\n" << LLK_ENABLE_PROPERTY "=" << llkFormat(llkEnable) << "\n" << KHT_ENABLE_PROPERTY "=" << llkFormat(khtEnable) << "\n" << KHT_ENABLE_PROPERTY "=" << llkFormat(khtEnable) << "\n" << LLK_MLOCKALL_PROPERTY "=" << llkFormat(llkMlockall) << "\n" << LLK_MLOCKALL_PROPERTY "=" << llkFormat(llkMlockall) << "\n" Loading Loading @@ -1150,13 +1152,22 @@ unsigned llkCheckMilliseconds() { return duration_cast<milliseconds>(llkCheck()).count(); return duration_cast<milliseconds>(llkCheck()).count(); } } bool llkCheckEng(const std::string& property) { return android::base::GetProperty(property, "eng") == "eng"; } bool llkInit(const char* threadname) { bool llkInit(const char* threadname) { auto debuggable = android::base::GetBoolProperty("ro.debuggable", false); auto debuggable = android::base::GetBoolProperty("ro.debuggable", false); llkLowRam = android::base::GetBoolProperty("ro.config.low_ram", false); llkLowRam = android::base::GetBoolProperty("ro.config.low_ram", false); if (!LLK_ENABLE_DEFAULT && debuggable) { llkEnableSysrqT &= !llkLowRam; llkEnable = android::base::GetProperty(LLK_ENABLE_PROPERTY, "eng") == "eng"; if (debuggable) { khtEnable = android::base::GetProperty(KHT_ENABLE_PROPERTY, "eng") == "eng"; llkEnableSysrqT |= llkCheckEng(LLK_ENABLE_SYSRQ_T_PROPERTY); if (!LLK_ENABLE_DEFAULT) { // NB: default is currently true ... llkEnable |= llkCheckEng(LLK_ENABLE_PROPERTY); khtEnable |= llkCheckEng(KHT_ENABLE_PROPERTY); } } } llkEnableSysrqT = android::base::GetBoolProperty(LLK_ENABLE_SYSRQ_T_PROPERTY, llkEnableSysrqT); llkEnable = android::base::GetBoolProperty(LLK_ENABLE_PROPERTY, llkEnable); llkEnable = android::base::GetBoolProperty(LLK_ENABLE_PROPERTY, llkEnable); if (llkEnable && !llkTopDirectory.reset(procdir)) { if (llkEnable && !llkTopDirectory.reset(procdir)) { // Most likely reason we could be here is llkd was started // Most likely reason we could be here is llkd was started Loading