[PATCH RFC v3 45/88] samples/kvm: Disallow MP_SET_READONLY after attach
From: Ackerley Tng via B4 Relay
Date: Fri Nov 06 2026 - 19:59:14 EST
From: Ackerley Tng <ackerleytng@xxxxxxxxxx>
Once a provider file is attached to guest_memfd, its physical attributes
must remain constant throughout its lifetime.
Disallow changing page read-only state via MP_SET_READONLY if the provider
file is currently attached to a guest_memfd inode, returning -EBUSY.
Signed-off-by: Ackerley Tng <ackerleytng@xxxxxxxxxx>
---
samples/kvm/memory_provider.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/samples/kvm/memory_provider.c b/samples/kvm/memory_provider.c
index 6f86e3e3262e3..168c1d90edacd 100644
--- a/samples/kvm/memory_provider.c
+++ b/samples/kvm/memory_provider.c
@@ -58,17 +58,23 @@ static int mp_range(struct mp_info *info, u64 offset, u64 len,
return 0;
}
-static void mp_set_readonly(struct mp_info *info, unsigned long start,
+static int mp_set_readonly(struct mp_info *info, unsigned long start,
unsigned long end, bool readonly)
{
mutex_lock(&info->lock);
+ if (info->gmem_inode) {
+ mutex_unlock(&info->lock);
+ return -EBUSY;
+ }
+
if (readonly)
bitmap_set(info->readonly, start, end - start);
else
bitmap_clear(info->readonly, start, end - start);
mutex_unlock(&info->lock);
+ return 0;
}
static void mp_set_present(struct mp_info *info, unsigned long start,
@@ -123,7 +129,7 @@ static long mp_file_set_readonly(struct mp_info *info, void __user *uarg)
ret = mp_range(info, sr.offset, sr.len, &start, &end);
if (!ret)
- mp_set_readonly(info, start, end, sr.value);
+ ret = mp_set_readonly(info, start, end, sr.value);
return ret;
}
--
2.56.0.455.g6c5a503b38-goog