summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordchagin <dchagin@FreeBSD.org>2016-01-09 14:38:29 +0000
committerdchagin <dchagin@FreeBSD.org>2016-01-09 14:38:29 +0000
commita07a85c065f084d084b8a1a0d5a42e79c99962e6 (patch)
treefa944b9dafea989b875d8e1543561621be0ab22b
parentb18ea4d2a0bcd9dbc2f21c20535204945cedf82d (diff)
downloadFreeBSD-src-a07a85c065f084d084b8a1a0d5a42e79c99962e6.zip
FreeBSD-src-a07a85c065f084d084b8a1a0d5a42e79c99962e6.tar.gz
MFC r283373:
In preparation for switching linuxulator to the use the native 1:1 threads introduce kern_thr_alloc() which will be used later in the linux_clone().
-rw-r--r--sys/kern/kern_thr.c29
-rw-r--r--sys/sys/syscallsubr.h1
2 files changed, 20 insertions, 10 deletions
diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c
index e2cb5dd..98965b1 100644
--- a/sys/kern/kern_thr.c
+++ b/sys/kern/kern_thr.c
@@ -192,12 +192,6 @@ thread_create(struct thread *td, struct rtprio *rtp,
p = td->td_proc;
- /* Have race condition but it is cheap. */
- if (p->p_numthreads >= max_threads_per_proc) {
- ++max_threads_hits;
- return (EPROCLIM);
- }
-
if (rtp != NULL) {
switch(rtp->type) {
case RTP_PRIO_REALTIME:
@@ -225,11 +219,9 @@ thread_create(struct thread *td, struct rtprio *rtp,
#endif
/* Initialize our td */
- newtd = thread_alloc(0);
- if (newtd == NULL) {
- error = ENOMEM;
+ error = kern_thr_alloc(p, 0, &newtd);
+ if (error)
goto fail;
- }
cpu_set_upcall(newtd, td);
@@ -564,3 +556,20 @@ sys_thr_set_name(struct thread *td, struct thr_set_name_args *uap)
PROC_UNLOCK(p);
return (error);
}
+
+int
+kern_thr_alloc(struct proc *p, int pages, struct thread **ntd)
+{
+
+ /* Have race condition but it is cheap. */
+ if (p->p_numthreads >= max_threads_per_proc) {
+ ++max_threads_hits;
+ return (EPROCLIM);
+ }
+
+ *ntd = thread_alloc(pages);
+ if (*ntd == NULL)
+ return (ENOMEM);
+
+ return (0);
+}
diff --git a/sys/sys/syscallsubr.h b/sys/sys/syscallsubr.h
index 665752a..bdb2500 100644
--- a/sys/sys/syscallsubr.h
+++ b/sys/sys/syscallsubr.h
@@ -246,6 +246,7 @@ int kern_ktimer_settime(struct thread *td, int timer_id, int flags,
int kern_ktimer_gettime(struct thread *td, int timer_id,
struct itimerspec *val);
int kern_ktimer_getoverrun(struct thread *td, int timer_id);
+int kern_thr_alloc(struct proc *, int pages, struct thread **);
int kern_thr_exit(struct thread *td);
int kern_thr_new(struct thread *td, struct thr_param *param);
int kern_thr_suspend(struct thread *td, struct timespec *tsp);
OpenPOWER on IntegriCloud