From owner-svn-src-user@FreeBSD.ORG Sat Nov 15 08:02:12 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 BF2E71065672; Sat, 15 Nov 2008 08:02:12 +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 AD8598FC1B; Sat, 15 Nov 2008 08:02:12 +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 mAF82CZB014262; Sat, 15 Nov 2008 08:02:12 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mAF82C4K014261; Sat, 15 Nov 2008 08:02:12 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200811150802.mAF82C4K014261@svn.freebsd.org> From: Kip Macy Date: Sat, 15 Nov 2008 08:02:12 +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: r184986 - user/kmacy/HEAD_fast_multi_xmit/sys/dev/cxgb/sys 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: Sat, 15 Nov 2008 08:02:12 -0000 Author: kmacy Date: Sat Nov 15 08:02:12 2008 New Revision: 184986 URL: http://svn.freebsd.org/changeset/base/184986 Log: improve mbuf accounting Modified: user/kmacy/HEAD_fast_multi_xmit/sys/dev/cxgb/sys/uipc_mvec.c Modified: user/kmacy/HEAD_fast_multi_xmit/sys/dev/cxgb/sys/uipc_mvec.c ============================================================================== --- user/kmacy/HEAD_fast_multi_xmit/sys/dev/cxgb/sys/uipc_mvec.c Sat Nov 15 06:41:57 2008 (r184985) +++ user/kmacy/HEAD_fast_multi_xmit/sys/dev/cxgb/sys/uipc_mvec.c Sat Nov 15 08:02:12 2008 (r184986) @@ -147,13 +147,17 @@ _mcl_collapse_mbuf(struct mbuf_iovec *mi mi->mi_type = m->m_ext.ext_type; mi->mi_size = m->m_ext.ext_size; mi->mi_refcnt = m->m_ext.ref_cnt; - mi->mi_mbuf = m; + if (m->m_ext.ext_type == EXT_PACKET) { + mi->mi_mbuf = m; + cxgb_pack_outstanding++; + } } else { mi->mi_base = (caddr_t)m; mi->mi_data = m->m_data; mi->mi_size = MSIZE; mi->mi_type = EXT_MBUF; mi->mi_refcnt = NULL; + cxgb_mbufs_outstanding++; } KASSERT(mi->mi_len != 0, ("miov has len 0")); KASSERT(mi->mi_type > 0, ("mi_type is invalid")); @@ -193,7 +197,7 @@ busdma_map_sg_collapse(struct mbuf **m, struct mbuf *marray[TX_MAX_SEGS]; int i, type, seg_count, defragged = 0, err = 0; struct mbuf_vec *mv; - int skipped, freed, outstanding, pack_outstanding, mbuf_outstanding; + int skipped, freed; @@ -209,14 +213,10 @@ retry: if (n->m_next == NULL) { busdma_map_mbuf_fast(n, segs); *nsegs = 1; - if ((n->m_flags & M_EXT) && - (n->m_ext.ext_type == EXT_PACKET)) - cxgb_pack_outstanding++; - else if ((n->m_flags & M_NOFREE) == 0) - cxgb_mbufs_outstanding++; + return (0); } - skipped = freed = outstanding = pack_outstanding = mbuf_outstanding = 0; + skipped = freed; while (n && seg_count < TX_MAX_SEGS) { marray[seg_count] = n; @@ -274,11 +274,9 @@ retry: if (n->m_len == 0) /* do nothing - free if mbuf or cluster */; else if ((n->m_flags & M_EXT) == 0) { - mbuf_outstanding++; goto skip; } else if ((n->m_flags & M_EXT) && (n->m_ext.ext_type == EXT_PACKET)) { - pack_outstanding++; goto skip; } else if (n->m_flags & M_NOFREE) goto skip; @@ -298,8 +296,6 @@ retry: *nsegs = seg_count; *m = m0; DPRINTF("pktlen=%d m0=%p *m=%p m=%p\n", m0->m_pkthdr.len, m0, *m, m); - cxgb_mbufs_outstanding += mbuf_outstanding; - cxgb_pack_outstanding += pack_outstanding; return (0); err_out: m_freem(*m); @@ -334,11 +330,10 @@ busdma_map_sg_vec(struct mbuf **m, struc for (mp = m, i = 0; i < pkt_count; i++, mp++) { (*mp)->m_next = (*mp)->m_nextpkt = NULL; - + if ((((*mp)->m_flags & (M_EXT|M_NOFREE)) == M_EXT) && ((*mp)->m_ext.ext_type != EXT_PACKET)){ (*mp)->m_flags &= ~M_EXT; - cxgb_mbufs_outstanding--; m_free(*mp); } } @@ -352,18 +347,23 @@ mb_free_ext_fast(struct mbuf_iovec *mi, { int dofree; caddr_t cl; - - if (type == EXT_PACKET) { + + switch (type) { + case EXT_PACKET: cxgb_pack_outstanding--; m_free(mi->mi_mbuf); return; + case EXT_MBUF: + cxgb_mbufs_outstanding--; + m_free_fast((struct mbuf *)cl); + return; + default: + break; } - + /* Account for lazy ref count assign. */ dofree = (mi->mi_refcnt == NULL); if (dofree == 0) { - KASSERT(mi->mi_type != EXT_MBUF, - ("refcnt must be null for mbuf")); if (*(mi->mi_refcnt) == 1 || atomic_fetchadd_int(mi->mi_refcnt, -1) == 1) dofree = 1; @@ -373,11 +373,6 @@ mb_free_ext_fast(struct mbuf_iovec *mi, cl = mi->mi_base; switch (type) { - case EXT_MBUF: - KASSERT((mi->mi_flags & M_NOFREE) == 0, ("no free set on mbuf")); - cxgb_mbufs_outstanding--; - m_free_fast((struct mbuf *)cl); - break; case EXT_CLUSTER: cxgb_cache_put(zone_clust, cl); break;