From: Pablo Neira Ayuso <pablo@netfilter.org>
To: Mikhail Sennikovsky <mikhail.sennikovskii@ionos.com>
Cc: netfilter-devel@vger.kernel.org, mikhail.sennikovsky@gmail.com
Subject: Re: [PATCH 1/1] conntrack: use same modifier socket for bulk ops
Date: Wed, 8 Jun 2022 08:18:44 +0200 [thread overview]
Message-ID: <YqA/RNP5jQzIRpon@salvia> (raw)
In-Reply-To: <20220602163429.52490-2-mikhail.sennikovskii@ionos.com>
Hi Mikhail,
On Thu, Jun 02, 2022 at 06:34:29PM +0200, Mikhail Sennikovsky wrote:
> For bulk ct entry loads (with -R option) reusing the same mnl
> modifier socket for all entries results in reduction of entries
> creation time, which becomes especially signifficant when loading
> tens of thouthand of entries.
>
> Signed-off-by: Mikhail Sennikovsky <mikhail.sennikovskii@ionos.com>
> ---
> src/conntrack.c | 31 +++++++++++++++++++++++++------
> 1 file changed, 25 insertions(+), 6 deletions(-)
>
> diff --git a/src/conntrack.c b/src/conntrack.c
> index 27e2bea..be8690b 100644
> --- a/src/conntrack.c
> +++ b/src/conntrack.c
> @@ -71,6 +71,7 @@
> struct nfct_mnl_socket {
> struct mnl_socket *mnl;
> uint32_t portid;
> + uint32_t events;
> };
>
> static struct nfct_mnl_socket _sock;
> @@ -2441,6 +2442,7 @@ static int nfct_mnl_socket_open(struct nfct_mnl_socket *socket,
> return -1;
> }
> socket->portid = mnl_socket_get_portid(socket->mnl);
> + socket->events = events;
>
> return 0;
> }
> @@ -2470,6 +2472,25 @@ static void nfct_mnl_socket_close(const struct nfct_mnl_socket *sock)
> mnl_socket_close(sock->mnl);
> }
>
> +static int nfct_mnl_socket_check_open(struct nfct_mnl_socket *socket,
> + unsigned int events)
> +{
> + if (socket->mnl != NULL) {
> + assert(events == socket->events);
> + return 0;
> + }
> +
> + return nfct_mnl_socket_open(socket, events);
> +}
> +
> +static void nfct_mnl_socket_check_close(struct nfct_mnl_socket *sock)
> +{
> + if (sock->mnl) {
> + nfct_mnl_socket_close(sock);
> + memset(sock, 0, sizeof(*sock));
> + }
> +}
> +
> static int __nfct_mnl_dump(struct nfct_mnl_socket *sock,
> const struct nlmsghdr *nlh, mnl_cb_t cb, void *data)
> {
> @@ -3383,19 +3404,17 @@ static int do_command_ct(const char *progname, struct ct_cmd *cmd,
> break;
>
> case CT_UPDATE:
> - if (nfct_mnl_socket_open(modifier_sock, 0) < 0)
> + if (nfct_mnl_socket_check_open(modifier_sock, 0) < 0)
> exit_error(OTHER_PROBLEM, "Can't open handler");
>
> nfct_filter_init(cmd);
> res = nfct_mnl_dump(sock, NFNL_SUBSYS_CTNETLINK,
> IPCTNL_MSG_CT_GET, mnl_nfct_update_cb,
> cmd, NULL);
> -
> - nfct_mnl_socket_close(modifier_sock);
> break;
>
> case CT_DELETE:
> - if (nfct_mnl_socket_open(modifier_sock, 0) < 0)
> + if (nfct_mnl_socket_check_open(modifier_sock, 0) < 0)
No events needed anymore?
nfct_mnl_socket_check_open() is now only used by CT_UPDATE and CT_DELETE,
right?
> exit_error(OTHER_PROBLEM, "Can't open handler");
>
> nfct_filter_init(cmd);
> @@ -3418,8 +3437,6 @@ static int do_command_ct(const char *progname, struct ct_cmd *cmd,
> cmd, filter_dump);
>
> nfct_filter_dump_destroy(filter_dump);
> -
> - nfct_mnl_socket_close(modifier_sock);
> break;
>
> case EXP_DELETE:
> @@ -3857,6 +3874,7 @@ static const char *ct_unsupp_cmd_file(const struct ct_cmd *cmd)
> int main(int argc, char *argv[])
> {
> struct nfct_mnl_socket *sock = &_sock;
> + struct nfct_mnl_socket *modifier_sock = &_modifier_sock;
> struct ct_cmd *cmd, *next;
> LIST_HEAD(cmd_list);
> int res = 0;
> @@ -3900,6 +3918,7 @@ int main(int argc, char *argv[])
> free(cmd);
> }
> nfct_mnl_socket_close(sock);
> + nfct_mnl_socket_check_close(modifier_sock);
>
> return res < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
> }
> --
> 2.25.1
>
next prev parent reply other threads:[~2022-06-08 7:32 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-02 16:34 [PATCH 0/1] Reusing modifier socket for bulk ct loads Mikhail Sennikovsky
2022-06-02 16:34 ` [PATCH 1/1] conntrack: use same modifier socket for bulk ops Mikhail Sennikovsky
2022-06-08 6:18 ` Pablo Neira Ayuso [this message]
2022-06-08 11:02 ` Mikhail Sennikovsky
2022-06-08 11:08 ` Pablo Neira Ayuso
2022-06-08 11:19 ` Pablo Neira Ayuso
2022-06-08 14:16 ` Mikhail Sennikovsky
2022-06-09 10:20 ` Pablo Neira Ayuso
2022-06-09 10:42 ` Mikhail Sennikovsky
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=YqA/RNP5jQzIRpon@salvia \
--to=pablo@netfilter.org \
--cc=mikhail.sennikovskii@ionos.com \
--cc=mikhail.sennikovsky@gmail.com \
--cc=netfilter-devel@vger.kernel.org \
/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 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 NNTP newsgroup(s).