public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
From: Stefano Brivio <sbrivio@redhat.com>
To: David Gibson <david@gibson.dropbear.id.au>
Cc: passt-dev@passt.top
Subject: Re: [PATCH v3 08/16] flow: Introduce 'sidx' type to represent one side of one flow
Date: Sat, 2 Dec 2023 05:35:07 +0100	[thread overview]
Message-ID: <20231202053507.2886eeca@elisabeth> (raw)
In-Reply-To: <20231130020222.4056647-9-david@gibson.dropbear.id.au>

On Thu, 30 Nov 2023 13:02:14 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:

> In a number of places, we use indices into the flow table to identify a
> specific flow.  We also have cases where we need to identify a particular
> side of a particular flow, and we expect those to become more common as
> we generalise the flow table to cover more things.
> 
> To assist with that, introduces flow_sidx_t, an index type which identifies
> a specific side of a specific flow in the table.
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> ---
>  flow.h       | 14 ++++++++++++++
>  flow_table.h | 36 ++++++++++++++++++++++++++++++++++++
>  2 files changed, 50 insertions(+)
> 
> diff --git a/flow.h b/flow.h
> index c820a15..4f12831 100644
> --- a/flow.h
> +++ b/flow.h
> @@ -39,6 +39,20 @@ struct flow_common {
>  #define FLOW_TABLE_PRESSURE		30	/* % of FLOW_MAX */
>  #define FLOW_FILE_PRESSURE		30	/* % of c->nofile */
>  
> +/**
> + * struct flow_sidx - ID for one side of a specific flow
> + * @side:	Side referenced (0 or 1)
> + * @flow:	Index of flow referenced
> + */
> +typedef struct flow_sidx {
> +	int		side :1;
> +	unsigned	flow :FLOW_INDEX_BITS;
> +} flow_sidx_t;
> +static_assert(sizeof(flow_sidx_t) <= sizeof(uint32_t),
> +	      "flow_sidx_t must fit within 32 bits");
> +
> +#define FLOW_SIDX_NONE ((flow_sidx_t){ .flow = FLOW_MAX })
> +
>  union flow;
>  
>  void flow_table_compact(struct ctx *c, union flow *hole);
> diff --git a/flow_table.h b/flow_table.h
> index 5e897bd..3c68d4a 100644
> --- a/flow_table.h
> +++ b/flow_table.h
> @@ -47,4 +47,40 @@ static inline unsigned flow_idx(const struct flow_common *f)
>   */
>  #define FLOW(idx)		(&flowtab[(idx)])
>  
> +/** flow_at_sidx - Flow entry for a given sidx
> + * @sidx:	Flow & side index
> + *
> + * Return: pointer to the corresponding flow entry, or NULL
> + */
> +static inline union flow *flow_at_sidx(flow_sidx_t sidx)
> +{
> +	if (sidx.flow >= FLOW_MAX)
> +		return NULL;
> +	return FLOW(sidx.flow);
> +}
> +
> +/** flow_sidx_t - Index of one side of a flow from common structure
> + * @f:		Common flow fields pointer
> + * @side:	Which side to refer to (0 or 1)
> + *
> + * Return: index of @f and @side in the flow table
> + */
> +static inline flow_sidx_t flow_sidx(const struct flow_common *f,
> +				    int side)
> +{
> +	ASSERT(side == !!side);

This gives me a false cppcheck (2.10) positive:

flow_table.h:71:2: style: The comparison 'side == !!side' is always true because 'side' and '!!side' represent the same value. [knownConditionTrueFalse]
 ASSERT(side == !!side);
 ^

I guess cppcheck commit 5d1fdf795829 ("Fix issue 7904: Handle double
nots in isSameExpression (#1305)") should be extended to also skip
checking double nots in equality comparisons:

diff --git a/lib/astutils.cpp b/lib/astutils.cpp
index 2c01884c9..8e88ec817 100644
--- a/lib/astutils.cpp
+++ b/lib/astutils.cpp
@@ -1424,10 +1424,10 @@ bool isSameExpression(bool cpp, bool macro, const Token *tok1, const Token *tok2
             tok2 = tok2->astOperand2();
     }
     // Skip double not
-    if (Token::simpleMatch(tok1, "!") && Token::simpleMatch(tok1->astOperand1(), "!") && !Token::simpleMatch(tok1->astParent(), "=")) {
+    if (Token::simpleMatch(tok1, "!") && Token::simpleMatch(tok1->astOperand1(), "!") && !Token::simpleMatch(tok1->astParent(), "=") && !Token::simpleMatch(tok1->astParent(), "==")) {
         return isSameExpression(cpp, macro, tok1->astOperand1()->astOperand1(), tok2, library, pure, followVar, errors);
     }
-    if (Token::simpleMatch(tok2, "!") && Token::simpleMatch(tok2->astOperand1(), "!") && !Token::simpleMatch(tok2->astParent(), "=")) {
+    if (Token::simpleMatch(tok2, "!") && Token::simpleMatch(tok2->astOperand1(), "!") && !Token::simpleMatch(tok2->astParent(), "=") && !Token::simpleMatch(tok2->astParent(), "==")) {
         return isSameExpression(cpp, macro, tok1, tok2->astOperand1()->astOperand1(), library, pure, followVar, errors);
     }
     const bool tok_str_eq = tok1->str() == tok2->str();

...anyway, I would just add an inline suppression for the moment, unless
you have better ideas.

-- 
@@ -1424,10 +1424,10 @@ bool isSameExpression(bool cpp, bool macro, const Token *tok1, const Token *tok2
             tok2 = tok2->astOperand2();
     }
     // Skip double not
-    if (Token::simpleMatch(tok1, "!") && Token::simpleMatch(tok1->astOperand1(), "!") && !Token::simpleMatch(tok1->astParent(), "=")) {
+    if (Token::simpleMatch(tok1, "!") && Token::simpleMatch(tok1->astOperand1(), "!") && !Token::simpleMatch(tok1->astParent(), "=") && !Token::simpleMatch(tok1->astParent(), "==")) {
         return isSameExpression(cpp, macro, tok1->astOperand1()->astOperand1(), tok2, library, pure, followVar, errors);
     }
-    if (Token::simpleMatch(tok2, "!") && Token::simpleMatch(tok2->astOperand1(), "!") && !Token::simpleMatch(tok2->astParent(), "=")) {
+    if (Token::simpleMatch(tok2, "!") && Token::simpleMatch(tok2->astOperand1(), "!") && !Token::simpleMatch(tok2->astParent(), "=") && !Token::simpleMatch(tok2->astParent(), "==")) {
         return isSameExpression(cpp, macro, tok1, tok2->astOperand1()->astOperand1(), library, pure, followVar, errors);
     }
     const bool tok_str_eq = tok1->str() == tok2->str();

...anyway, I would just add an inline suppression for the moment, unless
you have better ideas.

-- 
Stefano


  reply	other threads:[~2023-12-02  4:35 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-30  2:02 [PATCH v3 00/16] Introduce unified flow table, first steps David Gibson
2023-11-30  2:02 ` [PATCH v3 01/16] treewide: Add messages to static_assert() calls David Gibson
2023-11-30  2:02 ` [PATCH v3 02/16] flow, tcp: Generalise connection types David Gibson
2023-11-30  2:02 ` [PATCH v3 03/16] flow, tcp: Move TCP connection table to unified flow table David Gibson
2023-11-30  2:02 ` [PATCH v3 04/16] flow, tcp: Consolidate flow pointer<->index helpers David Gibson
2023-11-30  2:02 ` [PATCH v3 05/16] util: MAX_FROM_BITS() should be unsigned David Gibson
2023-11-30  2:02 ` [PATCH v3 06/16] flow: Make unified version of flow table compaction David Gibson
2023-11-30  2:02 ` [PATCH v3 07/16] flow, tcp: Add logging helpers for connection related messages David Gibson
2023-11-30  2:02 ` [PATCH v3 08/16] flow: Introduce 'sidx' type to represent one side of one flow David Gibson
2023-12-02  4:35   ` Stefano Brivio [this message]
2023-11-30  2:02 ` [PATCH v3 09/16] tcp: Remove unneccessary bounds check in tcp_timer_handler() David Gibson
2023-11-30  2:02 ` [PATCH v3 10/16] flow,tcp: Generalise TCP epoll_ref to generic flows David Gibson
2023-11-30  2:02 ` [PATCH v3 11/16] tcp_splice: Use unsigned to represent side David Gibson
2023-11-30  2:02 ` [PATCH v3 12/16] flow,tcp: Use epoll_ref type including flow and side David Gibson
2023-11-30  2:02 ` [PATCH v3 13/16] test: Avoid hitting guestfish command length limits David Gibson
2023-11-30  2:02 ` [PATCH v3 14/16] pif: Add helpers to get the name of a pif David Gibson
2023-11-30 12:45   ` Stefano Brivio
2023-12-01  0:08     ` David Gibson
2023-11-30  2:02 ` [PATCH v3 15/16] tcp: "TCP" hash secret doesn't need to be TCP specific David Gibson
2023-11-30  2:02 ` [PATCH v3 16/16] tcp: Don't defer hash table removal David Gibson
2023-11-30 12:45   ` Stefano Brivio
2023-12-01  0:07     ` David Gibson
2023-12-02  4:34       ` Stefano Brivio
2023-12-04  0:43         ` David Gibson
2023-12-04  9:54 ` [PATCH v3 00/16] Introduce unified flow table, first steps Stefano Brivio

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=20231202053507.2886eeca@elisabeth \
    --to=sbrivio@redhat.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=passt-dev@passt.top \
    /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.
Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).