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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.