summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2017-09-02 15:33:59 +0200
committerRichard Braun <rbraun@sceen.net>2017-09-02 15:37:24 +0200
commit4a53be066572d3a0b05734054d22b444ad81dad5 (patch)
tree7ed0f14e1766c0f6944fd327208a2f153d9fefef
parentaf79877a2805333b9214754458d9499a0ac7f27d (diff)
kern/sleepq: use an hlist for hash table chaining
-rw-r--r--kern/sleepq.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/kern/sleepq.c b/kern/sleepq.c
index 0c20ae42..3a9273be 100644
--- a/kern/sleepq.c
+++ b/kern/sleepq.c
@@ -24,6 +24,7 @@
#include <stddef.h>
#include <stdint.h>
+#include <kern/hlist.h>
#include <kern/init.h>
#include <kern/kmem.h>
#include <kern/list.h>
@@ -35,7 +36,7 @@
struct sleepq_bucket {
alignas(CPU_L1_SIZE) struct spinlock lock;
- struct list list;
+ struct hlist sleepqs;
};
struct sleepq_waiter {
@@ -53,7 +54,7 @@ struct sleepq_waiter {
*/
struct sleepq {
alignas(CPU_L1_SIZE) struct sleepq_bucket *bucket;
- struct list node;
+ struct hlist_node node;
const void *sync_obj;
struct list waiters;
struct sleepq_waiter *oldest_waiter;
@@ -150,7 +151,7 @@ static void
sleepq_bucket_init(struct sleepq_bucket *bucket)
{
spinlock_init(&bucket->lock);
- list_init(&bucket->list);
+ hlist_init(&bucket->sleepqs);
}
static struct sleepq_bucket *
@@ -182,7 +183,7 @@ sleepq_bucket_add(struct sleepq_bucket *bucket, struct sleepq *sleepq)
{
assert(sleepq->bucket == NULL);
sleepq->bucket = bucket;
- list_insert_tail(&bucket->list, &sleepq->node);
+ hlist_insert_head(&bucket->sleepqs, &sleepq->node);
}
static void
@@ -191,7 +192,7 @@ sleepq_bucket_remove(__unused struct sleepq_bucket *bucket,
{
assert(sleepq->bucket == bucket);
sleepq->bucket = NULL;
- list_remove(&sleepq->node);
+ hlist_remove(&sleepq->node);
}
static struct sleepq *
@@ -199,7 +200,7 @@ sleepq_bucket_lookup(const struct sleepq_bucket *bucket, const void *sync_obj)
{
struct sleepq *sleepq;
- list_for_each_entry(&bucket->list, sleepq, node) {
+ hlist_for_each_entry(&bucket->sleepqs, sleepq, node) {
if (sleepq_in_use_by(sleepq, sync_obj)) {
assert(sleepq->bucket == bucket);
return sleepq;