@@ -114,6 +114,26 @@ static void __pkvm_destroy_hyp_vm(struct kvm *host_kvm)
114
114
free_hyp_memcache (& host_kvm -> arch .pkvm .stage2_teardown_mc );
115
115
}
116
116
117
+ static int __pkvm_create_hyp_vcpu (struct kvm_vcpu * vcpu )
118
+ {
119
+ size_t hyp_vcpu_sz = PAGE_ALIGN (PKVM_HYP_VCPU_SIZE );
120
+ pkvm_handle_t handle = vcpu -> kvm -> arch .pkvm .handle ;
121
+ void * hyp_vcpu ;
122
+ int ret ;
123
+
124
+ vcpu -> arch .pkvm_memcache .flags |= HYP_MEMCACHE_ACCOUNT_STAGE2 ;
125
+
126
+ hyp_vcpu = alloc_pages_exact (hyp_vcpu_sz , GFP_KERNEL_ACCOUNT );
127
+ if (!hyp_vcpu )
128
+ return - ENOMEM ;
129
+
130
+ ret = kvm_call_hyp_nvhe (__pkvm_init_vcpu , handle , vcpu , hyp_vcpu );
131
+ if (ret )
132
+ free_pages_exact (hyp_vcpu , hyp_vcpu_sz );
133
+
134
+ return ret ;
135
+ }
136
+
117
137
/*
118
138
* Allocates and donates memory for hypervisor VM structs at EL2.
119
139
*
@@ -126,9 +146,8 @@ static void __pkvm_destroy_hyp_vm(struct kvm *host_kvm)
126
146
*/
127
147
static int __pkvm_create_hyp_vm (struct kvm * host_kvm )
128
148
{
129
- size_t pgd_sz , hyp_vm_sz , hyp_vcpu_sz ;
149
+ size_t pgd_sz , hyp_vm_sz ;
130
150
struct kvm_vcpu * host_vcpu ;
131
- pkvm_handle_t handle ;
132
151
void * pgd , * hyp_vm ;
133
152
unsigned long idx ;
134
153
int ret ;
@@ -162,37 +181,14 @@ static int __pkvm_create_hyp_vm(struct kvm *host_kvm)
162
181
if (ret < 0 )
163
182
goto free_vm ;
164
183
165
- handle = ret ;
166
-
167
- host_kvm -> arch .pkvm .handle = handle ;
184
+ host_kvm -> arch .pkvm .handle = ret ;
168
185
host_kvm -> arch .pkvm .stage2_teardown_mc .flags |= HYP_MEMCACHE_ACCOUNT_STAGE2 ;
169
186
kvm_account_pgtable_pages (pgd , pgd_sz / PAGE_SIZE );
170
187
171
- /* Donate memory for the vcpus at hyp and initialize it. */
172
- hyp_vcpu_sz = PAGE_ALIGN (PKVM_HYP_VCPU_SIZE );
173
188
kvm_for_each_vcpu (idx , host_vcpu , host_kvm ) {
174
- void * hyp_vcpu ;
175
-
176
- host_vcpu -> arch .pkvm_memcache .flags |= HYP_MEMCACHE_ACCOUNT_STAGE2 ;
177
-
178
- /* Indexing of the vcpus to be sequential starting at 0. */
179
- if (WARN_ON (host_vcpu -> vcpu_idx != idx )) {
180
- ret = - EINVAL ;
181
- goto destroy_vm ;
182
- }
183
-
184
- hyp_vcpu = alloc_pages_exact (hyp_vcpu_sz , GFP_KERNEL_ACCOUNT );
185
- if (!hyp_vcpu ) {
186
- ret = - ENOMEM ;
187
- goto destroy_vm ;
188
- }
189
-
190
- ret = kvm_call_hyp_nvhe (__pkvm_init_vcpu , handle , host_vcpu ,
191
- hyp_vcpu );
192
- if (ret ) {
193
- free_pages_exact (hyp_vcpu , hyp_vcpu_sz );
189
+ ret = __pkvm_create_hyp_vcpu (host_vcpu );
190
+ if (ret )
194
191
goto destroy_vm ;
195
- }
196
192
}
197
193
198
194
return 0 ;
0 commit comments