@@ -1794,9 +1794,25 @@ static void sev_asid_free(struct kvm *kvm)
17941794 __sev_asid_free (sev -> asid );
17951795}
17961796
1797- static void sev_unbind_asid ( struct kvm * kvm , unsigned int handle )
1797+ static void sev_decommission ( unsigned int handle )
17981798{
17991799 struct sev_data_decommission * decommission ;
1800+
1801+ if (!handle )
1802+ return ;
1803+
1804+ decommission = kzalloc (sizeof (* decommission ), GFP_KERNEL );
1805+ if (!decommission )
1806+ return ;
1807+
1808+ decommission -> handle = handle ;
1809+ sev_guest_decommission (decommission , NULL );
1810+
1811+ kfree (decommission );
1812+ }
1813+
1814+ static void sev_unbind_asid (struct kvm * kvm , unsigned int handle )
1815+ {
18001816 struct sev_data_deactivate * data ;
18011817
18021818 if (!handle )
@@ -1814,15 +1830,7 @@ static void sev_unbind_asid(struct kvm *kvm, unsigned int handle)
18141830 sev_guest_df_flush (NULL );
18151831 kfree (data );
18161832
1817- decommission = kzalloc (sizeof (* decommission ), GFP_KERNEL );
1818- if (!decommission )
1819- return ;
1820-
1821- /* decommission handle */
1822- decommission -> handle = handle ;
1823- sev_guest_decommission (decommission , NULL );
1824-
1825- kfree (decommission );
1833+ sev_decommission (handle );
18261834}
18271835
18281836static struct page * * sev_pin_memory (struct kvm * kvm , unsigned long uaddr ,
@@ -1960,6 +1968,7 @@ static void sev_vm_destroy(struct kvm *kvm)
19601968 list_for_each_safe (pos , q , head ) {
19611969 __unregister_enc_region_locked (kvm ,
19621970 list_entry (pos , struct enc_region , list ));
1971+ cond_resched ();
19631972 }
19641973 }
19651974
@@ -6475,8 +6484,10 @@ static int sev_launch_start(struct kvm *kvm, struct kvm_sev_cmd *argp)
64756484
64766485 /* Bind ASID to this guest */
64776486 ret = sev_bind_asid (kvm , start -> handle , error );
6478- if (ret )
6487+ if (ret ) {
6488+ sev_decommission (start -> handle );
64796489 goto e_free_session ;
6490+ }
64806491
64816492 /* return handle to userspace */
64826493 params .handle = start -> handle ;
0 commit comments