Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 31 Oct 2016 17:02:46 -0700
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        Konstantin Belousov <kib@FreeBSD.org>
Cc:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r308026 - in head/sys: kern sys ufs/ffs
Message-ID:  <20161101000246.GQ27748@FreeBSD.org>
In-Reply-To: <201610281143.u9SBhxrN008547@repo.freebsd.org>
References:  <201610281143.u9SBhxrN008547@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
  Hi,

On Fri, Oct 28, 2016 at 11:43:59AM +0000, Konstantin Belousov wrote:
K> Author: kib
K> Date: Fri Oct 28 11:43:59 2016
K> New Revision: 308026
K> URL: https://svnweb.freebsd.org/changeset/base/308026
K> 
K> Log:
K>   Generalize UFS buffer pager to allow it serving other filesystems
K>   which also use buffer cache.
K>   
K>   Most important addition to the code is the handling of filesystems
K>   where the block size is less than the machine page size, which might
K>   require reading several buffers to validate single page.
K>   
K>   Tested by:	pho
K>   Sponsored by:	The FreeBSD Foundation
K>   MFC after:	2 weeks
K> 
K> Modified:
K>   head/sys/kern/vfs_bio.c
K>   head/sys/sys/buf.h
K>   head/sys/ufs/ffs/ffs_vnops.c
K> 
K> Modified: head/sys/kern/vfs_bio.c
K> ==============================================================================
K> --- head/sys/kern/vfs_bio.c	Fri Oct 28 11:35:06 2016	(r308025)
K> +++ head/sys/kern/vfs_bio.c	Fri Oct 28 11:43:59 2016	(r308026)
K> @@ -75,9 +75,10 @@ __FBSDID("$FreeBSD$");
K>  #include <vm/vm.h>
K>  #include <vm/vm_param.h>
K>  #include <vm/vm_kern.h>
K> -#include <vm/vm_pageout.h>
K> -#include <vm/vm_page.h>
K>  #include <vm/vm_object.h>
K> +#include <vm/vm_page.h>
K> +#include <vm/vm_pageout.h>
K> +#include <vm/vm_pager.h>
K>  #include <vm/vm_extern.h>
K>  #include <vm/vm_map.h>
K>  #include <vm/swap_pager.h>
K> @@ -4636,6 +4637,161 @@ bdata2bio(struct buf *bp, struct bio *bi
K>  	}
K>  }
K>  
K> +static int buf_pager_relbuf;
K> +SYSCTL_INT(_vfs, OID_AUTO, buf_pager_relbuf, CTLFLAG_RWTUN,
K> +    &buf_pager_relbuf, 0,
K> +    "Make buffer pager release buffers after reading");
K> +
K> +/*
K> + * The buffer pager.  It uses buffer reads to validate pages.
K> + *
K> + * In contrast to the generic local pager from vm/vnode_pager.c, this
K> + * pager correctly and easily handles volumes where the underlying
K> + * device block size is greater than the machine page size.  The
K> + * buffer cache transparently extends the requested page run to be
K> + * aligned at the block boundary, and does the necessary bogus page
K> + * replacements in the addends to avoid obliterating already valid
K> + * pages.
K> + *
K> + * The only non-trivial issue is that the exclusive busy state for
K> + * pages, which is assumed by the vm_pager_getpages() interface, is
K> + * incompatible with the VMIO buffer cache's desire to share-busy the
K> + * pages.  This function performs a trivial downgrade of the pages'
K> + * state before reading buffers, and a less trivial upgrade from the
K> + * shared-busy to excl-busy state after the read.

IMHO, should be noted that the pager ignores requested rbehind and rahead
values, and does the rbehind and rahead sizes that he prefers.

-- 
Totus tuus, Glebius.



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