Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Dec 2022 10:00:24 -0800
From:      James Gritton <jamie@freebsd.org>
To:        jail@freebsd.org
Cc:        bz@freebsd.org, "glebius@FreeBSD.org" <glebius@freebsd.org>, Andrew Gallatin <gallatin@gmail.com>
Subject:   Re: prison_flag() check in hot path of in_pcblookup()
Message-ID:  <e5ef5a4dfae8f7723c10dfb8db9b7d9a@freebsd.org>
In-Reply-To: <CADwhF6VuoPCNEqyBmt%2BdZgDwHdaGty2%2BsYU4eYg0_62CMHq-BA@mail.gmail.com>
References:  <CADwhF6VuoPCNEqyBmt%2BdZgDwHdaGty2%2BsYU4eYg0_62CMHq-BA@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
--=_3054962f98fc689e6f81a2c8ac68acda
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset=US-ASCII;
 format=flowed

On 2022-12-13 09:18, Andrew Gallatin wrote:

> I was trying to improve the performance of in_pcblookup(), as it is a 
> very hot path for us (Netflix). One thing I noticed was the 
> prison_flag() check in in_pcblookup_hash_locked() can cause a cache 
> miss just by deref'ing the cred pointer, and it can also cause multiple 
> misses in tables with collisions by causing us to walk the entire chain 
> even after finding a perfect match.
> 
> I'm curious why this check is needed.  Can you explain it to me?  It 
> originated in this commit:
> 
> commit 413628a7e3d23a897cd959638d325395e4c9691b
> Author: Bjoern A. Zeeb <bz@FreeBSD.org>
> Date:   Sat Nov 29 14:32:14 2008 +0000
> 
> MFp4:
> Bring in updated jail support from bz_jail branch.
> 
> This enhances the current jail implementation to permit multiple
> addresses per jail. In addtion to IPv4, IPv6 is supported as well.
> 
> My thinking is that a jail will either use the host IP, and share its 
> port space, or it will have its own IP entirely (but I know nothing 
> about jails).  In either case, a perfect 4-tuple match should be enough 
> to uniquely identify the connection.
> 
> Even if this somehow is not the case and we have multiple connections 
> somehow sharing the same 4-tuple, how does checking the prison flag 
> help us?  It would prefer the jailed connection over the non jailed, 
> but that would shadow a host connection.  And if we had 2 jails sharing 
> the same 4-tuple, the first jail would win.
> 
> I can't see how this check is doing anything useful, so I'd very much 
> like to remove this check if possible.   Untested patch attached.

For a complete 4-tuple, it should indeed be the case that a match would 
only ever identify a single prison.  The later part of the function that 
examines wildcards definitely needs the check.  I don't get the XXX 
comment about both being bound with SO_REUSEPORT, because I would only 
expect that to apply to listening, not to full connections. But I also 
expect Bjoern to know more than I do here...

- Jamie
--=_3054962f98fc689e6f81a2c8ac68acda
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8

<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; charset=
=3DUTF-8" /></head><body style=3D'font-size: 10pt; font-family: Verdana,Gen=
eva,sans-serif'>
<p id=3D"reply-intro">On 2022-12-13 09:18, Andrew Gallatin wrote:</p>
<blockquote type=3D"cite" style=3D"padding: 0 0.4em; border-left: #1010ff 2=
px solid; margin: 0">
<div id=3D"replybody1">
<div dir=3D"ltr">
<div>I was trying to improve the performance of in_pcblookup(), as it is a =
very hot path for us (Netflix). One thing I noticed was the prison_flag() c=
heck in in_pcblookup_hash_locked() can cause a cache miss just by <span cla=
ss=3D"v1gmail-LI v1gmail-ng">deref'ing</span> the cred pointer, and it can =
also cause multiple misses in tables with collisions by causing us to walk =
the entire chain even after finding a perfect match.</div>
<div>&nbsp;</div>
<div>I'm curious why this check is needed.&nbsp; Can you explain it to me?&=
nbsp; It originated in this commit:</div>
<div>&nbsp;</div>
<div>
<pre class=3D"v1gmail-c-mrkdwn__pre">commit 413628a7e3d23a897cd959638d32539=
5e4c9691b
Author: Bjoern A. Zeeb &lt;bz@FreeBSD.org&gt;
Date:   Sat Nov 29 14:32:14 2008 +0000

    MFp4:
      Bring in updated jail support from bz_jail branch.
   =20
    This enhances the current jail implementation to permit multiple
    addresses per jail. In <span class=3D"v1gmail-LI v1gmail-ng">addtion</s=
pan> to IPv4, IPv6 is supported as well.</pre>
</div>
<div>&nbsp;</div>
<div>My thinking is that a jail will either use the host IP, and share its =
port space, or it will have its own IP entirely (but I know nothing about j=
ails).&nbsp; In either case, a perfect 4-tuple match should be enough to un=
iquely identify the connection.&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div>&nbsp;</div>
<div>Even if this somehow is not the case and we have multiple connections =
somehow sharing the same 4-tuple, how does checking the prison flag help us=
?&nbsp; It would prefer the jailed connection over the non jailed, but that=
 would shadow a host connection.&nbsp; And if we had 2 jails sharing the sa=
me 4-tuple, the first jail would win.</div>
<div>&nbsp;</div>
<div>I can't see how this check is doing anything useful, so I'd very much =
like to remove this check if possible.&nbsp;&nbsp; Untested patch attached=
=2E</div>
</div>
</div>
</blockquote>
<div id=3D"replybody1">
<div dir=3D"ltr">
<div>&nbsp;</div>
<div>For a complete 4-tuple, it should indeed be the case that a match woul=
d only ever identify a single prison.&nbsp; The later part of the function =
that examines wildcards definitely needs the check.&nbsp; I don't get the X=
XX comment about both being bound with SO_REUSEPORT, because I would only e=
xpect that to apply to listening, not to full connections. But I also expec=
t Bjoern to know more than I do here...</div>
<div>&nbsp;</div>
<div>- Jamie</div>
</div>
</div>
</body></html>

--=_3054962f98fc689e6f81a2c8ac68acda--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?e5ef5a4dfae8f7723c10dfb8db9b7d9a>