Skip to content

Commit 1933d60

Browse files
KaigeFulijinxia
authored andcommitted
tools: acrnctl: Add support for pausing vm
Add command pasue to pause vm. 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 3000edc commit 1933d60

File tree

4 files changed

+49
-0
lines changed

4 files changed

+49
-0
lines changed

tools/acrn-manager/README.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ You can see the available ``acrnctl`` commands by running:
2727
stop
2828
del
2929
add
30+
pause
3031
Use acrnctl [cmd] help for details
3132
3233
Here are some usage examples:

tools/acrn-manager/acrn_vm_ops.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,3 +201,22 @@ int stop_vm(char *vmname)
201201

202202
return ack.err;
203203
}
204+
205+
int pause_vm(char *vmname)
206+
{
207+
struct req_dm_pause req;
208+
struct ack_dm_pause ack;
209+
210+
req.msg.magic = MNGR_MSG_MAGIC;
211+
req.msg.msgid = DM_PAUSE;
212+
req.msg.timestamp = time(NULL);
213+
req.msg.len = sizeof(req);
214+
215+
send_msg(vmname, (struct mngr_msg *)&req,
216+
(struct mngr_msg *)&ack, sizeof(ack));
217+
if (ack.err) {
218+
printf("Unable to pause vm. errno(%d)\n", ack.err);
219+
}
220+
221+
return ack.err;
222+
}

tools/acrn-manager/acrnctl.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#define STOP_DESC "Stop virtual machine VM_NAME"
3333
#define DEL_DESC "Delete virtual machine VM_NAME"
3434
#define ADD_DESC "Add one virtual machine with SCRIPTS and OPTIONS"
35+
#define PAUSE_DESC "Block all vCPUs of virtual machine VM_NAME"
3536

3637
struct acrnctl_cmd {
3738
const char *cmd;
@@ -377,6 +378,32 @@ static int acrnctl_do_start(int argc, char *argv[])
377378
return 0;
378379
}
379380

381+
static int acrnctl_do_pause(int argc, char *argv[])
382+
{
383+
struct vmmngr_struct *s;
384+
int i;
385+
386+
for (i = 1; i < argc; i++) {
387+
s = vmmngr_find(argv[i]);
388+
if (!s) {
389+
printf("Can't find vm %s\n", argv[i]);
390+
continue;
391+
}
392+
393+
/* Send pause cmd to arcn-dm only when vm is in VM_STARTED */
394+
switch (s->state) {
395+
case VM_STARTED:
396+
pause_vm(argv[i]);
397+
break;
398+
default:
399+
printf("%s current state %s, can't pause\n",
400+
argv[i], state_str[s->state]);
401+
}
402+
}
403+
404+
return 0;
405+
}
406+
380407
/* Default args validation function */
381408
int df_valid_args(struct acrnctl_cmd *cmd, int argc, char *argv[])
382409
{
@@ -430,6 +457,7 @@ struct acrnctl_cmd acmds[] = {
430457
ACMD("stop", acrnctl_do_stop, STOP_DESC, df_valid_args),
431458
ACMD("del", acrnctl_do_del, DEL_DESC, df_valid_args),
432459
ACMD("add", acrnctl_do_add, ADD_DESC, valid_add_args),
460+
ACMD("pause", acrnctl_do_pause, PAUSE_DESC, df_valid_args),
433461
};
434462

435463
#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
@@ -59,5 +59,6 @@ int shell_cmd(const char *cmd, char *outbuf, int len);
5959
int list_vm(void);
6060
int stop_vm(char *vmname);
6161
int start_vm(char *vmname);
62+
int pause_vm(char *vmname);
6263

6364
#endif /* _ACRNCTL_H_ */

0 commit comments

Comments
 (0)