Commit c3aa64ab authored by Tom Lendacky's avatar Tom Lendacky Committed by Borislav Petkov (AMD)
Browse files

crypto/ccp: Update HV_FIXED page states to allow freeing of memory



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: default avatarTom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: default avatarTycho Andersen (AMD) <tycho@kernel.org>
Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
Acked-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Link: https://patch.msgid.link/20260324161301.1353976-8-tycho@kernel.org
parent f995fc37
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -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