svn commit: r293510 - in stable/10/sys: amd64/linux32 compat/linux i386/linux
Dmitry Chagin
dchagin at FreeBSD.org
Sat Jan 9 15:37:12 UTC 2016
Author: dchagin
Date: Sat Jan 9 15:37:10 2016
New Revision: 293510
URL: https://svnweb.freebsd.org/changeset/base/293510
Log:
MFC r283401:
Implement prlimit64() system call.
Modified:
stable/10/sys/amd64/linux32/linux32_dummy.c
stable/10/sys/amd64/linux32/syscalls.master
stable/10/sys/compat/linux/linux_misc.c
stable/10/sys/compat/linux/linux_misc.h
stable/10/sys/i386/linux/linux_dummy.c
stable/10/sys/i386/linux/syscalls.master
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/amd64/linux32/linux32_dummy.c
==============================================================================
--- stable/10/sys/amd64/linux32/linux32_dummy.c Sat Jan 9 15:35:57 2016 (r293509)
+++ stable/10/sys/amd64/linux32/linux32_dummy.c Sat Jan 9 15:37:10 2016 (r293510)
@@ -134,8 +134,6 @@ DUMMY(perf_event_open);
DUMMY(recvmmsg);
DUMMY(fanotify_init);
DUMMY(fanotify_mark);
-/* linux 2.6.36: */
-DUMMY(prlimit64);
/* later: */
DUMMY(name_to_handle_at);
DUMMY(open_by_handle_at);
Modified: stable/10/sys/amd64/linux32/syscalls.master
==============================================================================
--- stable/10/sys/amd64/linux32/syscalls.master Sat Jan 9 15:35:57 2016 (r293509)
+++ stable/10/sys/amd64/linux32/syscalls.master Sat Jan 9 15:37:10 2016 (r293510)
@@ -554,7 +554,10 @@
338 AUE_NULL STD { int linux_fanotify_init(void); }
339 AUE_NULL STD { int linux_fanotify_mark(void); }
; linux 2.6.36:
-340 AUE_NULL STD { int linux_prlimit64(void); }
+340 AUE_NULL STD { int linux_prlimit64(l_pid_t pid, \
+ l_uint resource, \
+ struct rlimit *new, \
+ struct rlimit *old); }
; later:
341 AUE_NULL STD { int linux_name_to_handle_at(void); }
342 AUE_NULL STD { int linux_open_by_handle_at(void); }
Modified: stable/10/sys/compat/linux/linux_misc.c
==============================================================================
--- stable/10/sys/compat/linux/linux_misc.c Sat Jan 9 15:35:57 2016 (r293509)
+++ stable/10/sys/compat/linux/linux_misc.c Sat Jan 9 15:37:10 2016 (r293510)
@@ -2032,6 +2032,79 @@ linux_sched_setaffinity(struct thread *t
return (sys_cpuset_setaffinity(td, &csa));
}
+struct linux_rlimit64 {
+ uint64_t rlim_cur;
+ uint64_t rlim_max;
+};
+
+int
+linux_prlimit64(struct thread *td, struct linux_prlimit64_args *args)
+{
+ struct rlimit rlim, nrlim;
+ struct linux_rlimit64 lrlim;
+ struct proc *p;
+ u_int which;
+ int flags;
+ int error;
+
+#ifdef DEBUG
+ if (ldebug(prlimit64))
+ printf(ARGS(prlimit64, "%d, %d, %p, %p"), args->pid,
+ args->resource, (void *)args->new, (void *)args->old);
+#endif
+
+ if (args->resource >= LINUX_RLIM_NLIMITS)
+ return (EINVAL);
+
+ which = linux_to_bsd_resource[args->resource];
+ if (which == -1)
+ return (EINVAL);
+
+ if (args->new != NULL) {
+ /*
+ * Note. Unlike FreeBSD where rlim is signed 64-bit Linux
+ * rlim is unsigned 64-bit. FreeBSD treats negative limits
+ * as INFINITY so we do not need a conversion even.
+ */
+ error = copyin(args->new, &nrlim, sizeof(nrlim));
+ if (error != 0)
+ return (error);
+ }
+
+ flags = PGET_HOLD | PGET_NOTWEXIT;
+ if (args->new != NULL)
+ flags |= PGET_CANDEBUG;
+ else
+ flags |= PGET_CANSEE;
+ error = pget(args->pid, flags, &p);
+ if (error != 0)
+ return (error);
+
+ if (args->old != NULL) {
+ PROC_LOCK(p);
+ lim_rlimit(p, which, &rlim);
+ PROC_UNLOCK(p);
+ if (rlim.rlim_cur == RLIM_INFINITY)
+ lrlim.rlim_cur = LINUX_RLIM_INFINITY;
+ else
+ lrlim.rlim_cur = rlim.rlim_cur;
+ if (rlim.rlim_max == RLIM_INFINITY)
+ lrlim.rlim_max = LINUX_RLIM_INFINITY;
+ else
+ lrlim.rlim_max = rlim.rlim_max;
+ error = copyout(&lrlim, args->old, sizeof(lrlim));
+ if (error != 0)
+ goto out;
+ }
+
+ if (args->new != NULL)
+ error = kern_proc_setrlimit(td, p, which, &nrlim);
+
+ out:
+ PRELE(p);
+ return (error);
+}
+
int
linux_sched_rr_get_interval(struct thread *td,
struct linux_sched_rr_get_interval_args *uap)
Modified: stable/10/sys/compat/linux/linux_misc.h
==============================================================================
--- stable/10/sys/compat/linux/linux_misc.h Sat Jan 9 15:35:57 2016 (r293509)
+++ stable/10/sys/compat/linux/linux_misc.h Sat Jan 9 15:37:10 2016 (r293510)
@@ -128,6 +128,7 @@ extern int stclohz;
#define LINUX_P_PID 1
#define LINUX_P_PGID 2
+#define LINUX_RLIM_INFINITY (~0UL)
int linux_common_wait(struct thread *td, int pid, int *status,
int options, struct rusage *ru);
Modified: stable/10/sys/i386/linux/linux_dummy.c
==============================================================================
--- stable/10/sys/i386/linux/linux_dummy.c Sat Jan 9 15:35:57 2016 (r293509)
+++ stable/10/sys/i386/linux/linux_dummy.c Sat Jan 9 15:37:10 2016 (r293510)
@@ -130,8 +130,6 @@ DUMMY(perf_event_open);
DUMMY(recvmmsg);
DUMMY(fanotify_init);
DUMMY(fanotify_mark);
-/* linux 2.6.36: */
-DUMMY(prlimit64);
/* later: */
DUMMY(name_to_handle_at);
DUMMY(open_by_handle_at);
Modified: stable/10/sys/i386/linux/syscalls.master
==============================================================================
--- stable/10/sys/i386/linux/syscalls.master Sat Jan 9 15:35:57 2016 (r293509)
+++ stable/10/sys/i386/linux/syscalls.master Sat Jan 9 15:37:10 2016 (r293510)
@@ -562,7 +562,10 @@
338 AUE_NULL STD { int linux_fanotify_init(void); }
339 AUE_NULL STD { int linux_fanotify_mark(void); }
; linux 2.6.36:
-340 AUE_NULL STD { int linux_prlimit64(void); }
+340 AUE_NULL STD { int linux_prlimit64(l_pid_t pid, \
+ l_uint resource, \
+ struct rlimit *new, \
+ struct rlimit *old); }
; later:
341 AUE_NULL STD { int linux_name_to_handle_at(void); }
342 AUE_NULL STD { int linux_open_by_handle_at(void); }
More information about the svn-src-stable-10
mailing list