summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2013-09-13 19:50:50 +0000
committerkib <kib@FreeBSD.org>2013-09-13 19:50:50 +0000
commit36c84de38fc0ad766cbad9ed3b1cbca82726035f (patch)
tree64ae80629089cd33a9a644518d498d0aff4181e8
parent99904243da23aa13861ff7c8f308dd5d325cc765 (diff)
downloadFreeBSD-src-36c84de38fc0ad766cbad9ed3b1cbca82726035f.zip
FreeBSD-src-36c84de38fc0ad766cbad9ed3b1cbca82726035f.tar.gz
Use TAILQ instead of STAILQ for kqeueue filedescriptors to ensure constant
time removal on kqueue close. Reported and tested by: pho Reviewed by: jmg Sponsored by: The FreeBSD Foundation MFC after: 1 week Approved by: re (delphij)
-rw-r--r--sys/kern/kern_event.c6
-rw-r--r--sys/sys/event.h2
-rw-r--r--sys/sys/eventvar.h2
3 files changed, 5 insertions, 5 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
index 8bde25a..85ea78c 100644
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -707,7 +707,7 @@ sys_kqueue(struct thread *td, struct kqueue_args *uap)
TASK_INIT(&kq->kq_task, 0, kqueue_task, kq);
FILEDESC_XLOCK(fdp);
- SLIST_INSERT_HEAD(&fdp->fd_kqlist, kq, kq_list);
+ TAILQ_INSERT_HEAD(&fdp->fd_kqlist, kq, kq_list);
FILEDESC_XUNLOCK(fdp);
finit(fp, FREAD | FWRITE, DTYPE_KQUEUE, kq, &kqueueops);
@@ -1718,7 +1718,7 @@ kqueue_close(struct file *fp, struct thread *td)
KQ_UNLOCK(kq);
FILEDESC_XLOCK(fdp);
- SLIST_REMOVE(&fdp->fd_kqlist, kq, kqueue, kq_list);
+ TAILQ_REMOVE(&fdp->fd_kqlist, kq, kq_list);
FILEDESC_XUNLOCK(fdp);
seldrain(&kq->kq_sel);
@@ -2095,7 +2095,7 @@ knote_fdclose(struct thread *td, int fd)
* We shouldn't have to worry about new kevents appearing on fd
* since filedesc is locked.
*/
- SLIST_FOREACH(kq, &fdp->fd_kqlist, kq_list) {
+ TAILQ_FOREACH(kq, &fdp->fd_kqlist, kq_list) {
KQ_LOCK(kq);
again:
diff --git a/sys/sys/event.h b/sys/sys/event.h
index 1066e36..03bd7b9 100644
--- a/sys/sys/event.h
+++ b/sys/sys/event.h
@@ -135,7 +135,7 @@ struct kevent {
struct knote;
SLIST_HEAD(klist, knote);
struct kqueue;
-SLIST_HEAD(kqlist, kqueue);
+TAILQ_HEAD(kqlist, kqueue);
struct knlist {
struct klist kl_list;
void (*kl_lock)(void *); /* lock function */
diff --git a/sys/sys/eventvar.h b/sys/sys/eventvar.h
index bdb3adf..ed1067f1 100644
--- a/sys/sys/eventvar.h
+++ b/sys/sys/eventvar.h
@@ -41,7 +41,7 @@
struct kqueue {
struct mtx kq_lock;
int kq_refcnt;
- SLIST_ENTRY(kqueue) kq_list;
+ TAILQ_ENTRY(kqueue) kq_list;
TAILQ_HEAD(, knote) kq_head; /* list of pending event */
int kq_count; /* number of pending events */
struct selinfo kq_sel;
OpenPOWER on IntegriCloud