aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Gallagher <[email protected]>2018-06-15 15:10:42 -0700
committerBrian Behlendorf <[email protected]>2018-06-15 15:10:42 -0700
commit917f475fba03ceb4e11c7aa35aff09c47a6c596e (patch)
tree92ce7d3981d5ca93e1bbcb42665e9ecc3e1ed1ed
parent7b98f0d91f09df90218322df5cf1b8ba7928972e (diff)
Add tunables for channel programs
This patch adds tunables for modifying the maximum memory limit and maximum instruction limit that can be specified when running a channel program. Reviewed-by: Matthew Ahrens <[email protected]> Reviewed-by: Brian Behlendorf <[email protected] Reviewed-by: Sara Hartse <[email protected]> Signed-off-by: John Gallagher <[email protected]> External-issue: LX-1085 Closes #7618
-rw-r--r--cmd/zfs/zfs_main.c20
-rw-r--r--include/sys/zcp.h6
-rw-r--r--man/man5/zfs-module-parameters.525
-rw-r--r--module/zfs/zcp.c18
-rwxr-xr-xtests/zfs-tests/tests/functional/channel_program/lua_core/tst.memory_limit.ksh6
5 files changed, 49 insertions, 26 deletions
diff --git a/cmd/zfs/zfs_main.c b/cmd/zfs/zfs_main.c
index b45e93c3f..e60ac514d 100644
--- a/cmd/zfs/zfs_main.c
+++ b/cmd/zfs/zfs_main.c
@@ -21,7 +21,7 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2011, 2017 by Delphix. All rights reserved.
+ * Copyright (c) 2011, 2018 by Delphix. All rights reserved.
* Copyright 2012 Milan Jurik. All rights reserved.
* Copyright (c) 2012, Joyent, Inc. All rights reserved.
* Copyright (c) 2013 Steven Hartland. All rights reserved.
@@ -7308,24 +7308,10 @@ zfs_do_channel_program(int argc, char **argv)
}
if (c == 't') {
- if (arg > ZCP_MAX_INSTRLIMIT || arg == 0) {
- (void) fprintf(stderr, gettext(
- "Invalid instruction limit: "
- "%s\n"), optarg);
- return (1);
- } else {
- instrlimit = arg;
- }
+ instrlimit = arg;
} else {
ASSERT3U(c, ==, 'm');
- if (arg > ZCP_MAX_MEMLIMIT || arg == 0) {
- (void) fprintf(stderr, gettext(
- "Invalid memory limit: "
- "%s\n"), optarg);
- return (1);
- } else {
- memlimit = arg;
- }
+ memlimit = arg;
}
break;
}
diff --git a/include/sys/zcp.h b/include/sys/zcp.h
index b56eda552..b9c8ef006 100644
--- a/include/sys/zcp.h
+++ b/include/sys/zcp.h
@@ -14,7 +14,7 @@
*/
/*
- * Copyright (c) 2016, 2017 by Delphix. All rights reserved.
+ * Copyright (c) 2016, 2018 by Delphix. All rights reserved.
*/
#ifndef _SYS_ZCP_H
@@ -33,8 +33,8 @@ extern "C" {
#define ZCP_RUN_INFO_KEY "runinfo"
-extern uint64_t zfs_lua_max_instrlimit;
-extern uint64_t zfs_lua_max_memlimit;
+extern unsigned long zfs_lua_max_instrlimit;
+extern unsigned long zfs_lua_max_memlimit;
int zcp_argerror(lua_State *, int, const char *, ...);
diff --git a/man/man5/zfs-module-parameters.5 b/man/man5/zfs-module-parameters.5
index dbfa8806a..7a195ab12 100644
--- a/man/man5/zfs-module-parameters.5
+++ b/man/man5/zfs-module-parameters.5
@@ -1,6 +1,7 @@
'\" te
.\" Copyright (c) 2013 by Turbo Fredriksson <[email protected]>. All rights reserved.
.\" Copyright (c) 2017 Datto Inc.
+.\" Copyright (c) 2018 by Delphix. All rights reserved.
.\" The contents of this file are subject to the terms of the Common Development
.\" and Distribution License (the "License"). You may not use this file except
.\" in compliance with the License. You can obtain a copy of the license at
@@ -1563,6 +1564,30 @@ Default value: \fB32,768\fR.
.sp
.ne 2
.na
+\fBzfs_lua_max_instrlimit\fR (ulong)
+.ad
+.RS 12n
+The maximum execution time limit that can be set for a ZFS channel program,
+specified as a number of Lua instructions.
+.sp
+Default value: \fB100,000,000\fR.
+.RE
+
+.sp
+.ne 2
+.na
+\fBzfs_lua_max_memlimit\fR (ulong)
+.ad
+.RS 12n
+The maximum memory limit that can be set for a ZFS channel program, specified
+in bytes.
+.sp
+Default value: \fB104,857,600\fR.
+.RE
+
+.sp
+.ne 2
+.na
\fBzfs_max_recordsize\fR (int)
.ad
.RS 12n
diff --git a/module/zfs/zcp.c b/module/zfs/zcp.c
index e7194344b..dad09da50 100644
--- a/module/zfs/zcp.c
+++ b/module/zfs/zcp.c
@@ -14,7 +14,7 @@
*/
/*
- * Copyright (c) 2016, 2017 by Delphix. All rights reserved.
+ * Copyright (c) 2016, 2018 by Delphix. All rights reserved.
*/
/*
@@ -108,8 +108,8 @@
#define ZCP_NVLIST_MAX_DEPTH 20
uint64_t zfs_lua_check_instrlimit_interval = 100;
-uint64_t zfs_lua_max_instrlimit = ZCP_MAX_INSTRLIMIT;
-uint64_t zfs_lua_max_memlimit = ZCP_MAX_MEMLIMIT;
+unsigned long zfs_lua_max_instrlimit = ZCP_MAX_INSTRLIMIT;
+unsigned long zfs_lua_max_memlimit = ZCP_MAX_MEMLIMIT;
/*
* Forward declarations for mutually recursive functions
@@ -1417,3 +1417,15 @@ zcp_parse_args(lua_State *state, const char *fname, const zcp_arg_t *pargs,
zcp_parse_pos_args(state, fname, pargs, kwargs);
}
}
+
+#if defined(_KERNEL)
+/* BEGIN CSTYLED */
+module_param(zfs_lua_max_instrlimit, ulong, 0644);
+MODULE_PARM_DESC(zfs_lua_max_instrlimit,
+ "Max instruction limit that can be specified for a channel program");
+
+module_param(zfs_lua_max_memlimit, ulong, 0644);
+MODULE_PARM_DESC(zfs_lua_max_memlimit,
+ "Max memory limit that can be specified for a channel program");
+/* END CSTYLED */
+#endif
diff --git a/tests/zfs-tests/tests/functional/channel_program/lua_core/tst.memory_limit.ksh b/tests/zfs-tests/tests/functional/channel_program/lua_core/tst.memory_limit.ksh
index dbac58387..288577568 100755
--- a/tests/zfs-tests/tests/functional/channel_program/lua_core/tst.memory_limit.ksh
+++ b/tests/zfs-tests/tests/functional/channel_program/lua_core/tst.memory_limit.ksh
@@ -61,12 +61,12 @@ log_mustnot_checkerror_program "Memory limit exhausted" -m 1 $TESTPOOL - <<-EOF
return s
EOF
-log_mustnot_checkerror_program "Invalid memory limit" \
- -m 1000000000000 $TESTPOOL - <<-EOF
+log_mustnot_checkerror_program "Invalid instruction or memory limit" \
+ -m 200000000 $TESTPOOL - <<-EOF
return 1;
EOF
-log_mustnot_checkerror_program "Invalid memory limit" \
+log_mustnot_checkerror_program "Return value too large" \
-m 9223372036854775808 $TESTPOOL - <<-EOF
return 1;
EOF