The branch main has been updated by bz:

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

commit 3f48a0fe53ca7e001852f4a406c1bdfab1cd2f6d
Author:     Bjoern A. Zeeb <b...@freebsd.org>
AuthorDate: 2025-09-04 20:25:30 +0000
Commit:     Bjoern A. Zeeb <b...@freebsd.org>
CommitDate: 2025-09-05 23:24:15 +0000

    LinuxKPI: add DEFINE_LOCK_GUARD_0 for rcu
    
    This adds guard support for non-real-types like rcu locking meaning
    that we need to keep the lock state separately ourselves.  _T is still
    special and needs to be updated.  Given it may not be used it needs
    an __unused attribute (we are using the LinuxKPI __maybe_unused which
    indeed is more expressive in this case).
    
    Sponsored by:   The FreeBSD Foundation (initially)
    MFC after:      3 days
    Reviewed by:    dumbbell
    Differential Revision:  https://reviews.freebsd.org/D52076
---
 sys/compat/linuxkpi/common/include/linux/cleanup.h | 35 ++++++++++++++++++++++
 .../linuxkpi/common/include/linux/rcupdate.h       |  5 +++-
 2 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/sys/compat/linuxkpi/common/include/linux/cleanup.h 
b/sys/compat/linuxkpi/common/include/linux/cleanup.h
index 45c2a2359ddf..5bb146f082ed 100644
--- a/sys/compat/linuxkpi/common/include/linux/cleanup.h
+++ b/sys/compat/linuxkpi/common/include/linux/cleanup.h
@@ -55,4 +55,39 @@
 
 #define        __free(_n)              __cleanup(__free_##_n)
 
+/*
+ * Given this is a _0 version it should likely be broken up into parts.
+ * But we have no idead what a _1, _2, ... version would do different
+ * until we see a call.
+ * This is used for a not-real-type (rcu).   We use a bool to "simulate"
+ * the lock held.  Also _T still special, may not always be used, so tag
+ * with __unused (or better the LinuxKPI __maybe_unused).
+ */
+#define        DEFINE_LOCK_GUARD_0(_n, _lock, _unlock, ...)                    
\
+                                                                       \
+    typedef struct {                                                   \
+       bool lock;                                                      \
+       __VA_ARGS__;                                                    \
+    } guard_ ## _n ## _t;                                              \
+                                                                       \
+    static inline void                                                 \
+    guard_ ## _n ## _destroy(guard_ ## _n ## _t *_T)                   \
+    {                                                                  \
+       if (_T->lock) {                                                 \
+           _unlock;                                                    \
+       }                                                               \
+    }                                                                  \
+                                                                       \
+    static inline guard_ ## _n ## _t                                   \
+    guard_ ## _n ## _create(void)                                      \
+    {                                                                  \
+       guard_ ## _n ## _t _tmp;                                        \
+       guard_ ## _n ## _t *_T __maybe_unused;                          \
+                                                                       \
+       _tmp.lock = true;                                               \
+       _T = &_tmp;                                                     \
+       _lock;                                                          \
+       return (_tmp);                                                  \
+    }
+
 #endif /* _LINUXKPI_LINUX_CLEANUP_H */
diff --git a/sys/compat/linuxkpi/common/include/linux/rcupdate.h 
b/sys/compat/linuxkpi/common/include/linux/rcupdate.h
index 85d766c8dbc9..4aceb7296cd6 100644
--- a/sys/compat/linuxkpi/common/include/linux/rcupdate.h
+++ b/sys/compat/linuxkpi/common/include/linux/rcupdate.h
@@ -1,7 +1,7 @@
 /*-
  * Copyright (c) 2016-2017 Mellanox Technologies, Ltd.
  * All rights reserved.
- * Copyright (c) 2024 The FreeBSD Foundation
+ * Copyright (c) 2024-2025 The FreeBSD Foundation
  *
  * Portions of this software were developed by Björn Zeeb
  * under sponsorship from the FreeBSD Foundation.
@@ -35,6 +35,7 @@
 #include <linux/compiler.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
+#include <linux/cleanup.h>
 
 #include <machine/atomic.h>
 
@@ -162,4 +163,6 @@ void linux_synchronize_rcu(unsigned type);
 #define        init_rcu_head_on_stack(...)
 #define        destroy_rcu_head_on_stack(...)
 
+DEFINE_LOCK_GUARD_0(rcu, rcu_read_lock(), rcu_read_unlock())
+
 #endif                                 /* _LINUXKPI_LINUX_RCUPDATE_H_ */

Reply via email to