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, andrew+netdev@lunn.ch,
horms@kernel.org, arkadiusz.kubalewski@intel.com
Subject: Re: [PATCH net] tools: ynl: fix mixing ops and notifications on one socket
Date: Thu, 19 Jun 2025 09:25:55 +0100 [thread overview]
Message-ID: <m234bwgmss.fsf@gmail.com> (raw)
In-Reply-To: <20250618171746.1201403-1-kuba@kernel.org>
Jakub Kicinski <kuba@kernel.org> writes:
> The multi message support loosened the connection between the request
> and response handling, as we can now submit multiple requests before
> we start processing responses. Passing the attr set to NlMsgs decoding
> no longer makes sense (if it ever did), attr set may differ message
> by messsage. Isolate the part of decoding responsible for attr-set
> specific interpretation and call it once we identified the correct op.
>
> Without this fix performing SET operation on an ethtool socket, while
> being subscribed to notifications causes:
>
> # File "tools/net/ynl/pyynl/lib/ynl.py", line 1096, in _op
> # Exception| return self._ops(ops)[0]
> # Exception| ~~~~~~~~~^^^^^
> # File "tools/net/ynl/pyynl/lib/ynl.py", line 1040, in _ops
> # Exception| nms = NlMsgs(reply, attr_space=op.attr_set)
> # Exception| ^^^^^^^^^^^
>
> The value of op we use on line 1040 is stale, it comes form the previous
> loop. If a notification comes before a response we will update op to None
> and the next iteration thru the loop will break with the trace above.
>
> Fixes: 6fda63c45fe8 ("tools/net/ynl: fix cli.py --subscribe feature")
> Fixes: ba8be00f68f5 ("tools/net/ynl: Add multi message support to ynl")
> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Good catch, fix LGTM. It looks like a followup refactor could combine
annotate_extack and _decode_extack and get rid of the attr_space
parameter to NlMsg(). WDYT?
Reviewed-by: Donald Hunter <donald.hunter@gmail.com>
> ---
> CC: donald.hunter@gmail.com
> CC: arkadiusz.kubalewski@intel.com
> ---
> tools/net/ynl/pyynl/lib/ynl.py | 28 +++++++++++++++++-----------
> 1 file changed, 17 insertions(+), 11 deletions(-)
>
> diff --git a/tools/net/ynl/pyynl/lib/ynl.py b/tools/net/ynl/pyynl/lib/ynl.py
> index ae4d1ef7b83a..7529bce174ff 100644
> --- a/tools/net/ynl/pyynl/lib/ynl.py
> +++ b/tools/net/ynl/pyynl/lib/ynl.py
> @@ -231,14 +231,7 @@ from .nlspec import SpecFamily
> self.extack['unknown'].append(extack)
>
> if attr_space:
> - # We don't have the ability to parse nests yet, so only do global
> - if 'miss-type' in self.extack and 'miss-nest' not in self.extack:
> - miss_type = self.extack['miss-type']
> - if miss_type in attr_space.attrs_by_val:
> - spec = attr_space.attrs_by_val[miss_type]
> - self.extack['miss-type'] = spec['name']
> - if 'doc' in spec:
> - self.extack['miss-type-doc'] = spec['doc']
> + self.annotate_extack(attr_space)
>
> def _decode_policy(self, raw):
> policy = {}
> @@ -264,6 +257,18 @@ from .nlspec import SpecFamily
> policy['mask'] = attr.as_scalar('u64')
> return policy
>
> + def annotate_extack(self, attr_space):
> + """ Make extack more human friendly with attribute information """
> +
> + # We don't have the ability to parse nests yet, so only do global
> + if 'miss-type' in self.extack and 'miss-nest' not in self.extack:
> + miss_type = self.extack['miss-type']
> + if miss_type in attr_space.attrs_by_val:
> + spec = attr_space.attrs_by_val[miss_type]
> + self.extack['miss-type'] = spec['name']
> + if 'doc' in spec:
> + self.extack['miss-type-doc'] = spec['doc']
> +
> def cmd(self):
> return self.nl_type
>
> @@ -277,12 +282,12 @@ from .nlspec import SpecFamily
>
>
> class NlMsgs:
> - def __init__(self, data, attr_space=None):
> + def __init__(self, data):
> self.msgs = []
>
> offset = 0
> while offset < len(data):
> - msg = NlMsg(data, offset, attr_space=attr_space)
> + msg = NlMsg(data, offset)
> offset += msg.nl_len
> self.msgs.append(msg)
>
> @@ -1036,12 +1041,13 @@ genl_family_name_to_id = None
> op_rsp = []
> while not done:
> reply = self.sock.recv(self._recv_size)
> - nms = NlMsgs(reply, attr_space=op.attr_set)
> + nms = NlMsgs(reply)
> self._recv_dbg_print(reply, nms)
> for nl_msg in nms:
> if nl_msg.nl_seq in reqs_by_seq:
> (op, vals, req_msg, req_flags) = reqs_by_seq[nl_msg.nl_seq]
> if nl_msg.extack:
> + nl_msg.annotate_extack(op.attr_set)
> self._decode_extack(req_msg, op, nl_msg.extack, vals)
> else:
> op = None
next prev parent reply other threads:[~2025-06-19 12:19 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-18 17:17 [PATCH net] tools: ynl: fix mixing ops and notifications on one socket Jakub Kicinski
2025-06-19 8:25 ` Donald Hunter [this message]
2025-06-19 14:33 ` Jakub Kicinski
2025-06-19 15:40 ` patchwork-bot+netdevbpf
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=m234bwgmss.fsf@gmail.com \
--to=donald.hunter@gmail.com \
--cc=andrew+netdev@lunn.ch \
--cc=arkadiusz.kubalewski@intel.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--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).