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:
parent
09baafb471
commit
1aa90eca33
@ -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)
|
||||
|
@ -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(<s, uap->interval, sizeof(lts)));
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user