Message ID | 20231129072756.3684495-3-lixiaoyan@google.com (mailing list archive) |
---|---|
State | Accepted |
Commit | aeb9ce058d7c6193dc41e06b3a5b29d22c446b14 |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Analyze and Reorganize core Networking Structs to optimize cacheline consumption | expand |
On Wed, Nov 29, 2023 at 8:28 AM Coco Li <lixiaoyan@google.com> wrote: > > 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> > --- > include/linux/cache.h | 25 +++++++++++++++++++++++++ > scripts/kernel-doc | 5 +++++ > 2 files changed, 30 insertions(+) > Reviewed-by: Eric Dumazet <edumazet@google.com>
On Wed, 29 Nov 2023 07:27:53 +0000 Coco Li wrote: > diff --git a/scripts/kernel-doc b/scripts/kernel-doc > index 08a3e603db192..0a890fe4d22b1 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 Hi Jon, would you be okay with this chunk going into net-next?
On Wed, Nov 29, 2023 at 07:27:53AM +0000, Coco Li wrote: > 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: Shakeel Butt <shakeelb@google.com>
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 08a3e603db192..0a890fe4d22b1 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