From owner-svn-src-user@FreeBSD.ORG Wed Dec 31 23:21:08 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 EC2B9106564A; Wed, 31 Dec 2008 23:21:07 +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 DA7F68FC14; Wed, 31 Dec 2008 23:21:07 +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 mBVNL7CZ037898; Wed, 31 Dec 2008 23:21:07 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mBVNL75E037897; Wed, 31 Dec 2008 23:21:07 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200812312321.mBVNL75E037897@svn.freebsd.org> From: Kip Macy Date: Wed, 31 Dec 2008 23:21:07 +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: r186661 - user/kmacy/HEAD_fast_net/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: Wed, 31 Dec 2008 23:21:08 -0000 Author: kmacy Date: Wed Dec 31 23:21:07 2008 New Revision: 186661 URL: http://svn.freebsd.org/changeset/base/186661 Log: make it possible to profile normal mutex acquisition by not calling knlist_mtx_lock Modified: user/kmacy/HEAD_fast_net/sys/kern/kern_event.c Modified: user/kmacy/HEAD_fast_net/sys/kern/kern_event.c ============================================================================== --- user/kmacy/HEAD_fast_net/sys/kern/kern_event.c Wed Dec 31 22:57:14 2008 (r186660) +++ user/kmacy/HEAD_fast_net/sys/kern/kern_event.c Wed Dec 31 23:21:07 2008 (r186661) @@ -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((struct mtx *)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((struct mtx *)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((struct mtx *)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((struct mtx *)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((struct mtx *)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((struct mtx *)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) @@ -1801,7 +1832,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((struct mtx *)knl->kl_lockarg); } SLIST_FOREACH_SAFE(kn, &knl->kl_list, kn_selnext, kn2) {