OpenZFS on Linux and FreeBSD
Go to file
Brian Behlendorf 10129680f8 Ensure kmem_alloc() and vmem_alloc() never fail
The Solaris semantics for kmem_alloc() and vmem_alloc() are that they
must never fail when called with KM_SLEEP.  They may only fail if
called with KM_NOSLEEP otherwise they must block until memory is
available.  This is quite different from how the Linux memory
allocators work, under Linux a memory allocation failure is always
possible and must be dealt with.

At one point in the past the kmem code did properly implement this
behavior, however as the code evolved this behavior was overlooked
in places.  This patch goes through all three implementations of
the kmem/vmem allocation functions and ensures that they will all
block in the KM_SLEEP case when memory is not available.  They
may still fail in the KM_NOSLEEP case in which case the caller
is responsible for handling the failure.

Special care is taken in vmalloc_nofail() to avoid thrashing the
system on the virtual address space spin lock.  The down side of
course is if you do see a failure here, which is unlikely for
64-bit systems, your allocation will delay for an entire second.
Still this is preferable to locking up your system and it is the
best we can do given the constraints.

Additionally, the code was cleaned up to be much more readable
and comments were added to describe the various kmem-debug-*
configure options.  The default configure options remain:
"--enable-debug-kmem --disable-debug-kmem-tracking"
2010-07-26 15:47:55 -07:00
cmd Fix two minor compiler warnings 2010-07-26 10:24:26 -07:00
config Linux 2.6.35 compat: filp_fsync() dropped 'stuct dentry *' 2010-07-14 11:40:55 -07:00
include Ensure kmem_alloc() and vmem_alloc() never fail 2010-07-26 15:47:55 -07:00
lib Only make compiler warnings fatal with --enable-debug 2010-06-30 17:05:36 -07:00
module Ensure kmem_alloc() and vmem_alloc() never fail 2010-07-26 15:47:55 -07:00
patches Reimplement rwlocks for Linux lock profiling/analysis. 2009-09-18 16:09:47 -07:00
scripts Split <sys/debug.h> header 2010-07-20 13:29:35 -07:00
.gitignore Ignore unsigned module build products 2010-03-11 14:29:17 -08:00
AUTHORS Public Release Prep 2010-05-17 15:18:00 -07:00
COPYING Public Release Prep 2010-05-17 15:18:00 -07:00
ChangeLog Re-Prep for 0.4.9 tag with a few more fixes and updated ChangeLog 2010-05-21 14:17:44 -07:00
DISCLAIMER Public Release Prep 2010-05-17 15:18:00 -07:00
INSTALL Public Release Prep 2010-05-17 15:18:00 -07:00
META Update META to version 0.5.0 2010-06-11 15:57:25 -07:00
Makefile.am Allow spl_config.h to be included by dependant packages (updated) 2010-03-22 14:45:33 -07:00
Makefile.in Only make compiler warnings fatal with --enable-debug 2010-06-30 17:05:36 -07:00
README.markdown Add basic README 2010-06-29 14:18:18 -07:00
autogen.sh Public Release Prep 2010-05-17 15:18:00 -07:00
configure Linux 2.6.35 compat: filp_fsync() dropped 'stuct dentry *' 2010-07-14 11:40:55 -07:00
configure.ac Public Release Prep 2010-05-17 15:18:00 -07:00
spl-modules.spec.in Minor spec file cleanup for RHEL6 package dependency. 2010-05-21 11:53:49 -07:00
spl.spec.in Remove usage of the __id_u macro for portability. 2009-10-05 12:51:58 -07:00
spl_config.h.in Linux 2.6.35 compat: filp_fsync() dropped 'stuct dentry *' 2010-07-14 11:40:55 -07:00

README.markdown

The Solaris Porting Layer (SPL) is a Linux kernel module which provides many of the Solaris kernel APIs. This shim layer makes it possible to run Solaris kernel code in the Linux kernel with relatively minimal modification. This can be particularly useful when you want to track upstream Solaris development closely and dont want the overhead of maintaining a large patch which converts Solaris primitives to Linux primitives.

Documentation for building, configuring, and using the SPL can be found at: http://wiki.github.com/behlendorf/spl/