[libvirt] [PATCH 6/8] util: new virCommandSetMax(MemLock|Processes|Files)
Daniel P. Berrange
berrange at redhat.com
Thu Apr 25 19:27:38 UTC 2013
On Thu, Apr 25, 2013 at 01:57:56PM -0400, Laine Stump wrote:
> diff --git a/src/util/virutil.c b/src/util/virutil.c
> index b9de33c..058a069 100644
> --- a/src/util/virutil.c
> +++ b/src/util/virutil.c
> @@ -38,6 +38,10 @@
> #include <sys/types.h>
> #include <sys/ioctl.h>
> #include <sys/wait.h>
> +#if HAVE_SETRLIMIT
> +# include <sys/time.h>
> +# include <sys/resource.h>
> +#endif
> #if HAVE_MMAP
> # include <sys/mman.h>
> #endif
> @@ -2992,6 +2996,148 @@ virGetGroupName(gid_t gid ATTRIBUTE_UNUSED)
> }
> #endif /* HAVE_GETPWUID_R */
>
> +#if HAVE_SETRLIMIT
> +
> +# if HAVE_PRLIMIT
> +static int
> +virPrLimit(pid_t pid, int resource, struct rlimit *rlim)
> +{
> + return prlimit(pid, resource, rlim, NULL);
> +}
> +# else
> +static int
> +virPrLimit(pid_t pid ATTRIBUTE_UNUSED,
> + int resource ATTRIBUTE_UNUSED,
> + struct rlimit *rlim ATTRIBUTE_UNUSED)
> +{
> + virReportSystemError(ENOSYS, "%s", _("Not supported on this platform"));
> + return -1;
> +}
> +# endif
> +
> +int
> +virSetMaxMemLock(pid_t pid, unsigned long long bytes)
> +{
> + struct rlimit rlim;
> +
> + if (bytes == 0)
> + return 0;
> +
> + rlim.rlim_cur = rlim.rlim_max = bytes;
> + if (pid == (pid_t)-1) {
> + if (setrlimit(RLIMIT_MEMLOCK, &rlim) < 0) {
> + virReportSystemError(errno,
> + _("cannot limit locked memory to %llu"),
> + bytes);
> + return -1;
> + }
> + } else {
> + if (virPrLimit(pid, RLIMIT_MEMLOCK, &rlim) < 0) {
> + virReportSystemError(errno,
> + _("cannot limit locked memory "
> + "of process %lld to %llu"),
> + (long long int)pid, bytes);
> + return -1;
> + }
> + }
> + return 0;
> +}
> +
> +int
> +virSetMaxProcesses(pid_t pid, unsigned int procs)
> +{
> + struct rlimit rlim;
> +
> + if (procs == 0)
> + return 0;
> +
> + rlim.rlim_cur = rlim.rlim_max = procs;
> + if (pid == (pid_t)-1) {
> + if (setrlimit(RLIMIT_NPROC, &rlim) < 0) {
> + virReportSystemError(errno,
> + _("cannot limit number of subprocesses to %u"),
> + procs);
> + return -1;
> + }
> + } else {
> + if (virPrLimit(pid, RLIMIT_NPROC, &rlim) < 0) {
> + virReportSystemError(errno,
> + _("cannot limit number of subprocesses "
> + "of process %lld to %u"),
> + (long long int)pid, procs);
> + return -1;
> + }
> + }
> + return 0;
> +}
> +
> +int
> +virSetMaxFiles(pid_t pid, unsigned int files)
> +{
> + struct rlimit rlim;
> +
> + if (files == 0)
> + return 0;
> +
> + /* Max number of opened files is one greater than actual limit. See
> + * man setrlimit.
> + *
> + * NB: That indicates to me that we would want the following code
> + * to say "files - 1", but the original of this code in
> + * qemu_process.c also had files + 1, so this preserves current
> + * behavior.
> + */
> + rlim.rlim_cur = rlim.rlim_max = files + 1;
> + if (pid == (pid_t)-1) {
> + if (setrlimit(RLIMIT_NOFILE, &rlim) < 0) {
> + virReportSystemError(errno,
> + _("cannot limit number of open files to %u"),
> + files);
> + return -1;
> + }
> + } else {
> + if (virPrLimit(pid, RLIMIT_NOFILE, &rlim) < 0) {
> + virReportSystemError(errno,
> + _("cannot limit number of open files "
> + "of process %lld to %u"),
> + (long long int)pid, files);
> + return -1;
> + }
> + }
> + return 0;
> +}
> +#else
> +int
> +virSetMaxMemLock(pid_t pid ATTRIBUTE_UNUSED, unsigned long long bytes)
> +{
> + if (bytes == 0)
> + return 0;
> +
> + virReportSystemError(ENOSYS, "%s", _("Not supported on this platform"));
> + return -1;
> +}
> +
> +int
> +virSetMaxProcesses(pid_t pid ATTRIBUTE_UNUSED, unsigned int procs)
> +{
> + if (procs == 0)
> + return 0;
> +
> + virReportSystemError(ENOSYS, "%s", _("Not supported on this platform"));
> + return -1;
> +}
> +
> +int
> +virSetMaxFiles(pid_t pid ATTRIBUTE_UNUSED, unsigned int files)
> +{
> + if (files == 0)
> + return 0;
> +
> + virReportSystemError(ENOSYS, "%s", _("Not supported on this platform"));
> + return -1;
> +}
> +#endif
Since these functions all take pid_t as their first arg,
they should all be named virProcessXXXXX and be located
in virprocess.{c,h} rather than virutil.{c,h}
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list