| From 1a8c3053129f7bcb5b034121808177347f473094 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 29 Nov 2023 07:27:53 +0000 |
| Subject: cache: enforce cache groups |
| |
| From: Coco Li <lixiaoyan@google.com> |
| |
| [ Upstream commit aeb9ce058d7c6193dc41e06b3a5b29d22c446b14 ] |
| |
| Set up build time warnings to safeguard against future header changes of |
| organized structs. |
| |
| Warning includes: |
| |
| 1) whether all variables are still in the same cache group |
| 2) whether all the cache groups have the sum of the members size (in the |
| maximum condition, including all members defined in configs) |
| |
| The __cache_group* variables are ignored in kernel-doc check in the |
| various header files they appear in to enforce the cache groups. |
| |
| Suggested-by: Daniel Borkmann <daniel@iogearbox.net> |
| Acked-by: Daniel Borkmann <daniel@iogearbox.net> |
| Signed-off-by: Coco Li <lixiaoyan@google.com> |
| Reviewed-by: Eric Dumazet <edumazet@google.com> |
| Reviewed-by: Shakeel Butt <shakeelb@google.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Stable-dep-of: 87b08913a9ae ("inet: move icmp_global_{credit,stamp} to a separate cache line") |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| include/linux/cache.h | 25 +++++++++++++++++++++++++ |
| scripts/kernel-doc | 5 +++++ |
| 2 files changed, 30 insertions(+) |
| |
| diff --git a/include/linux/cache.h b/include/linux/cache.h |
| index 9900d20b76c28..0ecb17bb68837 100644 |
| --- a/include/linux/cache.h |
| +++ b/include/linux/cache.h |
| @@ -85,6 +85,31 @@ |
| #define cache_line_size() L1_CACHE_BYTES |
| #endif |
| |
| +#ifndef __cacheline_group_begin |
| +#define __cacheline_group_begin(GROUP) \ |
| + __u8 __cacheline_group_begin__##GROUP[0] |
| +#endif |
| + |
| +#ifndef __cacheline_group_end |
| +#define __cacheline_group_end(GROUP) \ |
| + __u8 __cacheline_group_end__##GROUP[0] |
| +#endif |
| + |
| +#ifndef CACHELINE_ASSERT_GROUP_MEMBER |
| +#define CACHELINE_ASSERT_GROUP_MEMBER(TYPE, GROUP, MEMBER) \ |
| + BUILD_BUG_ON(!(offsetof(TYPE, MEMBER) >= \ |
| + offsetofend(TYPE, __cacheline_group_begin__##GROUP) && \ |
| + offsetofend(TYPE, MEMBER) <= \ |
| + offsetof(TYPE, __cacheline_group_end__##GROUP))) |
| +#endif |
| + |
| +#ifndef CACHELINE_ASSERT_GROUP_SIZE |
| +#define CACHELINE_ASSERT_GROUP_SIZE(TYPE, GROUP, SIZE) \ |
| + BUILD_BUG_ON(offsetof(TYPE, __cacheline_group_end__##GROUP) - \ |
| + offsetofend(TYPE, __cacheline_group_begin__##GROUP) > \ |
| + SIZE) |
| +#endif |
| + |
| /* |
| * Helper to add padding within a struct to ensure data fall into separate |
| * cachelines. |
| diff --git a/scripts/kernel-doc b/scripts/kernel-doc |
| index 6e199a745ccb2..d963fdf40e900 100755 |
| --- a/scripts/kernel-doc |
| +++ b/scripts/kernel-doc |
| @@ -1592,6 +1592,11 @@ sub push_parameter($$$$$) { |
| $parameterdescs{$param} = "anonymous\n"; |
| $anon_struct_union = 1; |
| } |
| + elsif ($param =~ "__cacheline_group" ) |
| + # handle cache group enforcing variables: they do not need be described in header files |
| + { |
| + return; # ignore __cacheline_group_begin and __cacheline_group_end |
| + } |
| |
| # warn if parameter has no description |
| # (but ignore ones starting with # as these are not parameters |
| -- |
| 2.51.0 |
| |