summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/init_sysent.c4
-rw-r--r--sys/kern/kern_kse.c38
-rw-r--r--sys/kern/kern_thread.c38
-rw-r--r--sys/kern/syscalls.c2
-rw-r--r--sys/kern/syscalls.master2
-rw-r--r--sys/sys/kse.h2
-rw-r--r--sys/sys/syscall.h2
-rw-r--r--sys/sys/syscall.mk2
-rw-r--r--sys/sys/sysproto.h2
9 files changed, 62 insertions, 30 deletions
diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c
index 0c22f98..22dfec8 100644
--- a/sys/kern/init_sysent.c
+++ b/sys/kern/init_sysent.c
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: src/sys/kern/syscalls.master,v 1.140 2003/01/04 11:41:12 davidxu Exp
+ * created from FreeBSD: src/sys/kern/syscalls.master,v 1.143 2003/01/26 20:09:34 alfred Exp
*/
#include "opt_compat.h"
@@ -411,7 +411,7 @@ struct sysent sysent[] = {
{ SYF_MPSAFE | AS(kse_wakeup_args), (sy_call_t *)kse_wakeup }, /* 380 = kse_wakeup */
{ AS(kse_create_args), (sy_call_t *)kse_create }, /* 381 = kse_create */
{ SYF_MPSAFE | AS(kse_thr_interrupt_args), (sy_call_t *)kse_thr_interrupt }, /* 382 = kse_thr_interrupt */
- { SYF_MPSAFE | 0, (sy_call_t *)kse_release }, /* 383 = kse_release */
+ { SYF_MPSAFE | AS(kse_release_args), (sy_call_t *)kse_release }, /* 383 = kse_release */
{ SYF_MPSAFE | AS(__mac_get_proc_args), (sy_call_t *)__mac_get_proc }, /* 384 = __mac_get_proc */
{ SYF_MPSAFE | AS(__mac_set_proc_args), (sy_call_t *)__mac_set_proc }, /* 385 = __mac_set_proc */
{ SYF_MPSAFE | AS(__mac_get_fd_args), (sy_call_t *)__mac_get_fd }, /* 386 = __mac_get_fd */
diff --git a/sys/kern/kern_kse.c b/sys/kern/kern_kse.c
index fc021ac..7bd1c29 100644
--- a/sys/kern/kern_kse.c
+++ b/sys/kern/kern_kse.c
@@ -465,7 +465,7 @@ kse_exit(struct thread *td, struct kse_exit_args *uap)
*/
/*
struct kse_release_args {
- register_t dummy;
+ struct timespec *timeout;
};
*/
int
@@ -473,6 +473,9 @@ kse_release(struct thread *td, struct kse_release_args *uap)
{
struct proc *p;
struct ksegrp *kg;
+ struct timespec ts, ts2, ts3, timeout;
+ struct timeval tv;
+ int error;
p = td->td_proc;
kg = td->td_ksegrp;
@@ -483,25 +486,38 @@ kse_release(struct thread *td, struct kse_release_args *uap)
if ((td->td_mailbox != NULL) || (td->td_ksegrp->kg_numupcalls == 0))
return (EINVAL);
KASSERT((td->td_upcall != NULL), ("%s: not own an upcall", __func__));
-
- PROC_LOCK(p);
+ if (uap->timeout != NULL) {
+ if ((error = copyin(uap->timeout, &timeout, sizeof(timeout))))
+ return (error);
+ getnanouptime(&ts);
+ timespecadd(&ts, &timeout);
+ TIMESPEC_TO_TIMEVAL(&tv, &timeout);
+ }
mtx_lock_spin(&sched_lock);
/* Change OURSELF to become an upcall. */
td->td_flags = TDF_UPCALLING;
if (p->p_sflag & PS_NEEDSIGCHK)
td->td_flags |= TDF_ASTPENDING;
- if ((td->td_upcall->ku_flags & KUF_DOUPCALL) == 0 &&
- (kg->kg_completed == NULL)) {
+ mtx_unlock_spin(&sched_lock);
+ PROC_LOCK(p);
+ while ((td->td_upcall->ku_flags & KUF_DOUPCALL) == 0 &&
+ (kg->kg_completed == NULL)) {
kg->kg_upsleeps++;
- mtx_unlock_spin(&sched_lock);
- msleep(&kg->kg_completed, &p->p_mtx, PPAUSE|PCATCH, "ksepause",
- NULL);
+ error = msleep(&kg->kg_completed, &p->p_mtx, PPAUSE|PCATCH,
+ "kse_rel", (uap->timeout ? tvtohz(&tv) : 0));
kg->kg_upsleeps--;
PROC_UNLOCK(p);
- } else {
- mtx_unlock_spin(&sched_lock);
- PROC_UNLOCK(p);
+ if (uap->timeout == NULL || error != EWOULDBLOCK)
+ return (0);
+ getnanouptime(&ts2);
+ if (timespeccmp(&ts2, &ts, >=))
+ return (0);
+ ts3 = ts;
+ timespecsub(&ts3, &ts2);
+ TIMESPEC_TO_TIMEVAL(&tv, &ts3);
+ PROC_LOCK(p);
}
+ PROC_UNLOCK(p);
return (0);
}
diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c
index fc021ac..7bd1c29 100644
--- a/sys/kern/kern_thread.c
+++ b/sys/kern/kern_thread.c
@@ -465,7 +465,7 @@ kse_exit(struct thread *td, struct kse_exit_args *uap)
*/
/*
struct kse_release_args {
- register_t dummy;
+ struct timespec *timeout;
};
*/
int
@@ -473,6 +473,9 @@ kse_release(struct thread *td, struct kse_release_args *uap)
{
struct proc *p;
struct ksegrp *kg;
+ struct timespec ts, ts2, ts3, timeout;
+ struct timeval tv;
+ int error;
p = td->td_proc;
kg = td->td_ksegrp;
@@ -483,25 +486,38 @@ kse_release(struct thread *td, struct kse_release_args *uap)
if ((td->td_mailbox != NULL) || (td->td_ksegrp->kg_numupcalls == 0))
return (EINVAL);
KASSERT((td->td_upcall != NULL), ("%s: not own an upcall", __func__));
-
- PROC_LOCK(p);
+ if (uap->timeout != NULL) {
+ if ((error = copyin(uap->timeout, &timeout, sizeof(timeout))))
+ return (error);
+ getnanouptime(&ts);
+ timespecadd(&ts, &timeout);
+ TIMESPEC_TO_TIMEVAL(&tv, &timeout);
+ }
mtx_lock_spin(&sched_lock);
/* Change OURSELF to become an upcall. */
td->td_flags = TDF_UPCALLING;
if (p->p_sflag & PS_NEEDSIGCHK)
td->td_flags |= TDF_ASTPENDING;
- if ((td->td_upcall->ku_flags & KUF_DOUPCALL) == 0 &&
- (kg->kg_completed == NULL)) {
+ mtx_unlock_spin(&sched_lock);
+ PROC_LOCK(p);
+ while ((td->td_upcall->ku_flags & KUF_DOUPCALL) == 0 &&
+ (kg->kg_completed == NULL)) {
kg->kg_upsleeps++;
- mtx_unlock_spin(&sched_lock);
- msleep(&kg->kg_completed, &p->p_mtx, PPAUSE|PCATCH, "ksepause",
- NULL);
+ error = msleep(&kg->kg_completed, &p->p_mtx, PPAUSE|PCATCH,
+ "kse_rel", (uap->timeout ? tvtohz(&tv) : 0));
kg->kg_upsleeps--;
PROC_UNLOCK(p);
- } else {
- mtx_unlock_spin(&sched_lock);
- PROC_UNLOCK(p);
+ if (uap->timeout == NULL || error != EWOULDBLOCK)
+ return (0);
+ getnanouptime(&ts2);
+ if (timespeccmp(&ts2, &ts, >=))
+ return (0);
+ ts3 = ts;
+ timespecsub(&ts3, &ts2);
+ TIMESPEC_TO_TIMEVAL(&tv, &ts3);
+ PROC_LOCK(p);
}
+ PROC_UNLOCK(p);
return (0);
}
diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c
index 62c90f5..0a61dad 100644
--- a/sys/kern/syscalls.c
+++ b/sys/kern/syscalls.c
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: src/sys/kern/syscalls.master,v 1.140 2003/01/04 11:41:12 davidxu Exp
+ * created from FreeBSD: src/sys/kern/syscalls.master,v 1.143 2003/01/26 20:09:34 alfred Exp
*/
const char *syscallnames[] = {
diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master
index 1cca3bd..10981a0 100644
--- a/sys/kern/syscalls.master
+++ b/sys/kern/syscalls.master
@@ -555,7 +555,7 @@
381 STD BSD { int kse_create(struct kse_mailbox *mbx, \
int newgroup); }
382 MSTD BSD { int kse_thr_interrupt(struct kse_thr_mailbox *tmbx); }
-383 MSTD BSD { int kse_release(void); }
+383 MSTD BSD { int kse_release(struct timespec *timeout); }
384 MSTD BSD { int __mac_get_proc(struct mac *mac_p); }
385 MSTD BSD { int __mac_set_proc(struct mac *mac_p); }
386 MSTD BSD { int __mac_get_fd(int fd, struct mac *mac_p); }
diff --git a/sys/sys/kse.h b/sys/sys/kse.h
index c60247a..0d4f2f0 100644
--- a/sys/sys/kse.h
+++ b/sys/sys/kse.h
@@ -86,7 +86,7 @@ struct kse_mailbox {
#ifndef _KERNEL
int kse_create(struct kse_mailbox *, int);
int kse_exit(void);
-int kse_release(void);
+int kse_release(struct timespec *);
int kse_thr_interrupt(struct kse_thr_mailbox *);
int kse_wakeup(struct kse_mailbox *);
#endif /* !_KERNEL */
diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h
index 722801e..e5be7da 100644
--- a/sys/sys/syscall.h
+++ b/sys/sys/syscall.h
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: src/sys/kern/syscalls.master,v 1.140 2003/01/04 11:41:12 davidxu Exp
+ * created from FreeBSD: src/sys/kern/syscalls.master,v 1.143 2003/01/26 20:09:34 alfred Exp
*/
#define SYS_syscall 0
diff --git a/sys/sys/syscall.mk b/sys/sys/syscall.mk
index 65a635b..946e86b 100644
--- a/sys/sys/syscall.mk
+++ b/sys/sys/syscall.mk
@@ -1,7 +1,7 @@
# FreeBSD system call names.
# DO NOT EDIT-- this file is automatically generated.
# $FreeBSD$
-# created from FreeBSD: src/sys/kern/syscalls.master,v 1.140 2003/01/04 11:41:12 davidxu Exp
+# created from FreeBSD: src/sys/kern/syscalls.master,v 1.143 2003/01/26 20:09:34 alfred Exp
MIASM = \
syscall.o \
exit.o \
diff --git a/sys/sys/sysproto.h b/sys/sys/sysproto.h
index 911f69d..892ca0a 100644
--- a/sys/sys/sysproto.h
+++ b/sys/sys/sysproto.h
@@ -1061,7 +1061,7 @@ struct kse_thr_interrupt_args {
char tmbx_l_[PADL_(struct kse_thr_mailbox *)]; struct kse_thr_mailbox * tmbx; char tmbx_r_[PADR_(struct kse_thr_mailbox *)];
};
struct kse_release_args {
- register_t dummy;
+ char timeout_l_[PADL_(struct timespec *)]; struct timespec * timeout; char timeout_r_[PADR_(struct timespec *)];
};
struct __mac_get_proc_args {
char mac_p_l_[PADL_(struct mac *)]; struct mac * mac_p; char mac_p_r_[PADR_(struct mac *)];
OpenPOWER on IntegriCloud