xref: /openbmc/linux/drivers/virt/acrn/vm.c (revision 9c5137ae)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * ACRN_HSM: Virtual Machine management
4  *
5  * Copyright (C) 2020 Intel Corporation. All rights reserved.
6  *
7  * Authors:
8  *	Jason Chen CJ <jason.cj.chen@intel.com>
9  *	Yakui Zhao <yakui.zhao@intel.com>
10  */
11 #include <linux/io.h>
12 #include <linux/mm.h>
13 #include <linux/slab.h>
14 
15 #include "acrn_drv.h"
16 
17 /* List of VMs */
18 static LIST_HEAD(acrn_vm_list);
19 /* To protect acrn_vm_list */
20 static DEFINE_MUTEX(acrn_vm_list_lock);
21 
22 struct acrn_vm *acrn_vm_create(struct acrn_vm *vm,
23 			       struct acrn_vm_creation *vm_param)
24 {
25 	int ret;
26 
27 	ret = hcall_create_vm(virt_to_phys(vm_param));
28 	if (ret < 0 || vm_param->vmid == ACRN_INVALID_VMID) {
29 		dev_err(acrn_dev.this_device,
30 			"Failed to create VM! Error: %d\n", ret);
31 		return NULL;
32 	}
33 
34 	vm->vmid = vm_param->vmid;
35 	vm->vcpu_num = vm_param->vcpu_num;
36 
37 	mutex_lock(&acrn_vm_list_lock);
38 	list_add(&vm->list, &acrn_vm_list);
39 	mutex_unlock(&acrn_vm_list_lock);
40 
41 	dev_dbg(acrn_dev.this_device, "VM %u created.\n", vm->vmid);
42 	return vm;
43 }
44 
45 int acrn_vm_destroy(struct acrn_vm *vm)
46 {
47 	int ret;
48 
49 	if (vm->vmid == ACRN_INVALID_VMID ||
50 	    test_and_set_bit(ACRN_VM_FLAG_DESTROYED, &vm->flags))
51 		return 0;
52 
53 	/* Remove from global VM list */
54 	mutex_lock(&acrn_vm_list_lock);
55 	list_del_init(&vm->list);
56 	mutex_unlock(&acrn_vm_list_lock);
57 
58 	ret = hcall_destroy_vm(vm->vmid);
59 	if (ret < 0) {
60 		dev_err(acrn_dev.this_device,
61 			"Failed to destroy VM %u\n", vm->vmid);
62 		clear_bit(ACRN_VM_FLAG_DESTROYED, &vm->flags);
63 		return ret;
64 	}
65 	dev_dbg(acrn_dev.this_device, "VM %u destroyed.\n", vm->vmid);
66 	vm->vmid = ACRN_INVALID_VMID;
67 	return 0;
68 }
69