bbcec73783
`kmem_alloc(size>PAGESIZE, KM_SLEEP)` is backed by `kmalloc()`, which finds contiguous physical memory. If there isn't enough contiguous physical memory available (e.g. due to physical page fragmentation), the OOM killer will be invoked to make more memory available. This is not ideal because processes may be killed when there is still plenty of free memory (it just happens to be in individual pages, not contiguous runs of pages). We have observed this when allocating the ~13KB `zfs_cmd_t`, for example in `zfsdev_ioctl()`. This commit changes the behavior of `kmem_alloc(size>PAGESIZE, KM_SLEEP)` when there are insufficient contiguous free pages. In this case we will find individual pages and stitch them together using virtual memory. This is accomplished by using `kvmalloc()`, which implements the described behavior by trying `kmalloc(__GFP_NORETRY)` and falling back on `vmalloc()`. The behavior of `kmem_alloc(KM_NOSLEEP)` is not changed; it continues to use `kmalloc(GPF_ATOMIC | __GFP_NORETRY)`. This is because `vmalloc()` may sleep. Reviewed-by: Tony Nguyen <tony.nguyen@delphix.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: George Wilson <gwilson@delphix.com> Signed-off-by: Matthew Ahrens <mahrens@delphix.com> Closes #11461 |
||
---|---|---|
.. | ||
Makefile.in | ||
README.md | ||
THIRDPARTYLICENSE.gplv2 | ||
THIRDPARTYLICENSE.gplv2.descrip | ||
spl-atomic.c | ||
spl-condvar.c | ||
spl-cred.c | ||
spl-err.c | ||
spl-generic.c | ||
spl-kmem-cache.c | ||
spl-kmem.c | ||
spl-kstat.c | ||
spl-proc.c | ||
spl-procfs-list.c | ||
spl-taskq.c | ||
spl-thread.c | ||
spl-trace.c | ||
spl-tsd.c | ||
spl-vmem.c | ||
spl-xdr.c | ||
spl-zlib.c |
README.md
The Solaris Porting Layer, SPL, is a Linux kernel module which provides a compatibility layer used by the OpenZFS project.
Installation
The latest version of the SPL is maintained as part of this repository. Only when building ZFS version 0.7.x or earlier must an external SPL release be used. These releases can be found at:
- Version 0.7.x: https://github.com/zfsonlinux/spl/tree/spl-0.7-release
- Version 0.6.5.x: https://github.com/zfsonlinux/spl/tree/spl-0.6.5-release
Release
The SPL is released under a GPLv2 license.
For more details see the NOTICE and THIRDPARTYLICENSE files; UCRL-CODE-235197