Re: git: fcaa890c4469 - main - mbuf: Only allow extpg mbufs if the system has a direct map
Date: Sat, 21 May 2022 14:58:39 UTC
On Tue, 16 Nov 2021 at 22:52, Mark Johnston <markj@freebsd.org> wrote: > The branch main has been updated by markj: > > URL: > https://cgit.FreeBSD.org/src/commit/?id=fcaa890c4469118255d463495b4044eef484fa3e > > commit fcaa890c4469118255d463495b4044eef484fa3e > Author: Mark Johnston <markj@FreeBSD.org> > AuthorDate: 2021-11-16 18:31:04 +0000 > Commit: Mark Johnston <markj@FreeBSD.org> > CommitDate: 2021-11-16 18:31:04 +0000 > > mbuf: Only allow extpg mbufs if the system has a direct map > > Some upcoming changes will modify software checksum routines like > in_cksum() to operate using m_apply(), which uses the direct map to > access packet data for unmapped mbufs. This approach of course does > not > work on platforms without a direct map, so we have to disallow the use > of unmapped mbufs on such platforms. > > I believe this is the right tradeoff: we only configure KTLS on amd64 > and arm64 today (and one KTLS consumer, NFS TLS, requires a direct map > already), and the use of unmapped mbufs with plain sendfile is a recent > optimization. If need be, m_apply() could be modified to create > CPU-private mappings of extpg mbuf pages as a fallback. > > So, change mb_use_ext_pgs to be hard-wired to zero on systems without a > direct map. Note that PMAP_HAS_DMAP is not a compile-time constant on > some systems, so the default value of mb_use_ext_pgs has to be > determined during boot. > > Reviewed by: jhb > Discussed with: gallatin > MFC after: 2 weeks > Sponsored by: The FreeBSD Foundation > Differential Revision: https://reviews.freebsd.org/D32940 > --- > sys/kern/kern_mbuf.c | 32 ++++++++++++++++++++++++++++++-- > sys/rpc/rpcsec_tls/rpctls_impl.c | 2 +- > 2 files changed, 31 insertions(+), 3 deletions(-) > > diff --git a/sys/kern/kern_mbuf.c b/sys/kern/kern_mbuf.c > index d1f2fd2bd9e4..78a270189a4b 100644 > --- a/sys/kern/kern_mbuf.c > +++ b/sys/kern/kern_mbuf.c > @@ -116,9 +116,26 @@ int nmbjumbop; /* limits number > of page size jumbo clusters */ > int nmbjumbo9; /* limits number of 9k jumbo clusters */ > int nmbjumbo16; /* limits number of 16k jumbo > clusters */ > > -bool mb_use_ext_pgs = true; /* use M_EXTPG mbufs for sendfile & TLS */ > -SYSCTL_BOOL(_kern_ipc, OID_AUTO, mb_use_ext_pgs, CTLFLAG_RWTUN, > +bool mb_use_ext_pgs = false; /* use M_EXTPG mbufs for sendfile & TLS */ > Hi, Does it mean that mb_use_ext_pgs has to be enabled manually now in head and releng/13.1 ? (it was on by default in releng/13.0) I failed to see how it still can be on by default from this change. What about initializing to true under #if PMAP_HAS_DMAP ? > > + > +static int > +sysctl_mb_use_ext_pgs(SYSCTL_HANDLER_ARGS) > +{ > + int error, extpg; > + > + extpg = mb_use_ext_pgs; > + error = sysctl_handle_int(oidp, &extpg, 0, req); > + if (error == 0 && req->newptr != NULL) { > + if (extpg != 0 && !PMAP_HAS_DMAP) > + error = EOPNOTSUPP; > + else > + mb_use_ext_pgs = extpg != 0; > + } > + return (error); > +} > +SYSCTL_PROC(_kern_ipc, OID_AUTO, mb_use_ext_pgs, CTLTYPE_INT | CTLFLAG_RW, > &mb_use_ext_pgs, 0, > + sysctl_mb_use_ext_pgs, "IU", > "Use unmapped mbufs for sendfile(2) and TLS offload"); > > static quad_t maxmbufmem; /* overall real memory limit for all mbufs > */ > @@ -137,6 +154,7 @@ static void > tunable_mbinit(void *dummy) > { > quad_t realmem; > + int extpg; > > /* > * The default limit for all mbuf related memory is 1/2 of all > @@ -173,6 +191,16 @@ tunable_mbinit(void *dummy) > if (nmbufs < nmbclusters + nmbjumbop + nmbjumbo9 + nmbjumbo16) > nmbufs = lmax(maxmbufmem / MSIZE / 5, > nmbclusters + nmbjumbop + nmbjumbo9 + nmbjumbo16); > + > + /* > + * Unmapped mbufs can only safely be used on platforms with a > direct > + * map. > + */ > + if (PMAP_HAS_DMAP) { > + extpg = mb_use_ext_pgs; > + TUNABLE_INT_FETCH("kern.ipc.mb_use_ext_pgs", &extpg); > + mb_use_ext_pgs = extpg != 0; > + } > } > SYSINIT(tunable_mbinit, SI_SUB_KMEM, SI_ORDER_MIDDLE, tunable_mbinit, > NULL); [..]