From: Breno Leitao <leitao@debian.org>
To: Jakub Kicinski <kuba@kernel.org>
Cc: horms@kernel.org, davem@davemloft.net, edumazet@google.com,
pabeni@redhat.com, thepacketgeek@gmail.com,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
davej@codemonkey.org.uk, vlad.wing@gmail.com, max@kutsevol.com,
kernel-team@meta.com, jiri@resnulli.us, jv@jvosburgh.net,
andy@greyhouse.net, aehkn@xenhub.one,
Rik van Riel <riel@surriel.com>,
Al Viro <viro@zeniv.linux.org.uk>
Subject: Re: [PATCH net-next 1/3] net: netpoll: Defer skb_pool population until setup success
Date: Fri, 1 Nov 2024 03:51:59 -0700 [thread overview]
Message-ID: <20241101-cheerful-pretty-wapiti-d5f69e@leitao> (raw)
In-Reply-To: <20241031182647.3fbb2ac4@kernel.org>
Hello Jakub,
On Thu, Oct 31, 2024 at 06:26:47PM -0700, Jakub Kicinski wrote:
> On Fri, 25 Oct 2024 07:20:18 -0700 Breno Leitao wrote:
> > The current implementation has a flaw where it populates the skb_pool
> > with 32 SKBs before calling __netpoll_setup(). If the setup fails, the
> > skb_pool buffer will persist indefinitely and never be cleaned up.
> >
> > This change moves the skb_pool population to after the successful
> > completion of __netpoll_setup(), ensuring that the buffers are not
> > unnecessarily retained. Additionally, this modification alleviates rtnl
> > lock pressure by allowing the buffer filling to occur outside of the
> > lock.
>
> arguably if the setup succeeds there would now be a window of time
> where np is active but pool is empty.
I am not convinced this is a problem. Given that netpoll_setup() is only
called from netconsole.
In netconsole, a target is not enabled (as in sending packets) until the
netconsole target is, in fact, enabled. (nt->enabled = true). Enabling
the target(nt) only happen after netpoll_setup() returns successfully.
Example:
static void write_ext_msg(struct console *con, const char *msg,
unsigned int len)
{
...
list_for_each_entry(nt, &target_list, list)
if (nt->extended && nt->enabled && netif_running(nt->np.dev))
send_ext_msg_udp(nt, msg, len);
So, back to your point, the netpoll interface will be up, but, not used
at all.
On top of that, two other considerations:
* If the netpoll target is used without the buffer, it is not a big
deal, since refill_skbs() is called, independently if the pool is full
or not. (Which is not ideal and I eventually want to improve it).
Anyway, this is how the code works today:
void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
{
...
skb = find_skb(np, total_len + np->dev->needed_tailroom,...
// transmit the skb
static struct sk_buff *find_skb(struct netpoll *np, int len, int reserve)
{
...
refill_skbs(np);
skb = alloc_skb(len, GFP_ATOMIC);
if (!skb)
skb = skb_dequeue(&np->skb_pool);
...
// return the skb
So, even in there is a transmission in-between enabling the netpoll
target and not populating the pool (which is NOT the case in the code
today), it would not be a problem, given that netpoll_send_udp() will
call refill_skbs() anyway.
I have an in-development patch to improve it, by deferring this to a
workthread, mainly because this whole allocation dance is done with a
bunch of locks held, including printk/console lock.
I think that a best mechanism might be something like:
* If find_skb() needs to consume from the pool (which is rare, only
when alloc_skb() fails), raise workthread that tries to repopulate the
pool in the background.
* Eventually avoid alloc_skb() first, and getting directly from the
pool first, if the pool is depleted, try to alloc_skb(GPF_ATOMIC).
This might make the code faster, but, I don't have data yet.
This might also required a netpool reconfigurable of pool size. Today
it is hardcoded (#define MAX_SKBS 32). This current patchset is the
first step to individualize the pool, then, we can have a field in
struct netpoll that specify what is the pool size (32 by default),
but user configuration.
On netconsole, we can do it using the configfs fields.
Anyway, are these ideas too crazy?
next prev parent reply other threads:[~2024-11-01 10:52 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-25 14:20 [PATCH net-next 0/3] net: netpoll: Improve SKB pool management Breno Leitao
2024-10-25 14:20 ` [PATCH net-next 1/3] net: netpoll: Defer skb_pool population until setup success Breno Leitao
2024-11-01 1:26 ` Jakub Kicinski
2024-11-01 10:51 ` Breno Leitao [this message]
2024-11-01 18:18 ` Breno Leitao
2024-11-02 2:01 ` Jakub Kicinski
2024-11-04 20:40 ` Breno Leitao
2024-11-06 1:00 ` Jakub Kicinski
2024-11-06 15:06 ` Breno Leitao
2024-11-06 23:43 ` Jakub Kicinski
2024-11-07 11:50 ` Breno Leitao
2024-10-25 14:20 ` [PATCH net-next 2/3] net: netpoll: Individualize the skb pool Breno Leitao
2024-11-01 1:28 ` Jakub Kicinski
2024-11-01 11:56 ` Breno Leitao
2024-10-25 14:20 ` [PATCH net-next 3/3] net: netpoll: flush skb pool during cleanup Breno Leitao
2024-11-01 1:29 ` Jakub Kicinski
2024-11-01 11:57 ` Breno Leitao
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=20241101-cheerful-pretty-wapiti-d5f69e@leitao \
--to=leitao@debian.org \
--cc=aehkn@xenhub.one \
--cc=andy@greyhouse.net \
--cc=davej@codemonkey.org.uk \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=jiri@resnulli.us \
--cc=jv@jvosburgh.net \
--cc=kernel-team@meta.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=max@kutsevol.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=riel@surriel.com \
--cc=thepacketgeek@gmail.com \
--cc=viro@zeniv.linux.org.uk \
--cc=vlad.wing@gmail.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