Skip site navigation (1)Skip section navigation (2)
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>