Date: Thu, 8 Jul 2010 15:03:17 +0300 From: Kostik Belousov <kostikbel@gmail.com> To: Andre Oppermann <andre@freebsd.org> Cc: freebsd-net@freebsd.org, Ming Fu <Ming.Fu@watchguard.com>, Andriy Gapon <avg@icyb.net.ua>, bz@freebsd.org, rwatson@freebsd.org, lstewart@freebsd.org Subject: Re: kern/123095 kern/131602 sendfile Message-ID: <20100708120317.GD2408@deviant.kiev.zoral.com.ua> In-Reply-To: <4C35BD7A.8020408@freebsd.org> References: <7C3D15DD6E8F464998CA1470D8A322F302BB9F72@ES02CO.wgti.net> <20100707205041.GO13238@deviant.kiev.zoral.com.ua> <4C358843.5000001@freebsd.org> <4C358A01.8080206@icyb.net.ua> <20100708082943.GB2439@deviant.kiev.zoral.com.ua> <4C358EE5.8070003@icyb.net.ua> <20100708094255.GA2408@deviant.kiev.zoral.com.ua> <4C35B7C4.40507@freebsd.org> <20100708114705.GC2408@deviant.kiev.zoral.com.ua> <4C35BD7A.8020408@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
--BRE3mIcgqKzpedwo Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, Jul 08, 2010 at 01:58:50PM +0200, Andre Oppermann wrote: > On 08.07.2010 13:47, Kostik Belousov wrote: > >On Thu, Jul 08, 2010 at 01:34:28PM +0200, Andre Oppermann wrote: > >>On 08.07.2010 11:42, Kostik Belousov wrote: > >>>On Thu, Jul 08, 2010 at 11:40:05AM +0300, Andriy Gapon wrote: > >>>>on 08/07/2010 11:29 Kostik Belousov said the following: > >>>>>Right, the patch maps the page in sf buffer read-only (on i386 only). > >>>>>But note the parallel posting with m_cat() change. It is still not > >>>>>enough, > >>>>>and I am not set up for the real network testing ATM. > >>>> > >>>>Could you also try to experiment with mb_dupcl? > >>>>Namely transfer M_RDONLY from source mbuf. > >>> > >>>Right, it is it. > >>> > >>>Below is my current patch including debugging facilities that seems to > >>>work. > >>>Real changes that needed are in m_cat and mb_dupcl. > >>> > >>... > >>>diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c > >>>index f41eb03..1701ef2 100644 > >>>--- a/sys/kern/uipc_mbuf.c > >>>+++ b/sys/kern/uipc_mbuf.c > >>>@@ -301,7 +301,7 @@ mb_dupcl(struct mbuf *n, struct mbuf *m) > >>> n->m_ext.ext_size =3D m->m_ext.ext_size; > >>> n->m_ext.ref_cnt =3D m->m_ext.ref_cnt; > >>> n->m_ext.ext_type =3D m->m_ext.ext_type; > >>>- n->m_flags |=3D M_EXT; > >>>+ n->m_flags |=3D M_EXT | (M_RDONLY& m->m_flags); > >>> } > >> > >>Having the M_EXT flag always implies readonly and M_WRITABLE gets this > >>right. Not inheriting all the flags from the source seems questionable. > >>So IMHO this should be done here: > >> > >> n->m_flags |=3D (M_EXT | m->m_flags) > >> > >>> /* > >>>@@ -911,7 +911,8 @@ m_cat(struct mbuf *m, struct mbuf *n) > >>> m =3D m->m_next; > >>> while (n) { > >>> if (m->m_flags& M_EXT || > >>>- m->m_data + m->m_len + n->m_len>=3D&m->m_dat[MLEN]) { > >>>+ m->m_data + m->m_len + n->m_len>=3D&m->m_dat[MLEN] || > >>>+ !M_WRITABLE(m)) { > >> > >>Here you can fully replace the (m->m_flags& M_EXT) test with > >>M_WRITABLE(). The M_EXT test is included in it. > >> > >>> /* just join the two chains */ > >>> m->m_next =3D n; > >>> return; > > > >The patch is below. Works as well for me, thank you for the feedback. >=20 > You may want to run the change to m_dupcl() by rwatson just to be sure. > It should be the right thing to do but better have another mbuf expert > look at it. Added Robert to Cc: list, let's see. >=20 > Does this fix the sendfile corruption problem for all cases or just the > panic for the loopback case? I do not know. It fixes both panics with debugging patches applied and indeed prevents corruption, for my setup on loopback. I have to defer to external testing for !lo case. >=20 > >diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c > >index f41eb03..58567a4 100644 > >--- a/sys/kern/uipc_mbuf.c > >+++ b/sys/kern/uipc_mbuf.c > >@@ -301,7 +301,7 @@ mb_dupcl(struct mbuf *n, struct mbuf *m) > > n->m_ext.ext_size =3D m->m_ext.ext_size; > > n->m_ext.ref_cnt =3D m->m_ext.ref_cnt; > > n->m_ext.ext_type =3D m->m_ext.ext_type; > >- n->m_flags |=3D M_EXT; > >+ n->m_flags |=3D M_EXT | m->m_flags; > > } > > > > /* > >@@ -910,7 +910,7 @@ m_cat(struct mbuf *m, struct mbuf *n) > > while (m->m_next) > > m =3D m->m_next; > > while (n) { > >- if (m->m_flags& M_EXT || > >+ if (!M_WRITABLE(m) || > > m->m_data + m->m_len + n->m_len>=3D&m->m_dat[MLEN]) { > > /* just join the two chains */ > > m->m_next =3D n; >=20 > --=20 > Andre --BRE3mIcgqKzpedwo Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (FreeBSD) iEYEARECAAYFAkw1voUACgkQC3+MBN1Mb4jo7QCg2zdDNnOQdHGNfeV9gJfOKiGY r3MAnjJhTjbbHzuLHBvC7+k7cENXoCuI =rL2f -----END PGP SIGNATURE----- --BRE3mIcgqKzpedwo--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100708120317.GD2408>