From: Jakub Kicinski <kuba@kernel.org>
To: Ismael Luceno <iluceno@suse.de>
Cc: "David S. Miller" <davem@davemloft.net>,
Paolo Abeni <pabeni@redhat.com>, David Ahern <dsahern@gmail.com>,
"netdev@vger.kernel.org" <netdev@vger.kernel.org>
Subject: Re: Netlink NLM_F_DUMP_INTR flag lost
Date: Thu, 16 Jun 2022 17:16:12 -0700 [thread overview]
Message-ID: <20220616171612.66638e54@kernel.org> (raw)
In-Reply-To: <20220616171016.56d4ec9c@pirotess>
On Thu, 16 Jun 2022 17:10:16 +0200 Ismael Luceno wrote:
> On Wed, 15 Jun 2022 09:00:44 -0700
> Jakub Kicinski <kuba@kernel.org> wrote:
> > On Wed, 15 Jun 2022 17:11:13 +0200 Ismael Luceno wrote:
> > > It seems a RTM_GETADDR request with AF_UNSPEC has a corner case
> > > where the NLM_F_DUMP_INTR flag is lost.
> > >
> > > After a change in an address table, if a packet has been fully
> > > filled just previous, and if the end of the table is found at the
> > > same time, then the next packet should be flagged, which works fine
> > > when it's NLMSG_DONE, but gets clobbered when another table is to
> > > be dumped next.
> >
> > Could you describe how it gets clobbered? You mean that prev_seq gets
> > updated somewhere without setting the flag or something overwrites
> > nlmsg_flags? Or we set _INTR on an empty skb which never ends up
> > getting sent? Or..
>
> It seems to me that in most functions, but specifically in the case of
> net/ipv4/devinet.c:in_dev_dump_addr or inet_netconf_dump_devconf,
> nl_dump_check_consistent is called after each address/attribute is
> dumped, meaning a hash table generation change happening just after it
> adds an entry, if it also causes it to find the end of the table,
> wouldn't be flagged.
>
> Adding an extra call at the end of all these functions should fix that,
> and spill the flag into the next packet, but would that be correct?
The whole _DUMP_INTR scheme does indeed seem to lack robustness.
The update side changes the atomic after the update, and the read
side validates it before. So there's plenty time for a race to happen.
But I'm not sure if that's what you mean or you see more issues.
> It seems this condition is flagged correctly when NLM_DONE is produced,
> I couldn't see why, but I'm guessing another call to
> nl_dump_check_consistent...
>
> Also, I noticed that in net/core/rtnetlink.c:rtnl_dump_all:
>
> if (idx > s_idx) {
> memset(&cb->args[0], 0, sizeof(cb->args));
> cb->prev_seq = 0;
> cb->seq = 0;
> }
> ret = dumpit(skb, cb);
>
> This also prevents it to be detect the condition when dumping the next
> table, but that seems desirable...
That's iterating over protocols, AFAICT, we don't guarantee consistency
across protocols.
> Am I grasping it correctly?
>
> Some functions like net/core/rtnetlink.c:rtnl_dump_ifinfo do call
> nl_dump_check_consistent when finishing, but I'm seeing most others
> don't do that, instead doing it only when adding an entry to the packet
> (another example is: rtnl_stats_dump).
>
> Again, while adding the check at the end of each function would solve
> these inconsistencies, it isn't so clear to me that spilling this flag
> into the next packet when it's going to be from another table is a good
> idea.
>
> It might make more sense to emit a new packet type just for the flag,
> that way, in the sequence of packets, the client can reliably tell the
> dump of which tables was interrupted, and make some decision based on
> that, vs having to deem all tables affected...
>
next prev parent reply other threads:[~2022-06-17 0:16 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20220615171113.7d93af3e@pirotess>
2022-06-15 16:00 ` Netlink NLM_F_DUMP_INTR flag lost Jakub Kicinski
2022-06-16 15:10 ` Ismael Luceno
2022-06-17 0:16 ` Jakub Kicinski [this message]
2022-06-17 13:01 ` Ismael Luceno
2022-06-17 14:55 ` David Ahern
2022-06-17 15:22 ` Jakub Kicinski
2022-06-17 16:17 ` David Ahern
2022-06-17 16:28 ` David Ahern
2022-08-24 10:59 ` Ismael Luceno
2022-08-24 11:46 ` Florian Westphal
2022-06-22 11:12 ` Ismael Luceno
2022-06-22 23:55 ` Jakub Kicinski
2022-06-23 4:01 ` David Ahern
2022-06-23 16:03 ` Jakub Kicinski
2022-06-23 16:17 ` David Ahern
2022-06-23 16:36 ` Jakub Kicinski
2022-06-23 17:31 ` David Ahern
2022-06-23 19:03 ` Jakub Kicinski
2022-06-28 19:38 ` Ismael Luceno
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=20220616171612.66638e54@kernel.org \
--to=kuba@kernel.org \
--cc=davem@davemloft.net \
--cc=dsahern@gmail.com \
--cc=iluceno@suse.de \
--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).