Thread (40 messages) flat view 40 messages, 3 authors, 8d ago

Re: [PATCH v5 6/9] mshv: wire SEV-SNP partition ioctls

From: sashiko-bot@kernel.org
Date: 2026-09-08 12:29:58

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] Missing host access restoration on successful PSP guest request permanently revokes host permissions.
- [High] Unbounded user-controlled array allocations and non-preemptible loops cause CPU soft lockups.
--

commit ff3cccc86d268ae551d99e559a8b63d138066868
Author: Wei Liu [off-list ref]
Subject: mshv: wire SEV-SNP partition ioctls

This commit wires the SEV-SNP UAPI into partition creation, memory ownership,
and isolated-page import. It adds tracking for host access permissions and
handles transitions to release/acquire host access.
quoted hunk ↗ jump to hunk
diff --git a/drivers/hv/mshv_root_main.c b/drivers/hv/mshv_root_main.c
--- a/drivers/hv/mshv_root_main.c
+++ b/drivers/hv/mshv_root_main.c
@@ -643,6 +643,68 @@ mshv_partition_region_by_gfn_get(struct mshv_partition *p, u64 gfn)
 	return region;
 }
 
+#ifdef HV_SUPPORTS_SEV_SNP_GUESTS
+static int
+mshv_gpfns_to_host_pages(struct mshv_partition *partition, const u64 *gpfns,
+			 u64 page_count,
+			 struct mshv_host_access_page *host_pages)
+{
+	struct mshv_mem_region *region;
+	u64 i;
+	int ret = 0;
+
+	for (i = 0; i < page_count; i++) {
+		u64 offset;
+
+		region = mshv_partition_region_by_gfn_get(partition, gpfns[i]);
[Severity: High]
Does this code allow an unbounded, user-controlled loop without yielding?

If a user provides an extremely large args.page_count in 
mshv_partition_ioctl_modify_gpa_host_access(), this loop will repeatedly 
acquire and release region mutexes for the entire array. Without a 
cond_resched(), this could cause a CPU soft lockup.

[ ... ]
+bool mshv_u64_array_has_duplicates(u64 *values, u64 count)
+{
+	u64 i;
+
+	sort(values, count, sizeof(*values), mshv_u64_cmp, NULL);
[Severity: High]
Can this sort() call cause a CPU soft lockup?

Since count originates from the user-controlled args.page_count without 
an upper bound, sort() (which is non-preemptible) might block the CPU 
for an O(N log N) duration on a massive array.
+	for (i = 1; i < count; i++)
+		if (values[i - 1] == values[i])
+			return true;
+	return false;
+}
[ ... ]
+static long
+mshv_partition_ioctl_modify_gpa_host_access(struct mshv_partition *partition,
+					    void __user *user_args)
+{
[ ... ]
+	guest_gpas = u64_to_user_ptr(args.guest_gpas);
+	gpfns = vmemdup_array_user(guest_gpas, args.page_count,
+				   sizeof(*gpfns));
+	if (IS_ERR(gpfns)) {
+		ret = PTR_ERR(gpfns);
+		gpfns = NULL;
+		goto out;
+	}
+	host_pages = kvmalloc_array(args.page_count, sizeof(*host_pages),
+				    GFP_KERNEL);
+	duplicates = kvmalloc_array(args.page_count, sizeof(*duplicates),
+				    GFP_KERNEL);
[Severity: High]
Are these allocations sufficiently bounded to prevent kernel memory exhaustion?

Since args.page_count is controlled by userspace, allocating multiple arrays 
that scale with this count could lead to severe memory pressure or a denial of 
service.

[ ... ]
+static long
+mshv_partition_ioctl_issue_psp_guest_request(struct mshv_partition *partition,
+					     void __user *user_args)
+{
[ ... ]
+	ret = hv_call_issue_psp_guest_request(partition->pt_id, gpfns[0],
+					      gpfns[1],
+					      mshv_async_hvcall_handler,
+					      partition);
+	if (!ret)
+		goto out_put_pages;
+
+restore_host_access:
[Severity: High]
Does a successful hypercall skip host access restoration?

If hv_call_issue_psp_guest_request() succeeds and ret is 0, the code 
jumps to out_put_pages, bypassing the restore_host_access block. 
This leaves the host permissions permanently revoked for the request and 
response pages, which could break functionality or leak memory.
+	{
+		int restore_ret;
+
+		restore_ret = mshv_restore_psp_pages(partition, host_pages,
+						     original, transitioned,
+						     transitioned_count);
-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260908121403.1160280-1-weh@linux.microsoft.com?part=6
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help