Date: Thu, 01 Oct 2020 12:22:25 -0700 From: Ravi Pokala <rpokala@freebsd.org> To: Bryan Drewery <bdrewery@FreeBSD.org>, <src-committers@freebsd.org>, <svn-src-all@freebsd.org>, <svn-src-head@freebsd.org> Subject: Re: svn commit: r366340 - head/sys/kern Message-ID: <722E6718-7A24-4D15-84A8-C769C220EDCB@panasas.com> In-Reply-To: <202010011917.091JH3jX031245@repo.freebsd.org> References: <202010011917.091JH3jX031245@repo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
If you changed it to bool, shouldn't you be using "true" and "false"? Thanks, Ravi (rpokala@) =EF=BB=BF-----Original Message----- From: <owner-src-committers@freebsd.org> on behalf of Bryan Drewery <bdrewe= ry@FreeBSD.org> Date: 2020-10-01, Thursday at 12:17 To: <src-committers@freebsd.org>, <svn-src-all@freebsd.org>, <svn-src-head@= freebsd.org> Subject: svn commit: r366340 - head/sys/kern Author: bdrewery Date: Thu Oct 1 19:17:03 2020 New Revision: 366340 URL: https://svnweb.freebsd.org/changeset/base/366340 Log: Use unlocked page lookup for inmem() to avoid object lock contention Reviewed By: kib, markj Sponsored by: Dell EMC Isilon Submitted by: mlaier Differential Revision: https://reviews.freebsd.org/D26597 Modified: head/sys/kern/vfs_bio.c Modified: head/sys/kern/vfs_bio.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D --- head/sys/kern/vfs_bio.c Thu Oct 1 19:06:07 2020 (r366339) +++ head/sys/kern/vfs_bio.c Thu Oct 1 19:17:03 2020 (r366340) @@ -154,7 +154,7 @@ caddr_t __read_mostly unmapped_buf; /* Used below and for softdep flushing threads in ufs/ffs/ffs_softdep.= c */ struct proc *bufdaemonproc; -static int inmem(struct vnode *vp, daddr_t blkno); +static bool inmem(struct vnode *vp, daddr_t blkno); static void vm_hold_free_pages(struct buf *bp, int newbsize); static void vm_hold_load_pages(struct buf *bp, vm_offset_t from, vm_offset_t to); @@ -3586,20 +3586,21 @@ incore(struct bufobj *bo, daddr_t blkno) * it also hunts around in the VM system for the data. */ -static int +static bool inmem(struct vnode * vp, daddr_t blkno) { vm_object_t obj; vm_offset_t toff, tinc, size; - vm_page_t m; + vm_page_t m, n; vm_ooffset_t off; + int valid; ASSERT_VOP_LOCKED(vp, "inmem"); if (incore(&vp->v_bufobj, blkno)) - return 1; + return (1); if (vp->v_mount =3D=3D NULL) - return 0; + return (0); obj =3D vp->v_object; if (obj =3D=3D NULL) return (0); @@ -3609,24 +3610,30 @@ inmem(struct vnode * vp, daddr_t blkno) size =3D vp->v_mount->mnt_stat.f_iosize; off =3D (vm_ooffset_t)blkno * (vm_ooffset_t)vp->v_mount->mnt_stat.f_ios= ize; - VM_OBJECT_RLOCK(obj); for (toff =3D 0; toff < vp->v_mount->mnt_stat.f_iosize; toff +=3D tinc) { - m =3D vm_page_lookup(obj, OFF_TO_IDX(off + toff)); - if (!m) - goto notinmem; + m =3D vm_page_lookup_unlocked(obj, OFF_TO_IDX(off + toff)); +recheck: + if (m =3D=3D NULL) + return (0); + /* + * Consider page validity only if page mapping didn't change + * during the check. + */ + valid =3D vm_page_is_valid(m, + (vm_offset_t)((toff + off) & PAGE_MASK), tinc); + n =3D vm_page_lookup_unlocked(obj, OFF_TO_IDX(off + toff)); + if (m !=3D n) { + m =3D n; + goto recheck; + } + if (!valid) + return (0); + tinc =3D size; if (tinc > PAGE_SIZE - ((toff + off) & PAGE_MASK)) tinc =3D PAGE_SIZE - ((toff + off) & PAGE_MASK); - if (vm_page_is_valid(m, - (vm_offset_t) ((toff + off) & PAGE_MASK), tinc) =3D=3D 0) - goto notinmem; } - VM_OBJECT_RUNLOCK(obj); - return 1; - -notinmem: - VM_OBJECT_RUNLOCK(obj); - return (0); + return (1); } /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?722E6718-7A24-4D15-84A8-C769C220EDCB>