git: e5764cf07588 - main - linuxkpi: Don't destroy the mutex in `xa_destroy()`

From: Jean-Sébastien Pédron <dumbbell_at_FreeBSD.org>
Date: Fri, 31 Jan 2025 16:03:27 UTC
The branch main has been updated by dumbbell:

URL: https://cgit.FreeBSD.org/src/commit/?id=e5764cf0758855e2d5a9ebab6d6addc6eaccd56e

commit e5764cf0758855e2d5a9ebab6d6addc6eaccd56e
Author:     Jean-Sébastien Pédron <dumbbell@FreeBSD.org>
AuthorDate: 2025-01-21 22:54:51 +0000
Commit:     Jean-Sébastien Pédron <dumbbell@FreeBSD.org>
CommitDate: 2025-01-31 16:00:50 +0000

    linuxkpi: Don't destroy the mutex in `xa_destroy()`
    
    [Why]
    The mutex initialized in `xa_init_flags()` is not destroyed here on
    purpose. The reason is that on Linux, the xarray remains usable after a
    call to `xa_destroy()`. For instance the i915 DRM driver relies on that
    during the initialixation of its GuC. Basically, `xa_destroy()` "resets"
    the structure to zero but doesn't really destroy it.
    
    Reviewed by:    manu
    Sponsored by:   The FreeBSD Foundation
    Differential Revision: https://reviews.freebsd.org/D48762
---
 sys/compat/linuxkpi/common/src/linux_xarray.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/sys/compat/linuxkpi/common/src/linux_xarray.c b/sys/compat/linuxkpi/common/src/linux_xarray.c
index 54c536042392..3f07f6d7c59f 100644
--- a/sys/compat/linuxkpi/common/src/linux_xarray.c
+++ b/sys/compat/linuxkpi/common/src/linux_xarray.c
@@ -362,9 +362,19 @@ xa_destroy(struct xarray *xa)
 	struct radix_tree_iter iter;
 	void **ppslot;
 
+	xa_lock(xa);
 	radix_tree_for_each_slot(ppslot, &xa->xa_head, &iter, 0)
 		radix_tree_iter_delete(&xa->xa_head, &iter, ppslot);
-	mtx_destroy(&xa->xa_lock);
+	xa_unlock(xa);
+
+	/*
+	 * The mutex initialized in `xa_init_flags()` is not destroyed here on
+	 * purpose. The reason is that on Linux, the xarray remains usable
+	 * after a call to `xa_destroy()`. For instance the i915 DRM driver
+	 * relies on that during the initialixation of its GuC. Basically,
+	 * `xa_destroy()` "resets" the structure to zero but doesn't really
+	 * destroy it.
+	 */
 }
 
 /*