]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
crypto/ccp: Update HV_FIXED page states to allow freeing of memory
authorTom Lendacky <thomas.lendacky@amd.com>
Tue, 24 Mar 2026 16:13:01 +0000 (10:13 -0600)
committerBorislav Petkov (AMD) <bp@alien8.de>
Mon, 30 Mar 2026 10:10:05 +0000 (12:10 +0200)
After SNP is disabled, any pages allocated as HV_FIXED can now be freed.
Update the page state of these pages and the snp_leak_hv_fixed_pages()
function to free pages on SNP_SHUTDOWN.

Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: Tycho Andersen (AMD) <tycho@kernel.org>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
Link: https://patch.msgid.link/20260324161301.1353976-8-tycho@kernel.org
drivers/crypto/ccp/sev-dev.c

index cc5c5b3ad66d00b07fa2e50baaf5cff440a27a03..57f354721cd5a4bba622657e1ec4764c8fda10d8 100644 (file)
@@ -1219,7 +1219,7 @@ static void snp_add_hv_fixed_pages(struct sev_device *sev, struct sev_data_range
 
 static void snp_leak_hv_fixed_pages(void)
 {
-       struct snp_hv_fixed_pages_entry *entry;
+       struct snp_hv_fixed_pages_entry *entry, *nentry;
 
        /* List is protected by sev_cmd_mutex */
        lockdep_assert_held(&sev_cmd_mutex);
@@ -1227,10 +1227,16 @@ static void snp_leak_hv_fixed_pages(void)
        if (list_empty(&snp_hv_fixed_pages))
                return;
 
-       list_for_each_entry(entry, &snp_hv_fixed_pages, list)
-               if (entry->page_state == HV_FIXED)
+       list_for_each_entry_safe(entry, nentry, &snp_hv_fixed_pages, list) {
+               if (entry->free && entry->page_state != HV_FIXED)
+                       __free_pages(entry->page, entry->order);
+               else
                        __snp_leak_pages(page_to_pfn(entry->page),
                                         1 << entry->order, false);
+
+               list_del(&entry->list);
+               kfree(entry);
+       }
 }
 
 bool sev_is_snp_ciphertext_hiding_supported(void)
@@ -2077,6 +2083,7 @@ static int __sev_snp_shutdown_locked(int *error, bool panic)
        if (data.x86_snp_shutdown) {
                if (!panic)
                        snp_shutdown();
+               snp_hv_fixed_pages_state_update(sev, ALLOCATED);
        } else {
                /*
                 * SNP_SHUTDOWN_EX with IOMMU_SNP_SHUTDOWN set to 1 disables SNP