Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F153226662
D31235.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
1 KB
Referenced Files
None
Subscribers
None
D31235.diff
View Options
diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c
--- a/sys/kern/kern_umtx.c
+++ b/sys/kern/kern_umtx.c
@@ -621,6 +621,43 @@
wakeup(uq);
}
+/*
+ * Wake up a maximum of n_wake threads that are waiting on an userland
+ * object identified by key. The remaining threads are removed from queue
+ * identified by key and added to the queue identified by key2 (requeued).
+ * The n_requeue specifies an upper limit on the number of threads that
+ * are requeued to the second queue.
+ */
+int
+umtxq_requeue(struct umtx_key *key, int n_wake, struct umtx_key *key2,
+ int n_requeue)
+{
+ struct umtxq_queue *uh, *uh2;
+ struct umtx_q *uq, *uq_temp;
+ int ret;
+
+ ret = 0;
+ UMTXQ_LOCKED_ASSERT(umtxq_getchain(key));
+ UMTXQ_LOCKED_ASSERT(umtxq_getchain(key2));
+ uh = umtxq_queue_lookup(key, UMTX_SHARED_QUEUE);
+ uh2 = umtxq_queue_lookup(key2, UMTX_SHARED_QUEUE);
+ if (uh == NULL)
+ return (0);
+ TAILQ_FOREACH_SAFE(uq, &uh->head, uq_link, uq_temp) {
+ if (++ret <= n_wake) {
+ umtxq_remove(uq);
+ wakeup_one(uq);
+ } else {
+ umtxq_remove(uq);
+ uq->uq_key = *key2;
+ umtxq_insert(uq);
+ if (ret - n_wake == n_requeue)
+ break;
+ }
+ }
+ return (ret);
+}
+
static inline int
tstohz(const struct timespec *tsp)
{
diff --git a/sys/sys/umtxvar.h b/sys/sys/umtxvar.h
--- a/sys/sys/umtxvar.h
+++ b/sys/sys/umtxvar.h
@@ -210,6 +210,7 @@
struct umtxq_chain *umtxq_getchain(struct umtx_key *);
void umtxq_insert_queue(struct umtx_q *, int);
void umtxq_remove_queue(struct umtx_q *, int);
+int umtxq_requeue(struct umtx_key *, int, struct umtx_key *, int);
int umtxq_signal_mask(struct umtx_key *, int, u_int);
int umtxq_sleep(struct umtx_q *, const char *,
struct umtx_abs_timeout *);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Apr 20, 10:29 PM (6 h, 29 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31868737
Default Alt Text
D31235.diff (1 KB)
Attached To
Mode
D31235: umtx: Add umtxq_requeue Linux emulation layer extension.
Attached
Detach File
Event Timeline
Log In to Comment