On 01/13/2015 02:57 AM, Martin Kletzander wrote:
This function uses sched_setscheduler() function so it works with
processes and threads as well (even threads not created by us, which is
what we'll need in the future).
Signed-off-by: Martin Kletzander <mkletzan(a)redhat.com>
---
src/libvirt_private.syms | 1 +
src/util/virprocess.c | 46 ++++++++++++++++++++++++++++++++++++++++++++--
src/util/virprocess.h | 6 +++++-
3 files changed, 50 insertions(+), 3 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index fb5d003..de3476e 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1882,6 +1882,7 @@ virProcessSetMaxFiles;
virProcessSetMaxMemLock;
virProcessSetMaxProcesses;
virProcessSetNamespaces;
+virProcessSetScheduler;
virProcessTranslateStatus;
virProcessWait;
diff --git a/src/util/virprocess.c b/src/util/virprocess.c
index d0a1500..85da5e8 100644
--- a/src/util/virprocess.c
+++ b/src/util/virprocess.c
@@ -1,7 +1,7 @@
/*
* virprocess.c: interaction with processes
*
- * Copyright (C) 2010-2014 Red Hat, Inc.
+ * Copyright (C) 2010-2015 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -32,7 +32,6 @@
# include <sys/time.h>
# include <sys/resource.h>
#endif
-#include <sched.h>
hmm.. moving to virprocess.h....
#if defined(__FreeBSD__) || HAVE_BSD_CPU_AFFINITY
# include <sys/param.h>
@@ -1052,3 +1051,46 @@ virProcessExitWithStatus(int status)
}
exit(value);
}
+
+int
+virProcessSetScheduler(pid_t pid, int policy, int priority)
+{
+ struct sched_param param = {0};
+
+ VIR_DEBUG("pid=%d, policy=%d, priority=%u", pid, policy, priority);
+
+ if (policy == SCHED_FIFO || policy == SCHED_RR) {
+ int min = 0;
+ int max = 0;
+
+ if ((min = sched_get_priority_min(policy)) < 0) {
+ virReportSystemError(errno, "%s",
+ _("Cannot get minimum scheduler priority
value"));
+ return -1;
+ }
+
+ if ((max = sched_get_priority_max(policy)) < 0) {
+ virReportSystemError(errno, "%s",
+ _("Cannot get maximum scheduler priority
value"));
+ return -1;
+ }
+
+ if (priority < min || priority > max) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Scheduler priority %d out of range [%d, %d]"),
+ priority, min, max);
+ return -1;
+ }
+
+ param.sched_priority = priority;
+ }
+
+ if (sched_setscheduler(pid, policy, ¶m) < 0) {
+ virReportSystemError(errno,
+ _("Cannot set scheduler parameters for pid %d"),
+ pid);
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/src/util/virprocess.h b/src/util/virprocess.h
index bcaede5..34b15a4 100644
--- a/src/util/virprocess.h
+++ b/src/util/virprocess.h
@@ -1,7 +1,7 @@
/*
* virprocess.h: interaction with processes
*
- * Copyright (C) 2010-2014 Red Hat, Inc.
+ * Copyright (C) 2010-2015 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -23,6 +23,7 @@
# define __VIR_PROCESS_H__
# include <sys/types.h>
+# include <sched.h>
Does moving this into here work for other build platforms? Is it
required - it doesn't seem so given all that changes doesn't include
anything sched.h specific.
John
# include "internal.h"
# include "virbitmap.h"
@@ -73,4 +74,7 @@ typedef int (*virProcessNamespaceCallback)(pid_t pid, void *opaque);
int virProcessRunInMountNamespace(pid_t pid,
virProcessNamespaceCallback cb,
void *opaque);
+
+int virProcessSetScheduler(pid_t pid, int policy, int priority);
+
#endif /* __VIR_PROCESS_H__ */