From: Pablo Neira Ayuso <pablo@netfilter.org>
To: Thomas Haller <thaller@redhat.com>
Cc: NetFilter <netfilter-devel@vger.kernel.org>
Subject: Re: [PATCH nft 3/9] datatype: drop flags field from datatype
Date: Wed, 20 Sep 2023 20:10:34 +0200 [thread overview]
Message-ID: <ZQs1msEk15D687Rn@calendula> (raw)
In-Reply-To: <20230920142958.566615-4-thaller@redhat.com>
On Wed, Sep 20, 2023 at 04:26:04PM +0200, Thomas Haller wrote:
> Flags are not always bad. For example, as a function argument they allow
> easier extension in the future. But with datatype's "flags" argument and
> enum datatype_flags there are no advantages of this approach.
>
> - replace DTYPE_F_PREFIX with a "bool f_prefix" field. This could even
> be a bool:1 bitfield if we cared to represent the information with
> one bit only. For now it's not done because that would not help reducing
> the size of the struct, so a bitfield is less preferable.
>
> - instead of DTYPE_F_ALLOC, use the refcnt of zero to represent static
> instances. Drop this redundant flag.
Not sure I want to rely on refcnt to zero to identify dynamic
datatypes. I think we need to consolidate datatype_set() to be used
not only where this deals with dynamic datatypes, it might help
improve traceability of datatype assignment.
> - move the integer field "refcnt" in struct datatype beside other fields
> of similar size/alignment. This makes the size of the struct by one
> pointer size smaller (on x86-64).
>
> Signed-off-by: Thomas Haller <thaller@redhat.com>
> ---
> include/datatype.h | 24 +++++++++---------------
> src/datatype.c | 20 ++++++++------------
> src/meta.c | 2 +-
> src/netlink_delinearize.c | 2 +-
> src/rt.c | 2 +-
> src/segtree.c | 5 ++---
> 6 files changed, 22 insertions(+), 33 deletions(-)
>
> diff --git a/include/datatype.h b/include/datatype.h
> index 52a2e943b252..5b85adc15857 100644
> --- a/include/datatype.h
> +++ b/include/datatype.h
> @@ -120,24 +120,13 @@ enum byteorder {
>
> struct expr;
>
> -/**
> - * enum datatype_flags
> - *
> - * @DTYPE_F_ALLOC: datatype is dynamically allocated
> - * @DTYPE_F_PREFIX: preferred representation for ranges is a prefix
> - */
> -enum datatype_flags {
> - DTYPE_F_ALLOC = (1 << 0),
> - DTYPE_F_PREFIX = (1 << 1),
> -};
> -
> struct parse_ctx;
> /**
> * struct datatype
> *
> * @type: numeric identifier
> * @byteorder: byteorder of type (non-basetypes only)
> - * @flags: flags
> + * @f_prefix: preferred representation for ranges is a prefix
> * @size: type size (fixed sized non-basetypes only)
> * @subtypes: number of subtypes (concat type)
> * @name: type name
> @@ -147,14 +136,20 @@ struct parse_ctx;
> * @print: function to print a constant of this type
> * @parse: function to parse a symbol and return an expression
> * @sym_tbl: symbol table for this type
> - * @refcnt: reference counter (only for DTYPE_F_ALLOC)
> + * @refcnt: reference counter for dynamically allocated instances.
> */
> struct datatype {
> uint32_t type;
> enum byteorder byteorder;
> - unsigned int flags;
> + bool f_prefix;
> unsigned int size;
> unsigned int subtypes;
> +
> + /* Refcount for dynamically allocated instances. For static instances
> + * this is zero (get() and free() are NOPs).
> + */
> + unsigned int refcnt;
> +
> const char *name;
> const char *desc;
> const struct datatype *basetype;
> @@ -169,7 +164,6 @@ struct datatype {
> struct error_record *(*err)(const struct expr *sym);
> void (*describe)(struct output_ctx *octx);
> const struct symbol_table *sym_tbl;
> - unsigned int refcnt;
> };
>
> extern const struct datatype *datatype_lookup(enum datatypes type);
> diff --git a/src/datatype.c b/src/datatype.c
> index 70c84846f70e..c5d88d9a90b6 100644
> --- a/src/datatype.c
> +++ b/src/datatype.c
> @@ -641,7 +641,7 @@ const struct datatype ipaddr_type = {
> .basetype = &integer_type,
> .print = ipaddr_type_print,
> .parse = ipaddr_type_parse,
> - .flags = DTYPE_F_PREFIX,
> + .f_prefix = true,
> };
>
> static void ip6addr_type_print(const struct expr *expr, struct output_ctx *octx)
> @@ -708,7 +708,7 @@ const struct datatype ip6addr_type = {
> .basetype = &integer_type,
> .print = ip6addr_type_print,
> .parse = ip6addr_type_parse,
> - .flags = DTYPE_F_PREFIX,
> + .f_prefix = true,
> };
>
> static void inet_protocol_type_print(const struct expr *expr,
> @@ -944,7 +944,7 @@ const struct datatype mark_type = {
> .print = mark_type_print,
> .json = mark_type_json,
> .parse = mark_type_parse,
> - .flags = DTYPE_F_PREFIX,
> + .f_prefix = true,
> };
>
> static const struct symbol_table icmp_code_tbl = {
> @@ -1203,9 +1203,7 @@ static struct datatype *datatype_alloc(void)
> struct datatype *dtype;
>
> dtype = xzalloc(sizeof(*dtype));
> - dtype->flags = DTYPE_F_ALLOC;
> dtype->refcnt = 1;
> -
> return dtype;
> }
>
> @@ -1215,10 +1213,10 @@ struct datatype *datatype_get(const struct datatype *ptr)
>
> if (!dtype)
> return NULL;
> - if (!(dtype->flags & DTYPE_F_ALLOC))
> - return dtype;
>
> - dtype->refcnt++;
> + if (dtype->refcnt > 0)
> + dtype->refcnt++;
> +
> return dtype;
> }
>
> @@ -1245,7 +1243,6 @@ struct datatype *datatype_clone(const struct datatype *orig_dtype)
> *dtype = *orig_dtype;
> dtype->name = xstrdup(orig_dtype->name);
> dtype->desc = xstrdup(orig_dtype->desc);
> - dtype->flags = DTYPE_F_ALLOC | orig_dtype->flags;
> dtype->refcnt = 1;
>
> return dtype;
> @@ -1257,10 +1254,9 @@ void datatype_free(const struct datatype *ptr)
>
> if (!dtype)
> return;
> - if (!(dtype->flags & DTYPE_F_ALLOC))
> - return;
>
> - assert(dtype->refcnt != 0);
> + if (dtype->refcnt == 0)
> + return;
>
> if (--dtype->refcnt > 0)
> return;
> diff --git a/src/meta.c b/src/meta.c
> index 181e111cbbdc..7bf749b34fb4 100644
> --- a/src/meta.c
> +++ b/src/meta.c
> @@ -368,7 +368,7 @@ const struct datatype devgroup_type = {
> .print = devgroup_type_print,
> .json = devgroup_type_json,
> .parse = devgroup_type_parse,
> - .flags = DTYPE_F_PREFIX,
> + .f_prefix = true,
> };
>
> const struct datatype ifname_type = {
> diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c
> index 41cb37a3ccb3..f3939be2d063 100644
> --- a/src/netlink_delinearize.c
> +++ b/src/netlink_delinearize.c
> @@ -2568,7 +2568,7 @@ static void relational_binop_postprocess(struct rule_pp_ctx *ctx,
> default:
> break;
> }
> - } else if (binop->left->dtype->flags & DTYPE_F_PREFIX &&
> + } else if (binop->left->dtype->f_prefix &&
> binop->op == OP_AND && expr->right->etype == EXPR_VALUE &&
> expr_mask_is_prefix(binop->right)) {
> expr->left = expr_get(binop->left);
> diff --git a/src/rt.c b/src/rt.c
> index 9ddcb210eaad..ccea0aa9bc44 100644
> --- a/src/rt.c
> +++ b/src/rt.c
> @@ -55,7 +55,7 @@ const struct datatype realm_type = {
> .basetype = &integer_type,
> .print = realm_type_print,
> .parse = realm_type_parse,
> - .flags = DTYPE_F_PREFIX,
> + .f_prefix = true,
> };
>
> const struct rt_template rt_templates[] = {
> diff --git a/src/segtree.c b/src/segtree.c
> index 0a12a0cd5151..637457b087b9 100644
> --- a/src/segtree.c
> +++ b/src/segtree.c
> @@ -402,8 +402,7 @@ void concat_range_aggregate(struct expr *set)
> goto next;
> }
>
> - if (prefix_len < 0 ||
> - !(r1->dtype->flags & DTYPE_F_PREFIX)) {
> + if (prefix_len < 0 || !r1->dtype->f_prefix) {
> tmp = range_expr_alloc(&r1->location, r1,
> r2);
>
> @@ -518,7 +517,7 @@ add_interval(struct expr *set, struct expr *low, struct expr *i)
> expr = expr_get(low);
> } else if (range_is_prefix(range) && !mpz_cmp_ui(p, 0)) {
>
> - if (i->dtype->flags & DTYPE_F_PREFIX)
> + if (i->dtype->f_prefix)
> expr = interval_to_prefix(low, i, range);
> else if (expr_basetype(i)->type == TYPE_STRING)
> expr = interval_to_string(low, i, range);
> --
> 2.41.0
>
next prev parent reply other threads:[~2023-09-20 18:10 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-20 14:26 [PATCH nft 0/9] various cleanups related to enums and struct datatype Thomas Haller
2023-09-20 14:26 ` [PATCH nft 1/9] src: fix indentation/whitespace Thomas Haller
2023-09-20 16:03 ` Pablo Neira Ayuso
2023-09-20 14:26 ` [PATCH nft 2/9] include: fix missing definitions in <cache.h>/<headers.h> Thomas Haller
2023-09-20 14:26 ` [PATCH nft 3/9] datatype: drop flags field from datatype Thomas Haller
2023-09-20 18:10 ` Pablo Neira Ayuso [this message]
2023-09-20 19:23 ` Thomas Haller
2023-09-21 14:23 ` Pablo Neira Ayuso
2023-09-22 8:51 ` Thomas Haller
2023-09-22 11:18 ` Pablo Neira Ayuso
2023-09-20 14:26 ` [PATCH nft 4/9] datatype: use "enum byteorder" instead of int in set_datatype_alloc() Thomas Haller
2023-09-20 16:27 ` Pablo Neira Ayuso
2023-09-20 14:26 ` [PATCH nft 5/9] payload: use enum icmp_hdr_field_type in payload_may_dependency_kill_icmp() Thomas Haller
2023-09-20 16:32 ` Pablo Neira Ayuso
2023-09-20 14:26 ` [PATCH nft 6/9] netlink: handle invalid etype in set_make_key() Thomas Haller
2023-09-20 16:22 ` Pablo Neira Ayuso
2023-09-20 16:24 ` Pablo Neira Ayuso
2023-09-20 14:26 ` [PATCH nft 7/9] expression: cleanup expr_ops_by_type() and handle u32 input Thomas Haller
2023-09-20 18:13 ` Pablo Neira Ayuso
2023-09-20 19:28 ` Thomas Haller
2023-09-21 14:19 ` Pablo Neira Ayuso
2023-09-22 8:54 ` Thomas Haller
2023-09-22 9:56 ` Pablo Neira Ayuso
2023-09-25 8:44 ` Pablo Neira Ayuso
2023-09-20 14:26 ` [PATCH nft 8/9] datatype: use __attribute__((packed)) instead of enum bitfields Thomas Haller
2023-09-20 16:02 ` Pablo Neira Ayuso
2023-09-20 17:48 ` Thomas Haller
2023-09-20 18:07 ` Pablo Neira Ayuso
2023-09-20 16:46 ` Pablo Neira Ayuso
2023-09-20 14:26 ` [PATCH nft 9/9] proto: add missing proto_definitions for PROTO_DESC_GENEVE Thomas Haller
2023-09-20 16:14 ` Pablo Neira Ayuso
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZQs1msEk15D687Rn@calendula \
--to=pablo@netfilter.org \
--cc=netfilter-devel@vger.kernel.org \
--cc=thaller@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.