In preparation for switching linuxulator to the use the native 1:1

threads refactor kern_sched_rr_get_interval() and sys_sched_rr_get_interval().
Add a kern_sched_rr_get_interval() counterpart which takes a targettd
parameter to allow specify target thread directly by callee (new Linuxulator).

Linuxulator temporarily uses first thread in proc.

Move linux_sched_rr_get_interval() to the MI part.

Differential Revision:	https://reviews.freebsd.org/D1032
Reviewed by:	trasz
This commit is contained in:
Dmitry Chagin 2015-05-24 14:39:26 +00:00
parent 09baafb471
commit 1aa90eca33
4 changed files with 48 additions and 19 deletions

View File

@ -924,22 +924,6 @@ linux_getrusage(struct thread *td, struct linux_getrusage_args *uap)
return (error);
}
int
linux_sched_rr_get_interval(struct thread *td,
struct linux_sched_rr_get_interval_args *uap)
{
struct timespec ts;
struct l_timespec ts32;
int error;
error = kern_sched_rr_get_interval(td, uap->pid, &ts);
if (error != 0)
return (error);
ts32.tv_sec = ts.tv_sec;
ts32.tv_nsec = ts.tv_nsec;
return (copyout(&ts32, uap->interval, sizeof(ts32)));
}
int
linux_set_thread_area(struct thread *td,
struct linux_set_thread_area_args *args)

View File

@ -1928,3 +1928,33 @@ linux_sched_setaffinity(struct thread *td,
return (sys_cpuset_setaffinity(td, &csa));
}
int
linux_sched_rr_get_interval(struct thread *td,
struct linux_sched_rr_get_interval_args *uap)
{
struct timespec ts;
struct l_timespec lts;
struct thread *tdt;
struct proc *p;
int error;
if (uap->pid == 0) {
tdt = td;
p = tdt->td_proc;
PROC_LOCK(p);
} else {
p = pfind(uap->pid);
if (p == NULL)
return (ESRCH);
tdt = FIRST_THREAD_IN_PROC(p);
}
error = kern_sched_rr_get_interval_td(td, tdt, &ts);
PROC_UNLOCK(p);
if (error != 0)
return (error);
lts.tv_sec = ts.tv_sec;
lts.tv_nsec = ts.tv_nsec;
return (copyout(&lts, uap->interval, sizeof(lts)));
}

View File

@ -296,13 +296,26 @@ kern_sched_rr_get_interval(struct thread *td, pid_t pid,
targettd = FIRST_THREAD_IN_PROC(targetp);
}
e = p_cansee(td, targetp);
if (e == 0)
e = ksched_rr_get_interval(ksched, targettd, ts);
e = kern_sched_rr_get_interval_td(td, targettd, ts);
PROC_UNLOCK(targetp);
return (e);
}
int
kern_sched_rr_get_interval_td(struct thread *td, struct thread *targettd,
struct timespec *ts)
{
struct proc *p;
int error;
p = targettd->td_proc;
PROC_LOCK_ASSERT(p, MA_OWNED);
error = p_cansee(td, p);
if (error == 0)
error = ksched_rr_get_interval(ksched, targettd, ts);
return (error);
}
#endif
static void

View File

@ -171,6 +171,8 @@ int kern_rmdirat(struct thread *td, int fd, char *path,
enum uio_seg pathseg);
int kern_sched_rr_get_interval(struct thread *td, pid_t pid,
struct timespec *ts);
int kern_sched_rr_get_interval_td(struct thread *td, struct thread *targettd,
struct timespec *ts);
int kern_semctl(struct thread *td, int semid, int semnum, int cmd,
union semun *arg, register_t *rval);
int kern_select(struct thread *td, int nd, fd_set *fd_in, fd_set *fd_ou,