git: 75ac24a7dfeb - stable/14 - LinuxKPI: add cleanup.h for guard DEFINE_GUARD/guard.

From: Bjoern A. Zeeb <bz_at_FreeBSD.org>
Date: Thu, 17 Oct 2024 09:16:50 UTC
The branch stable/14 has been updated by bz:

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

commit 75ac24a7dfeb93301d4bb8b0118e2c98cc201f5e
Author:     Bjoern A. Zeeb <bz@FreeBSD.org>
AuthorDate: 2024-09-28 22:38:03 +0000
Commit:     Bjoern A. Zeeb <bz@FreeBSD.org>
CommitDate: 2024-10-16 21:50:37 +0000

    LinuxKPI: add cleanup.h for guard DEFINE_GUARD/guard.
    
    iwlwifi v6.11 started to use guard().  _T in the implementation needs
    to be exposed to the driver which uses it in DEFINE_GUARD().
    
    Given this is the first instance of attribute(cleanup) in the tree:
    - gcc has support for it since at least 2003-06-04
      (0bfa5f65bfb186f10d43304946fd7fcd69988732)
    - llvm gained support on 2009-01-31
      (d277d790e0f6f23043397ba919619b5c3e157ff3, llvm-svn 63462).
    
    Sponsored by:   The FreeBSD Foundation
    Reviewed by:    emaste
    Differential Revision: https://reviews.freebsd.org/D46843
    
    (cherry picked from commit fa81baa307da9a0055d7d08f6d141ea310f067ed)
---
 sys/compat/linuxkpi/common/include/linux/cleanup.h | 46 ++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/sys/compat/linuxkpi/common/include/linux/cleanup.h b/sys/compat/linuxkpi/common/include/linux/cleanup.h
new file mode 100644
index 000000000000..01f234f0cbe7
--- /dev/null
+++ b/sys/compat/linuxkpi/common/include/linux/cleanup.h
@@ -0,0 +1,46 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2024 The FreeBSD Foundation
+ *
+ * This software was developed by Björn Zeeb under sponsorship from
+ * the FreeBSD Foundation.
+ */
+
+#ifndef	_LINUXKPI_LINUX_CLEANUP_H
+#define	_LINUXKPI_LINUX_CLEANUP_H
+
+#define	__cleanup(_f)		__attribute__((__cleanup__(_f)))
+
+/*
+ * Note: "_T" are special as they are exposed into common code for
+ * statements.  Extra care should be taken when changing the code.
+ */
+#define	DEFINE_GUARD(_n, _dt, _lock, _unlock)				\
+									\
+    typedef _dt guard_ ## _n ## _t;					\
+									\
+    static inline _dt							\
+    guard_ ## _n ## _create( _dt _T)					\
+    {									\
+	_dt c;								\
+									\
+	c = ({ _lock; _T; });						\
+	return (c);							\
+    }									\
+									\
+    static inline void							\
+    guard_ ## _n ## _destroy(_dt *t)					\
+    {									\
+	_dt _T;								\
+									\
+	_T = *t;							\
+	if (_T) { _unlock; };						\
+    }
+
+/* We need to keep these calls unique. */
+#define	guard(_n)							\
+    guard_ ## _n ## _t guard_ ## _n ## _ ## __COUNTER__			\
+	__cleanup(guard_ ## _n ## _destroy) = guard_ ## _n ## _create
+
+#endif	/* _LINUXKPI_LINUX_CLEANUP_H */