ABD optimized page allocation code

* Convert ABD to use the Linux Kernel scatterlist implementation
  instead of the hand rolled one from illumos.

* Scatter ABDs are preferentially populated with higher order
  compound pages from a single zone.  Allocation size is
  progressively decreased until it can be satisfied without
  performing reclaim or compaction.

* An alternate page allocator is provided for kernels older
  than 3.6 and for CONFIG_HIGHMEM systems.  This allocator
  is designed as a fallback for maximum compatibility.

* Extended abdstats to provide visibility in the the allocator.

* Add cached value for PAGESIZE in userspace.

Contributions-by:
Chunwei Chen <david.chen@osnexus.com>
Gvozden Neskovic <neskovic@gmail.com>
Jinshan Xiong <jinshan.xiong@intel.com>
Isaac Huang <he.huang@intel.com>
David Quigley <david.quigley@intel.com>
Brian Behlendorf <behlendorf1@llnl.gov>
This commit is contained in:
Chunwei Chen
2016-10-26 00:32:23 -04:00
committed by Brian Behlendorf
parent 4f60152910
commit 9829574834
5 changed files with 465 additions and 144 deletions
+1
View File
@@ -24,6 +24,7 @@ USER_C = \
getmntany.c \
list.c \
mkdirp.c \
page.c \
strlcat.c \
strlcpy.c \
strnlen.c \
+5 -2
View File
@@ -57,8 +57,11 @@
#define MAXUID UINT32_MAX /* max user id */
#define MAXPROJID MAXUID /* max project id */
#ifndef PAGESIZE
#define PAGESIZE (sysconf(_SC_PAGESIZE))
#ifdef PAGESIZE
#undef PAGESIZE
#endif /* PAGESIZE */
extern size_t spl_pagesize(void);
#define PAGESIZE (spl_pagesize())
#endif
+34
View File
@@ -0,0 +1,34 @@
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
#include <unistd.h>
size_t pagesize = 0;
size_t
spl_pagesize(void)
{
if (pagesize == 0)
pagesize = sysconf(_SC_PAGESIZE);
return (pagesize);
}