Skip to content

Commit d6eb39d

Browse files
KaigeFulijinxia
authored andcommitted
tools: acrnctl: Add support for suspending vm
Add command suspend to switch vm to suspend state. Signed-off-by: Kaige Fu <kaige.fu@intel.com> Reviewed-by: Geoffroy Van Cutsem <geoffroy.vancutsem@intel.com> Reviewed-by: Yan, Like <like.yan@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
1 parent 665c2ee commit d6eb39d

File tree

4 files changed

+50
-0
lines changed

4 files changed

+50
-0
lines changed

tools/acrn-manager/README.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ You can see the available ``acrnctl`` commands by running:
2929
add
3030
pause
3131
continue
32+
suspend
3233
Use acrnctl [cmd] help for details
3334
3435
Here are some usage examples:

tools/acrn-manager/acrn_vm_ops.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,3 +240,23 @@ int continue_vm(char *vmname)
240240

241241
return ack.err;
242242
}
243+
244+
int suspend_vm(char *vmname)
245+
{
246+
struct req_dm_suspend req;
247+
struct ack_dm_suspend ack;
248+
249+
req.msg.magic = MNGR_MSG_MAGIC;
250+
req.msg.msgid = DM_SUSPEND;
251+
req.msg.timestamp = time(NULL);
252+
req.msg.len = sizeof(req);
253+
254+
send_msg(vmname, (struct mngr_msg *)&req,
255+
(struct mngr_msg *)&ack, sizeof(ack));
256+
257+
if (ack.err) {
258+
printf("Unable to suspend vm. errno(%d)\n", ack.err);
259+
}
260+
261+
return ack.err;
262+
}

tools/acrn-manager/acrnctl.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#define ADD_DESC "Add one virtual machine with SCRIPTS and OPTIONS"
3535
#define PAUSE_DESC "Block all vCPUs of virtual machine VM_NAME"
3636
#define CONTINUE_DESC "Start virtual machine from pause state"
37+
#define SUSPEND_DESC "Switch virtual machine to suspend state"
3738

3839
struct acrnctl_cmd {
3940
const char *cmd;
@@ -434,6 +435,32 @@ static int acrnctl_do_continue(int argc, char *argv[])
434435
return 0;
435436
}
436437

438+
static int acrnctl_do_suspend(int argc, char *argv[])
439+
{
440+
struct vmmngr_struct *s;
441+
int i;
442+
443+
for (i = 1; i < argc; i++) {
444+
s = vmmngr_find(argv[1]);
445+
if (!s) {
446+
printf("Can't find vm %s\n", argv[i]);
447+
continue;
448+
}
449+
450+
/* Only send suspend cmd to acrn-dm now when VM_STARTED */
451+
switch (s->state) {
452+
case VM_STARTED:
453+
suspend_vm(argv[i]);
454+
break;
455+
default:
456+
printf("%s current state %s, can't suspend\n",
457+
argv[i], state_str[s->state]);
458+
}
459+
}
460+
461+
return 0;
462+
}
463+
437464
/* Default args validation function */
438465
int df_valid_args(struct acrnctl_cmd *cmd, int argc, char *argv[])
439466
{
@@ -489,6 +516,7 @@ struct acrnctl_cmd acmds[] = {
489516
ACMD("add", acrnctl_do_add, ADD_DESC, valid_add_args),
490517
ACMD("pause", acrnctl_do_pause, PAUSE_DESC, df_valid_args),
491518
ACMD("continue", acrnctl_do_continue, CONTINUE_DESC, df_valid_args),
519+
ACMD("suspend", acrnctl_do_suspend, SUSPEND_DESC, df_valid_args),
492520
};
493521

494522
#define NCMD (sizeof(acmds)/sizeof(struct acrnctl_cmd))

tools/acrn-manager/acrnctl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,5 +61,6 @@ int stop_vm(char *vmname);
6161
int start_vm(char *vmname);
6262
int pause_vm(char *vmname);
6363
int continue_vm(char *vmname);
64+
int suspend_vm(char *vmname);
6465

6566
#endif /* _ACRNCTL_H_ */

0 commit comments

Comments
 (0)