To test the code, we should run this command on the host: Restart-VM $vm -Type Reboot Signed-off-by: Dexuan Cui <decui@xxxxxxxxxxxxx> --- drivers/hv/hv_util.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/drivers/hv/hv_util.c b/drivers/hv/hv_util.c index 9e98c5d..6d642f5 100644 --- a/drivers/hv/hv_util.c +++ b/drivers/hv/hv_util.c @@ -24,7 +24,9 @@ #define SD_MAJOR 3 #define SD_MINOR 0 +#define SD_MINOR_1 1 #define SD_MINOR_2 2 +#define SD_VERSION_3_1 (SD_MAJOR << 16 | SD_MINOR_1) #define SD_VERSION_3_2 (SD_MAJOR << 16 | SD_MINOR_2) #define SD_VERSION (SD_MAJOR << 16 | SD_MINOR) @@ -52,9 +54,10 @@ static int ts_srv_version; static int hb_srv_version; -#define SD_VER_COUNT 3 +#define SD_VER_COUNT 4 static const int sd_versions[] = { SD_VERSION_3_2, + SD_VERSION_3_1, SD_VERSION, SD_VERSION_1 }; @@ -147,6 +150,11 @@ static void perform_shutdown(struct work_struct *dummy) orderly_poweroff(true); } +static void perform_restart(struct work_struct *dummy) +{ + orderly_reboot(); +} + static void perform_hibernation(struct work_struct *dummy) { /* @@ -175,6 +183,11 @@ static void perform_hibernation(struct work_struct *dummy) static DECLARE_WORK(shutdown_work, perform_shutdown); /* + * Perform the restart operation in a thread context. + */ +static DECLARE_WORK(restart_work, perform_restart); + +/* * Perform the hibernation operation in a thread context. */ static DECLARE_WORK(hibernate_work, perform_hibernation); @@ -222,6 +235,14 @@ static void shutdown_onchannelcallback(void *context) pr_info("Shutdown request received -" " graceful shutdown initiated\n"); break; + case 2: + case 3: + pr_info("Restart request received -" + " graceful restart initiated\n"); + icmsghdrp->status = HV_S_OK; + + schedule_work(&restart_work); + break; case 4: case 5: pr_info("Hibernation request received -" -- 1.8.3.1