From: Sabrina Dubroca <sdubr...@redhat.com>

redhat: rh_kabi: introduce RH_KABI_EXCLUDE_WITH_SIZE

This macro is similar to RH_KABI_EXTEND_WITH_SIZE, but with a
different intention.  While RH_KABI_EXTEND_WITH_SIZE is meant to add
new elements that may grow in the future to kABI-protected structures,
RH_KABI_EXCLUDE_WITH_SIZE should be used to hide existing elements
from kABI checksum computation, while allowing them to be extended in
the future without silently breaking binary compatibility of any field
that follows it.

The implementation differs from RH_KABI_EXTEND_WITH_SIZE so that _size
is included in the kABI checksum. That way, we can't accidentally grow
the reserved space, as that would change the offsets of all the
following fields.

The size check guarantees that binary compatibility is preserved.
Until now, __RH_KABI_CHECK_SIZE was only used in the !__GENKSYMS__
versions of macros, so it wasn't defined in the __GENKSYMS__
case. We need to define it to nothing so that _new is ignored by
checksum computation.

Signed-off-by: Sabrina Dubroca <sdubr...@redhat.com>

diff --git a/include/linux/rh_kabi.h b/include/linux/rh_kabi.h
index blahblah..blahblah 100644
--- a/include/linux/rh_kabi.h
+++ b/include/linux/rh_kabi.h
@@ -306,6 +306,23 @@
  *   of the size is not allowed and would constitute a silent kABI breakage.
  *   Beware that the RH_KABI_EXCLUDE macro does not do any size checks.
  *
+ * RH_KABI_EXCLUDE_WITH_SIZE
+ *   Like RH_KABI_EXCLUDE, this macro excludes the element from
+ *   checksum generation.  The same warnings as for RH_KABI_EXCLUDE
+ *   apply: use RH_KABI_FORCE_CHANGE.
+ *
+ *   This macro is intended to be used for elements embedded inside
+ *   kABI-protected structures (struct, array). In contrast with
+ *   RH_KABI_EXCLUDE, this macro reserves extra space, so that the
+ *   embedded element can grow without changing the offsets of the
+ *   fields that follow. The provided 'size' is the total space to be
+ *   added in longs (i.e. it's 8 * 'size' bytes), including the size
+ *   of the added element.  It is automatically checked that the new
+ *   element does not overflow the reserved space, now nor in the
+ *   future. The size is also included in the checksum via the
+ *   reserved space, to ensure that we don't accidentally change it,
+ *   which would change the offsets of the fields that follow.
+ *
  * RH_KABI_BROKEN_INSERT
  * RH_KABI_BROKEN_REMOVE
  *   Insert a field to the middle of a struct / delete a field from a struct.
@@ -377,6 +394,8 @@
 # define _RH_KABI_REPLACE(_orig, _new)         _orig
 # define _RH_KABI_EXCLUDE(_elem)
 
+# define __RH_KABI_CHECK_SIZE(_item, _size)
+
 #else
 
 # define RH_KABI_ALIGN_WARNING ".  Disable CONFIG_RH_KABI_SIZE_ALIGN_CHECKS if 
debugging."
@@ -477,6 +496,13 @@
 
 #define RH_KABI_EXCLUDE(_elem)         _RH_KABI_EXCLUDE(_elem);
 
+#define RH_KABI_EXCLUDE_WITH_SIZE(_new, _size)                         \
+       union {                                                         \
+               RH_KABI_EXCLUDE(_new)                                   \
+               unsigned long RH_KABI_UNIQUE_ID[_size];                 \
+               __RH_KABI_CHECK_SIZE(_new, 8 * (_size))                 \
+       };
+
 #define RH_KABI_EXTEND_WITH_SIZE(_new, _size)                          \
        RH_KABI_EXTEND(union {                                          \
                _new;                                                   \

--
https://gitlab.com/cki-project/kernel-ark/-/merge_requests/1619
--
_______________________________________________
kernel mailing list -- kernel@lists.fedoraproject.org
To unsubscribe send an email to kernel-le...@lists.fedoraproject.org
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedoraproject.org/archives/list/kernel@lists.fedoraproject.org
Do not reply to spam, report it: 
https://pagure.io/fedora-infrastructure/new_issue

Reply via email to