diff options
author | Ryan Moeller <[email protected]> | 2020-08-18 12:33:55 -0400 |
---|---|---|
committer | GitHub <[email protected]> | 2020-08-18 09:33:55 -0700 |
commit | 009cc8e884a84aeebed612ab64c30f77eab38392 (patch) | |
tree | 90543c65a111b81e7f0b8e64e6544ccfb853203b /module/zfs/zfs_ioctl.c | |
parent | 663a070c92b365262f674d1b443d3749d75d7493 (diff) |
Make zc_nvlist_src_size limit tunable
We limit the size of nvlists passed to the kernel so a user cannot make
the kernel do an unreasonably large allocation. On FreeBSD this limit
was 128 kiB, which turns out to be a bit too small when doing some
operations involving a large number of datasets or snapshots, for
example replication.
Make this limit tunable, with a platform-specific auto default.
Linux keeps its limit at KMALLOC_MAX_SIZE. FreeBSD uses 1/4 of the
system limit on user wired memory, which allows it to scale depending
on system configuration.
Reviewed-by: Matt Macy <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Ryan Moeller <[email protected]>
Issue #6572
Closes #10706
Diffstat (limited to 'module/zfs/zfs_ioctl.c')
-rw-r--r-- | module/zfs/zfs_ioctl.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/module/zfs/zfs_ioctl.c b/module/zfs/zfs_ioctl.c index a58fd99ad..463704c14 100644 --- a/module/zfs/zfs_ioctl.c +++ b/module/zfs/zfs_ioctl.c @@ -225,8 +225,9 @@ zfsdev_state_t *zfsdev_state_list; /* * Limit maximum nvlist size. We don't want users passing in insane values * for zc->zc_nvlist_src_size, since we will need to allocate that much memory. + * Defaults to 0=auto which is handled by platform code. */ -#define MAX_NVLIST_SRC_SIZE KMALLOC_MAX_SIZE +unsigned long zfs_max_nvlist_src_size = 0; uint_t zfs_fsyncer_key; uint_t zfs_allow_log_key; @@ -7341,6 +7342,7 @@ zfsdev_ioctl_common(uint_t vecnum, zfs_cmd_t *zc, int flag) int error, cmd; const zfs_ioc_vec_t *vec; char *saved_poolname = NULL; + uint64_t max_nvlist_src_size; size_t saved_poolname_len = 0; nvlist_t *innvl = NULL; fstrans_cookie_t cookie; @@ -7360,7 +7362,8 @@ zfsdev_ioctl_common(uint_t vecnum, zfs_cmd_t *zc, int flag) return (SET_ERROR(ZFS_ERR_IOC_CMD_UNAVAIL)); zc->zc_iflags = flag & FKIOCTL; - if (zc->zc_nvlist_src_size > MAX_NVLIST_SRC_SIZE) { + max_nvlist_src_size = zfs_max_nvlist_src_size_os(); + if (zc->zc_nvlist_src_size > max_nvlist_src_size) { /* * Make sure the user doesn't pass in an insane value for * zc_nvlist_src_size. We have to check, since we will end @@ -7593,3 +7596,8 @@ zfs_kmod_fini(void) tsd_destroy(&rrw_tsd_key); tsd_destroy(&zfs_allow_log_key); } + +/* BEGIN CSTYLED */ +ZFS_MODULE_PARAM(zfs, zfs_, max_nvlist_src_size, ULONG, ZMOD_RW, + "Maximum size in bytes allowed for src nvlist passed with ZFS ioctls"); +/* END CSTYLED */ |