nnicindexes, nicindexes,
def->resource->partition,
-1,
+ 0,
&cgroup) < 0)
goto cleanup;
| limits_entry "max_core"
| bool_entry "dump_guest_core"
| str_entry "stdio_handler"
+ | int_entry "max_threads_per_process"
let device_entry = bool_entry "mac_filter"
| bool_entry "relaxed_acs_check"
#max_processes = 0
#max_files = 0
+# If max_threads_per_process is set to a positive integer, libvirt
+# will use it to set the maximum number of threads that can be
+# created by a qemu process. Some VM configurations can result in
+# qemu processes with tens of thousands of threads. systemd-based
+# systems typically limit the number of threads per process to
+# 16k. max_threads_per_process can be used to override default
+# limits in the host OS.
+#
+#max_threads_per_process = 0
+
# If max_core is set to a non-zero integer, then QEMU will be
# permitted to create core dumps when it crashes, provided its
# RAM size is smaller than the limit set.
nnicindexes, nicindexes,
vm->def->resource->partition,
cfg->cgroupControllers,
+ cfg->maxThreadsPerProc,
&priv->cgroup) < 0) {
if (virCgroupNewIgnoreError())
goto done;
return -1;
if (virConfGetValueUInt(conf, "max_files", &cfg->maxFiles) < 0)
return -1;
+ if (virConfGetValueUInt(conf, "max_threads_per_process", &cfg->maxThreadsPerProc) < 0)
+ return -1;
if (virConfGetValueType(conf, "max_core") == VIR_CONF_STRING) {
if (virConfGetValueString(conf, "max_core", &corestr) < 0)
unsigned int maxProcesses;
unsigned int maxFiles;
+ unsigned int maxThreadsPerProc;
unsigned long long maxCore;
bool dumpGuestCore;
{ "set_process_name" = "1" }
{ "max_processes" = "0" }
{ "max_files" = "0" }
+{ "max_threads_per_process" = "0" }
{ "max_core" = "unlimited" }
{ "dump_guest_core" = "1" }
{ "mac_filter" = "1" }
int *nicindexes,
const char *partition,
int controllers,
+ unsigned int maxthreads,
virCgroupPtr *group)
{
int rv;
isContainer,
nnicindexes,
nicindexes,
- partition)) < 0)
+ partition,
+ maxthreads)) < 0)
return rv;
if (controllers != -1)
int *nicindexes,
const char *partition,
int controllers,
+ unsigned int maxthreads,
virCgroupPtr *group)
{
int rv;
nicindexes,
partition,
controllers,
+ maxthreads,
group)) == 0)
return 0;
int *nicindexes,
const char *partition,
int controllers,
+ unsigned int maxthreads,
virCgroupPtr *group)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
ATTRIBUTE_NONNULL(3);
bool iscontainer,
size_t nnicindexes,
int *nicindexes,
- const char *partition)
+ const char *partition,
+ unsigned int maxthreads)
{
int ret;
DBusConnection *conn;
char *creatorname = NULL;
char *slicename = NULL;
+ char *scopename = NULL;
static int hasCreateWithNetwork = 1;
if ((ret = virSystemdHasMachined()) < 0)
goto cleanup;
}
+ if (maxthreads > 0) {
+ if (!(scopename = virSystemdMakeScopeName(name, drivername, false)))
+ goto cleanup;
+
+ if (virDBusCallMethod(conn,
+ NULL,
+ NULL,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "SetUnitProperties",
+ "sba(sv)",
+ scopename,
+ true,
+ 1,
+ "TasksMax", "t", (uint64_t)maxthreads) < 0)
+ goto cleanup;
+ }
+
ret = 0;
cleanup:
VIR_FREE(creatorname);
VIR_FREE(slicename);
+ VIR_FREE(scopename);
return ret;
}
bool iscontainer,
size_t nnicindexes,
int *nicindexes,
- const char *partition);
+ const char *partition,
+ unsigned int maxthreads);
int virSystemdTerminateMachine(const char *name);
123,
true,
0, NULL,
- "highpriority.slice") < 0) {
+ "highpriority.slice", 0) < 0) {
fprintf(stderr, "%s", "Failed to create LXC machine\n");
return -1;
}
123,
false,
0, NULL,
- NULL) < 0) {
+ NULL, 0) < 0) {
fprintf(stderr, "%s", "Failed to create KVM machine\n");
return -1;
}
123,
false,
0, NULL,
- NULL)) == 0) {
+ NULL, 0)) == 0) {
unsetenv("FAIL_NO_SERVICE");
fprintf(stderr, "%s", "Unexpected create machine success\n");
return -1;
123,
false,
0, NULL,
- NULL)) == 0) {
+ NULL, 0)) == 0) {
unsetenv("FAIL_NOT_REGISTERED");
fprintf(stderr, "%s", "Unexpected create machine success\n");
return -1;
123,
false,
0, NULL,
- NULL)) == 0) {
+ NULL, 0)) == 0) {
unsetenv("FAIL_BAD_SERVICE");
fprintf(stderr, "%s", "Unexpected create machine success\n");
return -1;
123,
true,
nnicindexes, nicindexes,
- "highpriority.slice") < 0) {
+ "highpriority.slice", 0) < 0) {
fprintf(stderr, "%s", "Failed to create LXC machine\n");
return -1;
}