From: Donald Hunter <donald.hunter@gmail.com>
To: Jakub Kicinski <kuba@kernel.org>
Cc: davem@davemloft.net, netdev@vger.kernel.org,
edumazet@google.com, pabeni@redhat.com, jiri@resnulli.us
Subject: Re: [PATCH net-next 2/4] tools: ynl: allow setting recv() size
Date: Mon, 04 Mar 2024 11:38:29 +0000 [thread overview]
Message-ID: <m2le6yjkga.fsf@gmail.com> (raw)
In-Reply-To: <20240301230542.116823-3-kuba@kernel.org> (Jakub Kicinski's message of "Fri, 1 Mar 2024 15:05:40 -0800")
Jakub Kicinski <kuba@kernel.org> writes:
> Make the size of the buffer we use for recv() configurable.
> The details of the buffer sizing in netlink are somewhat
> arcane, we could spend a lot of time polishing this API.
> Let's just leave some hopefully helpful comments for now.
> This is a for-developers-only feature, anyway.
>
> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
> ---
> tools/net/ynl/lib/ynl.py | 21 ++++++++++++++++++---
> 1 file changed, 18 insertions(+), 3 deletions(-)
>
> diff --git a/tools/net/ynl/lib/ynl.py b/tools/net/ynl/lib/ynl.py
> index 92ade9105f31..bc5a526dbb99 100644
> --- a/tools/net/ynl/lib/ynl.py
> +++ b/tools/net/ynl/lib/ynl.py
> @@ -84,6 +84,10 @@ from .nlspec import SpecFamily
> return f"Netlink error: {os.strerror(-self.nl_msg.error)}\n{self.nl_msg}"
>
>
> +class ConfigError(Exception):
> + pass
> +
> +
> class NlAttr:
> ScalarFormat = namedtuple('ScalarFormat', ['native', 'big', 'little'])
> type_formats = {
> @@ -400,7 +404,8 @@ genl_family_name_to_id = None
>
>
> class YnlFamily(SpecFamily):
> - def __init__(self, def_path, schema=None, process_unknown=False):
> + def __init__(self, def_path, schema=None, process_unknown=False,
> + recv_size=131072):
> super().__init__(def_path, schema)
>
> self.include_raw = False
> @@ -423,6 +428,16 @@ genl_family_name_to_id = None
> self.async_msg_ids = set()
> self.async_msg_queue = []
>
> + # Note that netlink will use conservative (min) message size for
> + # the first dump recv() on the socket, our setting will only matter
> + # from the second recv() on.
> + self._recv_size = recv_size
> + # Netlink will always allocate at least PAGE_SIZE - sizeof(skb_shinfo)
> + # for a message, so smaller receive sizes will lead to truncation.
> + # Note that the min size for other families may be larger than 4k!
> + if self._recv_size < 4000:
> + raise ConfigError()
Nit: You've added this between the declaration of async_msg_ids and
where it gets populated. Otherwise LGTM.
> +
> for msg in self.msgs.values():
> if msg.is_async:
> self.async_msg_ids.add(msg.rsp_value)
> @@ -799,7 +814,7 @@ genl_family_name_to_id = None
> def check_ntf(self):
> while True:
> try:
> - reply = self.sock.recv(128 * 1024, socket.MSG_DONTWAIT)
> + reply = self.sock.recv(self._recv_size, socket.MSG_DONTWAIT)
> except BlockingIOError:
> return
>
> @@ -854,7 +869,7 @@ genl_family_name_to_id = None
> done = False
> rsp = []
> while not done:
> - reply = self.sock.recv(128 * 1024)
> + reply = self.sock.recv(self._recv_size)
> nms = NlMsgs(reply, attr_space=op.attr_set)
> for nl_msg in nms:
> if nl_msg.extack:
next prev parent reply other threads:[~2024-03-04 11:41 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-01 23:05 [PATCH net-next 0/4] tools: ynl: add --dbg-small-recv for easier kernel testing Jakub Kicinski
2024-03-01 23:05 ` [PATCH net-next 1/4] tools: ynl: move the new line in NlMsg __repr__ Jakub Kicinski
2024-03-04 11:08 ` Donald Hunter
2024-03-01 23:05 ` [PATCH net-next 2/4] tools: ynl: allow setting recv() size Jakub Kicinski
2024-03-04 11:38 ` Donald Hunter [this message]
2024-03-04 13:38 ` Donald Hunter
2024-03-04 14:58 ` Jakub Kicinski
2024-03-04 15:57 ` Donald Hunter
2024-03-04 16:20 ` Jakub Kicinski
2024-03-01 23:05 ` [PATCH net-next 3/4] tools: ynl: support debug printing messages Jakub Kicinski
2024-03-04 11:34 ` Donald Hunter
2024-03-01 23:05 ` [PATCH net-next 4/4] tools: ynl: add --dbg-small-recv for easier kernel testing Jakub Kicinski
2024-03-04 11:26 ` Donald Hunter
2024-03-04 14:59 ` Jakub Kicinski
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=m2le6yjkga.fsf@gmail.com \
--to=donald.hunter@gmail.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=jiri@resnulli.us \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@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 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).