To reduce code duplication introduce linux_copyout_rusage() method.
Use it in linux_wait4() system call and move linux_wait4() to the MI path. While here add a prototype for the static bsd_to_linux_rusage(). Differential Revision: https://reviews.freebsd.org/D2138 Reviewed by: trasz
This commit is contained in:
parent
a7ae3c557f
commit
001398c4c5
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=283391
@ -780,6 +780,7 @@ struct l_iovec32 {
|
||||
|
||||
int linux32_copyiniov(struct l_iovec32 *iovp32, l_ulong iovcnt,
|
||||
struct iovec **iovp, int error);
|
||||
int linux_copyout_rusage(struct rusage *ru, void *uaddr);
|
||||
|
||||
/* robust futexes */
|
||||
struct linux_robust_list {
|
||||
|
@ -3,6 +3,7 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/assym.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/systm.h>
|
||||
|
||||
#include <amd64/linux32/linux.h>
|
||||
|
@ -72,6 +72,8 @@ __FBSDID("$FreeBSD$");
|
||||
#include <compat/linux/linux_util.h>
|
||||
#include <compat/linux/linux_emul.h>
|
||||
|
||||
static void bsd_to_linux_rusage(struct rusage *ru, struct l_rusage *lru);
|
||||
|
||||
struct l_old_select_argv {
|
||||
l_int nfds;
|
||||
l_uintptr_t readfds;
|
||||
@ -132,6 +134,16 @@ bsd_to_linux_rusage(struct rusage *ru, struct l_rusage *lru)
|
||||
lru->ru_nivcsw = ru->ru_nivcsw;
|
||||
}
|
||||
|
||||
int
|
||||
linux_copyout_rusage(struct rusage *ru, void *uaddr)
|
||||
{
|
||||
struct l_rusage lru;
|
||||
|
||||
bsd_to_linux_rusage(ru, &lru);
|
||||
|
||||
return (copyout(&lru, uaddr, sizeof(struct l_rusage)));
|
||||
}
|
||||
|
||||
int
|
||||
linux_execve(struct thread *td, struct linux_execve_args *args)
|
||||
{
|
||||
@ -908,17 +920,14 @@ linux_settimeofday(struct thread *td, struct linux_settimeofday_args *uap)
|
||||
int
|
||||
linux_getrusage(struct thread *td, struct linux_getrusage_args *uap)
|
||||
{
|
||||
struct l_rusage s32;
|
||||
struct rusage s;
|
||||
int error;
|
||||
|
||||
error = kern_getrusage(td, uap->who, &s);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
if (uap->rusage != NULL) {
|
||||
bsd_to_linux_rusage(&s, &s32);
|
||||
error = copyout(&s32, uap->rusage, sizeof(s32));
|
||||
}
|
||||
if (uap->rusage != NULL)
|
||||
error = linux_copyout_rusage(&s, uap->rusage);
|
||||
return (error);
|
||||
}
|
||||
|
||||
@ -1024,37 +1033,3 @@ linux_set_thread_area(struct thread *td,
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
linux_wait4(struct thread *td, struct linux_wait4_args *args)
|
||||
{
|
||||
int error, options;
|
||||
struct rusage ru, *rup;
|
||||
struct l_rusage lru;
|
||||
|
||||
#ifdef DEBUG
|
||||
if (ldebug(wait4))
|
||||
printf(ARGS(wait4, "%d, %p, %d, %p"),
|
||||
args->pid, (void *)args->status, args->options,
|
||||
(void *)args->rusage);
|
||||
#endif
|
||||
|
||||
options = (args->options & (WNOHANG | WUNTRACED));
|
||||
/* WLINUXCLONE should be equal to __WCLONE, but we make sure */
|
||||
if (args->options & __WCLONE)
|
||||
options |= WLINUXCLONE;
|
||||
|
||||
if (args->rusage != NULL)
|
||||
rup = &ru;
|
||||
else
|
||||
rup = NULL;
|
||||
error = linux_common_wait(td, args->pid, args->status, options, rup);
|
||||
if (error)
|
||||
return (error);
|
||||
if (args->rusage != NULL) {
|
||||
bsd_to_linux_rusage(rup, &lru);
|
||||
error = copyout(&lru, args->rusage, sizeof(lru));
|
||||
}
|
||||
|
||||
return (error);
|
||||
}
|
||||
|
@ -886,6 +886,35 @@ linux_waitpid(struct thread *td, struct linux_waitpid_args *args)
|
||||
return (linux_common_wait(td, args->pid, args->status, options, NULL));
|
||||
}
|
||||
|
||||
int
|
||||
linux_wait4(struct thread *td, struct linux_wait4_args *args)
|
||||
{
|
||||
int error, options;
|
||||
struct rusage ru, *rup;
|
||||
|
||||
#ifdef DEBUG
|
||||
if (ldebug(wait4))
|
||||
printf(ARGS(wait4, "%d, %p, %d, %p"),
|
||||
args->pid, (void *)args->status, args->options,
|
||||
(void *)args->rusage);
|
||||
#endif
|
||||
|
||||
options = (args->options & (WNOHANG | WUNTRACED));
|
||||
/* WLINUXCLONE should be equal to __WCLONE, but we make sure */
|
||||
if (args->options & __WCLONE)
|
||||
options |= WLINUXCLONE;
|
||||
|
||||
if (args->rusage != NULL)
|
||||
rup = &ru;
|
||||
else
|
||||
rup = NULL;
|
||||
error = linux_common_wait(td, args->pid, args->status, options, rup);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
if (args->rusage != NULL)
|
||||
error = linux_copyout_rusage(&ru, args->rusage);
|
||||
return (error);
|
||||
}
|
||||
|
||||
int
|
||||
linux_mknod(struct thread *td, struct linux_mknod_args *args)
|
||||
|
@ -741,6 +741,8 @@ struct l_desc_struct {
|
||||
#define LINUX_GET_USEABLE(desc) \
|
||||
(((desc)->b >> LINUX_ENTRY_B_USEABLE) & 1)
|
||||
|
||||
#define linux_copyout_rusage(r, u) copyout(r, u, sizeof(*r))
|
||||
|
||||
/* robust futexes */
|
||||
struct linux_robust_list {
|
||||
struct linux_robust_list *next;
|
||||
|
@ -1047,34 +1047,3 @@ linux_mq_getsetattr(struct thread *td, struct linux_mq_getsetattr_args *args)
|
||||
return (ENOSYS);
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
linux_wait4(struct thread *td, struct linux_wait4_args *args)
|
||||
{
|
||||
int error, options;
|
||||
struct rusage ru, *rup;
|
||||
|
||||
#ifdef DEBUG
|
||||
if (ldebug(wait4))
|
||||
printf(ARGS(wait4, "%d, %p, %d, %p"),
|
||||
args->pid, (void *)args->status, args->options,
|
||||
(void *)args->rusage);
|
||||
#endif
|
||||
|
||||
options = (args->options & (WNOHANG | WUNTRACED));
|
||||
/* WLINUXCLONE should be equal to __WCLONE, but we make sure */
|
||||
if (args->options & __WCLONE)
|
||||
options |= WLINUXCLONE;
|
||||
|
||||
if (args->rusage != NULL)
|
||||
rup = &ru;
|
||||
else
|
||||
rup = NULL;
|
||||
error = linux_common_wait(td, args->pid, args->status, options, rup);
|
||||
if (error)
|
||||
return (error);
|
||||
if (args->rusage != NULL)
|
||||
error = copyout(&ru, args->rusage, sizeof(ru));
|
||||
|
||||
return (error);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user