Juergen Gross 37ef22
Patch-mainline: v5.19-rc7
Juergen Gross 37ef22
Git-commit: 166d3863231667c4f64dee72b77d1102cdfad11f
Juergen Gross 37ef22
References: git-fixes
Juergen Gross 37ef22
From: Demi Marie Obenour <demi@invisiblethingslab.com>
Juergen Gross 37ef22
Date: Sun, 10 Jul 2022 19:05:22 -0400
Juergen Gross 37ef22
Subject: [PATCH] xen/gntdev: Ignore failure to unmap INVALID_GRANT_HANDLE
Juergen Gross 37ef22
Juergen Gross 37ef22
The error paths of gntdev_mmap() can call unmap_grant_pages() even
Juergen Gross 37ef22
though not all of the pages have been successfully mapped.  This will
Juergen Gross 37ef22
trigger the WARN_ON()s in __unmap_grant_pages_done().  The number of
Juergen Gross 37ef22
warnings can be very large; I have observed thousands of lines of
Juergen Gross 37ef22
warnings in the systemd journal.
Juergen Gross 37ef22
Juergen Gross 37ef22
Avoid this problem by only warning on unmapping failure if the handle
Juergen Gross 37ef22
being unmapped is not INVALID_GRANT_HANDLE.  The handle field of any
Juergen Gross 37ef22
page that was not successfully mapped will be INVALID_GRANT_HANDLE, so
Juergen Gross 37ef22
this catches all cases where unmapping can legitimately fail.
Juergen Gross 37ef22
Juergen Gross 37ef22
Fixes: dbe97cff7dd9 ("xen/gntdev: Avoid blocking in unmap_grant_pages()")
Juergen Gross 37ef22
Cc: stable@vger.kernel.org
Juergen Gross 37ef22
Suggested-by: Juergen Gross <jgross@suse.com>
Juergen Gross 37ef22
Signed-off-by: Demi Marie Obenour <demi@invisiblethingslab.com>
Juergen Gross 37ef22
Reviewed-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
Juergen Gross 37ef22
Reviewed-by: Juergen Gross <jgross@suse.com>
Juergen Gross 37ef22
Link: https://lore.kernel.org/r/20220710230522.1563-1-demi@invisiblethingslab.com
Juergen Gross 37ef22
Signed-off-by: Juergen Gross <jgross@suse.com>
Juergen Gross 37ef22
---
Juergen Gross 37ef22
 drivers/xen/gntdev.c | 6 ++++--
Juergen Gross 37ef22
 1 file changed, 4 insertions(+), 2 deletions(-)
Juergen Gross 37ef22
Juergen Gross 37ef22
diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
Juergen Gross 37ef22
index 4b56c39f766d..84b143eef395 100644
Juergen Gross 37ef22
--- a/drivers/xen/gntdev.c
Juergen Gross 37ef22
+++ b/drivers/xen/gntdev.c
Juergen Gross 37ef22
@@ -396,13 +396,15 @@ static void __unmap_grant_pages_done(int result,
Juergen Gross 37ef22
 	unsigned int offset = data->unmap_ops - map->unmap_ops;
Juergen Gross 37ef22
 
Juergen Gross 37ef22
 	for (i = 0; i < data->count; i++) {
Juergen Gross 37ef22
-		WARN_ON(map->unmap_ops[offset+i].status);
Juergen Gross 37ef22
+		WARN_ON(map->unmap_ops[offset + i].status != GNTST_okay &&
Juergen Gross 37ef22
+			map->unmap_ops[offset + i].handle != INVALID_GRANT_HANDLE);
Juergen Gross 37ef22
 		pr_debug("unmap handle=%d st=%d\n",
Juergen Gross 37ef22
 			map->unmap_ops[offset+i].handle,
Juergen Gross 37ef22
 			map->unmap_ops[offset+i].status);
Juergen Gross 37ef22
 		map->unmap_ops[offset+i].handle = INVALID_GRANT_HANDLE;
Juergen Gross 37ef22
 		if (use_ptemod) {
Juergen Gross 37ef22
-			WARN_ON(map->kunmap_ops[offset+i].status);
Juergen Gross 37ef22
+			WARN_ON(map->kunmap_ops[offset + i].status != GNTST_okay &&
Juergen Gross 37ef22
+				map->kunmap_ops[offset + i].handle != INVALID_GRANT_HANDLE);
Juergen Gross 37ef22
 			pr_debug("kunmap handle=%u st=%d\n",
Juergen Gross 37ef22
 				 map->kunmap_ops[offset+i].handle,
Juergen Gross 37ef22
 				 map->kunmap_ops[offset+i].status);
Juergen Gross 37ef22
-- 
Juergen Gross 37ef22
2.35.3
Juergen Gross 37ef22