The branch main has been updated by dumbbell:

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

commit f2a2e02ae54b836d1e23648756a050406f65111e
Author:     Jean-Sébastien Pédron <[email protected]>
AuthorDate: 2026-06-12 17:56:35 +0000
Commit:     Jean-Sébastien Pédron <[email protected]>
CommitDate: 2026-09-09 20:01:30 +0000

    linuxkpi: Define `DEFINE_CLASS()` and `CLASS()`
    
    `DEFINE_CLASS()` is in fact named `LINUXKPI_DEFINE_CLASS()` because it
    conflicts with `DEFINE_CLASS()` defined in <sys/kobj.h>.
    
    This macro defines a type and a pair of constructor/destructor
    functions.
    
    They are to be used by `CLASS()`: this one declares a variable,
    initialise it with the constructor and set the `__cleanup()` attribute
    to call the destructor once the variable goes out of scope.
    
    The DRM drivers generic code started to use `CLASS()` in Linux 6.13. It
    requires the `fd` class to be defined in <linux/file.h>.
    
    Reviewed by:    bz
    Sponsored by:   The FreeBSD Foundation
    Differential Revision: https://reviews.freebsd.org/D57583
---
 sys/compat/linuxkpi/common/include/linux/cleanup.h | 26 ++++++++++++++++++++++
 sys/compat/linuxkpi/common/include/linux/file.h    |  2 ++
 2 files changed, 28 insertions(+)

diff --git a/sys/compat/linuxkpi/common/include/linux/cleanup.h 
b/sys/compat/linuxkpi/common/include/linux/cleanup.h
index fb21a81f121b..815cdc37a956 100644
--- a/sys/compat/linuxkpi/common/include/linux/cleanup.h
+++ b/sys/compat/linuxkpi/common/include/linux/cleanup.h
@@ -20,6 +20,32 @@
     CLEANUP_NAME(_n, _t) _x __cleanup(CLEANUP_NAME(_n, _destroy)) =    \
        CLEANUP_NAME(_n, _create)
 
+/*
+ * On Linux, the following macro is called `DEFINE_CLASS()`. However it
+ * conflicts with FreeBSD's macro defined in <sys/kobj.h>.
+ *
+ * Note: "_T" are special as they are exposed into common code for
+ * statements.  Extra care should be taken when changing the code.
+ */
+#define        LINUXKPI_DEFINE_CLASS(_name, _type, _exit, _init, 
_init_args...)\
+    typedef _type class_##_name##_t;                                   \
+                                                                       \
+    static inline _type class_##_name##_constructor(_init_args)                
\
+    {                                                                  \
+       _type v = _init;                                                \
+       return (v);                                                     \
+    }                                                                  \
+                                                                       \
+    static inline void class_##_name##_destructor(_type *p)            \
+    {                                                                  \
+       _type _T = *p;                                                  \
+       _exit;                                                          \
+    }
+
+#define        CLASS(_name, _var)                                              
\
+    class_##_name##_t _var __cleanup(class_##_name##_destructor) =     \
+       class_##_name##_constructor
+
 /*
  * Note: "_T" are special as they are exposed into common code for
  * statements.  Extra care should be taken when changing the code.
diff --git a/sys/compat/linuxkpi/common/include/linux/file.h 
b/sys/compat/linuxkpi/common/include/linux/file.h
index 13eecfa6a2b0..6ed480f4356a 100644
--- a/sys/compat/linuxkpi/common/include/linux/file.h
+++ b/sys/compat/linuxkpi/common/include/linux/file.h
@@ -184,6 +184,8 @@ static inline struct fd fdget(unsigned int fd)
        return (struct fd){f};
 }
 
+LINUXKPI_DEFINE_CLASS(fd, struct fd, fdput(_T), fdget(fd), int fd)
+
 #define        fd_file(fd)     ((fd).linux_file)
 
 static inline bool

Reply via email to