@samitouri / QOSAMI-WSL / commits / 8313d50f

Introduce a new kernel command line argument to collect hvsocket event logs during boot (#13537)

* Introduce a new kernel command line argument to collect hvsocket event logs during boot * Cleanup diff * unset env * Add test coverage * Fix format * Remove prefix

Blue committed Oct 1, 2025 at 15:35 UTC 8313d50f2eeffd0bfa85957a054708f0779d8366
3 files changed +99 -19
src/linux/init/main.cpp
+88 -19
@@ -3875,6 +3875,63 @@ Return Value:
3875
3876 int WslEntryPoint(int Argc, char* Argv[]);
3877
3878 +void EnableDebugMode(const std::string& Mode)
3879 +{
3880 + if (Mode == "hvsocket")
3881 + {
3882 + // Mount the debugfs.
3883 + THROW_LAST_ERROR_IF(UtilMount("none", "/sys/kernel/debug", "debugfs", 0, nullptr) < 0);
3884 +
3885 + // Enable hvsocket events.
3886 + std::vector<const char*> files{
3887 + "/sys/kernel/debug/tracing/events/hyperv/vmbus_on_msg_dpc/enable",
3888 + "/sys/kernel/debug/tracing/events/hyperv/vmbus_on_message/enable",
3889 + "/sys/kernel/debug/tracing/events/hyperv/vmbus_onoffer/enable",
3890 + "/sys/kernel/debug/tracing/events/hyperv/vmbus_onoffer_rescind/enable",
3891 + "/sys/kernel/debug/tracing/events/hyperv/vmbus_onopen_result/enable",
3892 + "/sys/kernel/debug/tracing/events/hyperv/vmbus_ongpadl_created/enable",
3893 + "/sys/kernel/debug/tracing/events/hyperv/vmbus_ongpadl_torndown/enable",
3894 + "/sys/kernel/debug/tracing/events/hyperv/vmbus_open/enable",
3895 + "/sys/kernel/debug/tracing/events/hyperv/vmbus_close_internal/enable",
3896 + "/sys/kernel/debug/tracing/events/hyperv/vmbus_establish_gpadl_header/enable",
3897 + "/sys/kernel/debug/tracing/events/hyperv/vmbus_establish_gpadl_body/enable",
3898 + "/sys/kernel/debug/tracing/events/hyperv/vmbus_teardown_gpadl/enable",
3899 + "/sys/kernel/debug/tracing/events/hyperv/vmbus_release_relid/enable",
3900 + "/sys/kernel/debug/tracing/events/hyperv/vmbus_send_tl_connect_request/enable"};
3901 +
3902 + for (auto* e : files)
3903 + {
3904 + WriteToFile(e, "1");
3905 + }
3906 +
3907 + // Relay logs to the host.
3908 + std::thread relayThread{[]() {
3909 + constexpr auto path = "/sys/kernel/debug/tracing/trace_pipe";
3910 + std::ifstream file(path);
3911 +
3912 + if (!file)
3913 + {
3914 + LOG_ERROR("Failed to open {}, {}", path, errno);
3915 + return;
3916 + }
3917 +
3918 + std::string line;
3919 + while (std::getline(file, line))
3920 + {
3921 + LOG_INFO("{}", line);
3922 + }
3923 +
3924 + LOG_ERROR("{}: closed", path);
3925 + }};
3926 +
3927 + relayThread.detach();
3928 + }
3929 + else
3930 + {
3931 + LOG_ERROR("Unknown debugging mode: '{}'", Mode);
3932 + }
3933 +}
3934 +
3935 int main(int Argc, char* Argv[])
3936 {
3937 std::vector<gsl::byte> Buffer;
@@ -3997,6 +4054,37 @@ int main(int Argc, char* Argv[])
4054 }
4055 }
4056
4057 + //
4058 + // Create the etc directory and mount procfs and sysfs.
4059 + //
4060 +
4061 + if (UtilMkdir(ETC_PATH, 0755) < 0)
4062 + {
4063 + return -1;
4064 + }
4065 +
4066 + if (UtilMount(nullptr, PROCFS_PATH, "proc", 0, nullptr) < 0)
4067 + {
4068 + return -1;
4069 + }
4070 +
4071 + if (UtilMount(nullptr, SYSFS_PATH, "sysfs", 0, nullptr) < 0)
4072 + {
4073 + return -1;
4074 + }
4075 +
4076 + //
4077 + // Enable debug mode, if specified.
4078 + //
4079 +
4080 + if (const auto* debugMode = getenv(WSL_DEBUG_ENV))
4081 + {
4082 + LOG_ERROR("Running in debug mode: '{}'", debugMode);
4083 + EnableDebugMode(debugMode);
4084 +
4085 + unsetenv(WSL_DEBUG_ENV);
4086 + }
4087 +
4088 //
4089 // Establish the message channel with the service via hvsocket.
4090 //
@@ -4024,25 +4112,6 @@ int main(int Argc, char* Argv[])
4112 goto ErrorExit;
4113 }
4114
4027 - //
4028 - // Create the etc directory and mount procfs and sysfs.
4029 - //
4030 -
4031 - if (UtilMkdir(ETC_PATH, 0755) < 0)
4032 - {
4033 - return -1;
4034 - }
4035 -
4036 - if (UtilMount(nullptr, PROCFS_PATH, "proc", 0, nullptr) < 0)
4037 - {
4038 - return -1;
4039 - }
4040 -
4041 - if (UtilMount(nullptr, SYSFS_PATH, "sysfs", 0, nullptr) < 0)
4042 - {
4043 - return -1;
4044 - }
4045 -
4115 if (getenv(WSL_ENABLE_CRASH_DUMP_ENV))
4116 {
4117 Config.EnableCrashDumpCollection = true;
src/shared/inc/lxinitshared.h
+2
@@ -191,6 +191,8 @@ Abstract:
191
192 #define WSL_ENABLE_CRASH_DUMP_ENV "WSL_ENABLE_CRASH_DUMP"
193
194 +#define WSL_DEBUG_ENV "WSL_DEBUG"
195 +
196 #define WSL_DISTRIBUTION_CONF "/etc/wsl-distribution.conf"
197
198 //
test/windows/UnitTests.cpp
+9
@@ -6147,5 +6147,14 @@ Error code: Wsl/InstallDistro/WSL_E_INVALID_JSON\r\n",
6147 VERIFY_ARE_EQUAL(err, L"");
6148 }
6149
6150 + TEST_METHOD(WslDebug)
6151 + {
6152 + WSL2_TEST_ONLY();
6153 +
6154 + // Verify that hvsocket debug events are logged to dmesg.
6155 + WslConfigChange config(LxssGenerateTestConfig({.kernelCommandLine = L"WSL_DEBUG=hvsocket"}));
6156 + VERIFY_ARE_EQUAL(LxsstuLaunchWsl(L"dmesg | grep -iF 'vmbus_send_tl_connect_request'"), 0L);
6157 + }
6158 +
6159 }; // namespace UnitTests
6160 } // namespace UnitTests