Commit 21401ce4 authored by Claudio Imbrenda's avatar Claudio Imbrenda
Browse files

s390: Make UV folio operations work on whole folio



uv_destroy_folio() and uv_convert_from_secure_folio() should work on
all pages in the folio, not just the first one.

This was fine until now, but it will become a problem with upcoming
patches.

Acked-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Signed-off-by: default avatarClaudio Imbrenda <imbrenda@linux.ibm.com>
parent 013bf0f5
Loading
Loading
Loading
Loading
+12 −10
Original line number Diff line number Diff line
@@ -134,14 +134,15 @@ static int uv_destroy(unsigned long paddr)
 */
int uv_destroy_folio(struct folio *folio)
{
	unsigned long i;
	int rc;

	/* Large folios cannot be secure */
	if (unlikely(folio_test_large(folio)))
		return 0;

	folio_get(folio);
	rc = uv_destroy(folio_to_phys(folio));
	for (i = 0; i < (1 << folio_order(folio)); i++) {
		rc = uv_destroy(folio_to_phys(folio) + i * PAGE_SIZE);
		if (rc)
			break;
	}
	if (!rc)
		clear_bit(PG_arch_1, &folio->flags.f);
	folio_put(folio);
@@ -183,14 +184,15 @@ EXPORT_SYMBOL_GPL(uv_convert_from_secure);
 */
int uv_convert_from_secure_folio(struct folio *folio)
{
	unsigned long i;
	int rc;

	/* Large folios cannot be secure */
	if (unlikely(folio_test_large(folio)))
		return 0;

	folio_get(folio);
	rc = uv_convert_from_secure(folio_to_phys(folio));
	for (i = 0; i < (1 << folio_order(folio)); i++) {
		rc = uv_convert_from_secure(folio_to_phys(folio) + i * PAGE_SIZE);
		if (rc)
			break;
	}
	if (!rc)
		clear_bit(PG_arch_1, &folio->flags.f);
	folio_put(folio);