From owner-svn-src-user@FreeBSD.ORG Thu Nov 20 02:06:05 2008 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7C135106564A; Thu, 20 Nov 2008 02:06:05 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 6CE8B8FC12; Thu, 20 Nov 2008 02:06:05 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mAK265hs035098; Thu, 20 Nov 2008 02:06:05 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mAK265QH035097; Thu, 20 Nov 2008 02:06:05 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200811200206.mAK265QH035097@svn.freebsd.org> From: Kip Macy Date: Thu, 20 Nov 2008 02:06:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r185113 - user/kmacy/HEAD_fast_multi_xmit/sys/kern X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 20 Nov 2008 02:06:05 -0000 Author: kmacy Date: Thu Nov 20 02:06:05 2008 New Revision: 185113 URL: http://svn.freebsd.org/changeset/base/185113 Log: Don't use knlist_mtx_lock routine Modified: user/kmacy/HEAD_fast_multi_xmit/sys/kern/kern_event.c Modified: user/kmacy/HEAD_fast_multi_xmit/sys/kern/kern_event.c ============================================================================== --- user/kmacy/HEAD_fast_multi_xmit/sys/kern/kern_event.c Thu Nov 20 01:11:34 2008 (r185112) +++ user/kmacy/HEAD_fast_multi_xmit/sys/kern/kern_event.c Thu Nov 20 02:06:05 2008 (r185113) @@ -86,6 +86,10 @@ MTX_SYSINIT(kq_global, &kq_global, "kque TASKQUEUE_DEFINE_THREAD(kqueue); +static void knlist_mtx_lock(void *arg); +static void knlist_mtx_unlock(void *arg); +static int knlist_mtx_locked(void *arg); + static int kevent_copyout(void *arg, struct kevent *kevp, int count); static int kevent_copyin(void *arg, struct kevent *kevp, int count); static int kqueue_register(struct kqueue *kq, struct kevent *kev, @@ -193,8 +197,14 @@ SYSCTL_INT(_kern, OID_AUTO, kq_calloutma mtx_assert(&(kq)->kq_lock, MA_NOTOWNED); \ } while (0) #define KN_LIST_LOCK(kn) do { \ - if (kn->kn_knlist != NULL) \ - kn->kn_knlist->kl_lock(kn->kn_knlist->kl_lockarg); \ + struct knlist *list = kn->kn_knlist; \ + \ + if (list != NULL){ \ + if (list->kl_lock != knlist_mtx_lock) \ + list->kl_lock(list->kl_lockarg); \ + else \ + mtx_lock(list->kl_lockarg); \ + } \ } while (0) #define KN_LIST_UNLOCK(kn) do { \ if (kn->kn_knlist != NULL) \ @@ -424,8 +434,12 @@ knote_fork(struct knlist *list, int pid) if (list == NULL) return; - list->kl_lock(list->kl_lockarg); - + + if (list->kl_lock != knlist_mtx_lock) + list->kl_lock(list->kl_lockarg); + else + mtx_lock(list->kl_lockarg); + SLIST_FOREACH(kn, &list->kl_list, kn_selnext) { if ((kn->kn_status & KN_INFLUX) == KN_INFLUX) continue; @@ -476,7 +490,10 @@ knote_fork(struct knlist *list, int pid) KQ_LOCK(kq); kn->kn_status &= ~KN_INFLUX; KQ_UNLOCK_FLUX(kq); - list->kl_lock(list->kl_lockarg); + if (list->kl_lock != knlist_mtx_lock) + list->kl_lock(list->kl_lockarg); + else + mtx_lock(list->kl_lockarg); } list->kl_unlock(list->kl_lockarg); } @@ -1618,8 +1635,12 @@ knote(struct knlist *list, long hint, in KNL_ASSERT_LOCK(list, islocked); - if (!islocked) - list->kl_lock(list->kl_lockarg); + if (!islocked){ + if (list->kl_lock != knlist_mtx_lock) + list->kl_lock(list->kl_lockarg); + else + mtx_lock(list->kl_lockarg); + } /* * If we unlock the list lock (and set KN_INFLUX), we can eliminate @@ -1657,8 +1678,14 @@ knlist_add(struct knlist *knl, struct kn KQ_NOTOWNED(kn->kn_kq); KASSERT((kn->kn_status & (KN_INFLUX|KN_DETACHED)) == (KN_INFLUX|KN_DETACHED), ("knote not KN_INFLUX and KN_DETACHED")); - if (!islocked) - knl->kl_lock(knl->kl_lockarg); + if (!islocked) { + struct knlist *list = kn->kn_knlist; + + if (list->kl_lock != knlist_mtx_lock) + list->kl_lock(list->kl_lockarg); + else + mtx_lock(list->kl_lockarg); + } SLIST_INSERT_HEAD(&knl->kl_list, kn, kn_selnext); if (!islocked) knl->kl_unlock(knl->kl_lockarg); @@ -1677,8 +1704,15 @@ knlist_remove_kq(struct knlist *knl, str if (!kqislocked) KASSERT((kn->kn_status & (KN_INFLUX|KN_DETACHED)) == KN_INFLUX, ("knlist_remove called w/o knote being KN_INFLUX or already removed")); - if (!knlislocked) - knl->kl_lock(knl->kl_lockarg); + if (!knlislocked) { + struct knlist *list = kn->kn_knlist; + + if (list->kl_lock != knlist_mtx_lock) + list->kl_lock(list->kl_lockarg); + else + mtx_lock(list->kl_lockarg); + } + SLIST_REMOVE(&knl->kl_list, kn, knote, kn_selnext); kn->kn_knlist = NULL; if (!knlislocked) @@ -1721,9 +1755,6 @@ knlist_empty(struct knlist *knl) static struct mtx knlist_lock; MTX_SYSINIT(knlist_lock, &knlist_lock, "knlist lock for lockless objects", MTX_DEF); -static void knlist_mtx_lock(void *arg); -static void knlist_mtx_unlock(void *arg); -static int knlist_mtx_locked(void *arg); static void knlist_mtx_lock(void *arg) @@ -1752,11 +1783,12 @@ knlist_init(struct knlist *knl, void *lo knl->kl_lockarg = &knlist_lock; else knl->kl_lockarg = lock; - + if (kl_lock == NULL) knl->kl_lock = knlist_mtx_lock; else knl->kl_lock = kl_lock; + if (kl_unlock == NULL) knl->kl_unlock = knlist_mtx_unlock; else @@ -1801,7 +1833,11 @@ knlist_cleardel(struct knlist *knl, stru else { KNL_ASSERT_UNLOCKED(knl); again: /* need to reacquire lock since we have dropped it */ - knl->kl_lock(knl->kl_lockarg); + + if (knl->kl_lock != knlist_mtx_lock) + knl->kl_lock(knl->kl_lockarg); + else + mtx_lock(knl->kl_lockarg); } SLIST_FOREACH_SAFE(kn, &knl->kl_list, kn_selnext, kn2) {