There are holes and oversized members in struct genl_family.

Before: /* size: 104, cachelines: 2, members: 16 */
After:  /* size:  88, cachelines: 2, members: 16 */

The command field in struct genlmsghdr is a u8, so no point
in the operation count being 32 bit. Also operation 0 is
usually undefined, so we only need 255 entries.

netnsok and parallel_ops are only ever initialized to true.

We can grow the fields as needed, compiler should warn us
if someone tries to assign larger constants.

Signed-off-by: Jakub Kicinski <k...@kernel.org>
---
 include/net/genetlink.h | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/include/net/genetlink.h b/include/net/genetlink.h
index a3484fd736d6..0033c76ff094 100644
--- a/include/net/genetlink.h
+++ b/include/net/genetlink.h
@@ -48,8 +48,11 @@ struct genl_family {
        char                    name[GENL_NAMSIZ];
        unsigned int            version;
        unsigned int            maxattr;
-       bool                    netnsok;
-       bool                    parallel_ops;
+       unsigned int            mcgrp_offset;   /* private */
+       u8                      netnsok:1;
+       u8                      parallel_ops:1;
+       u8                      n_ops;
+       u8                      n_mcgrps;
        const struct nla_policy *policy;
        int                     (*pre_doit)(const struct genl_ops *ops,
                                            struct sk_buff *skb,
@@ -59,9 +62,6 @@ struct genl_family {
                                             struct genl_info *info);
        const struct genl_ops * ops;
        const struct genl_multicast_group *mcgrps;
-       unsigned int            n_ops;
-       unsigned int            n_mcgrps;
-       unsigned int            mcgrp_offset;   /* private */
        struct module           *module;
 };
 
-- 
2.26.2

Reply via email to