From: Stathis Kamperis Date: Tue, 6 Apr 2010 19:17:35 +0000 (+0300) Subject: mqueues: selwakeup() needs the MP lock to be held X-Git-Tag: v2.7.1~38^2~8^2 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/975523fa1d5f20d7df3832f3d6b8adee58eec084 mqueues: selwakeup() needs the MP lock to be held Briefly-discussed-with: sjg@ --- diff --git a/sys/kern/sys_mqueue.c b/sys/kern/sys_mqueue.c index 2b1fc17833..0901a7c5bd 100644 --- a/sys/kern/sys_mqueue.c +++ b/sys/kern/sys_mqueue.c @@ -52,6 +52,7 @@ #include #include #include +#include #include #include #include @@ -669,7 +670,9 @@ mq_receive1(struct lwp *l, mqd_t mqdes, void *msg_ptr, size_t msg_len, wakeup_one(&mq->mq_recv_cv); /* Ready for sending now */ + get_mplock(); selwakeup(&mq->mq_wsel); + rel_mplock(); error: lockmgr(&mq->mq_mtx, LK_RELEASE); fdrop(fp); @@ -858,7 +861,9 @@ mq_send1(struct lwp *l, mqd_t mqdes, const char *msg_ptr, size_t msg_len, wakeup_one(&mq->mq_send_cv); /* Ready for receiving now */ + get_mplock(); selwakeup(&mq->mq_rsel); + rel_mplock(); error: lockmgr(&mq->mq_mtx, LK_RELEASE); fdrop(fp); @@ -1081,8 +1086,10 @@ sys_mq_unlink(struct mq_unlink_args *uap) wakeup(&mq->mq_send_cv); wakeup(&mq->mq_recv_cv); + get_mplock(); selwakeup(&mq->mq_rsel); selwakeup(&mq->mq_wsel); + rel_mplock(); refcnt = mq->mq_refcnt; if (refcnt == 0)