From owner-p4-projects@FreeBSD.ORG Thu Sep 27 19:13:59 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id A48EC16A418; Thu, 27 Sep 2007 19:13:59 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 52BCB16A469 for ; Thu, 27 Sep 2007 19:13:59 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 2F36513C45B for ; Thu, 27 Sep 2007 19:13:59 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l8RJDxpi054153 for ; Thu, 27 Sep 2007 19:13:59 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l8RJDw7w054150 for perforce@freebsd.org; Thu, 27 Sep 2007 19:13:58 GMT (envelope-from kmacy@freebsd.org) Date: Thu, 27 Sep 2007 19:13:58 GMT Message-Id: <200709271913.l8RJDw7w054150@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to kmacy@freebsd.org using -f From: Kip Macy To: Perforce Change Reviews Cc: Subject: PERFORCE change 126870 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 27 Sep 2007 19:14:00 -0000 http://perforce.freebsd.org/chv.cgi?CH=126870 Change 126870 by kmacy@kmacy_home:ethng on 2007/09/27 19:12:57 move dump_mi to uipc_mvec.c reduce pcpu cache size to half of ring size Affected files ... .. //depot/projects/ethng/src/sys/dev/cxgb/sys/cxgb_support.c#4 edit .. //depot/projects/ethng/src/sys/dev/cxgb/sys/mvec.h#8 edit .. //depot/projects/ethng/src/sys/dev/cxgb/sys/uipc_mvec.c#8 edit Differences ... ==== //depot/projects/ethng/src/sys/dev/cxgb/sys/cxgb_support.c#4 (text+ko) ==== @@ -78,14 +78,14 @@ } /* - * Stack is more than half full - * we can free some elements to make room + * Stack is full + * */ static __inline int -buf_stack_canfree(struct buf_stack *bs) +buf_stack_avail(struct buf_stack *bs) { - return (bs->bs_head > (bs->bs_size>>1)); -} + return (bs->bs_size - bs->bs_head - 1); +} struct cxgb_cache_pcpu { struct buf_stack ccp_jumbo_free; @@ -120,10 +120,10 @@ { int err; - if ((err = buf_stack_init(&ccp->ccp_jumbo_free, 2*JUMBO_Q_SIZE))) + if ((err = buf_stack_init(&ccp->ccp_jumbo_free, (JUMBO_Q_SIZE >> 1)))) return (err); - if ((err = buf_stack_init(&ccp->ccp_cluster_free, 2*FL_Q_SIZE))) + if ((err = buf_stack_init(&ccp->ccp_cluster_free, (FL_Q_SIZE >> 1)))) return (err); if (jumbo_phys_contig) @@ -236,41 +236,66 @@ } void -cxgb_cache_rebalance(void) +cxgb_cache_refill(void) { struct cxgb_cache_pcpu *ccp; caddr_t vec[8]; uma_zone_t zone; int i, count; + return; - +restart: critical_enter(); -restart: ccp = &cxgb_caches->ccs_array[curcpu]; zone = ccp->ccp_jumbo_zone; - for (i = 0; i < 8 && buf_stack_canfree(&ccp->ccp_jumbo_free); i++) - vec[i] = buf_stack_pop(&ccp->ccp_jumbo_free); + if (!buf_stack_avail(&ccp->ccp_jumbo_free) && + !buf_stack_avail(&ccp->ccp_cluster_free)) { + critical_exit(); + return; + } critical_exit(); - count = i; - for (i = 0; i < count; i++) - uma_zfree(zone, vec[i]); - + + + + for (i = 0; i < 8; i++) + if ((vec[i] = uma_zalloc(zone, M_NOWAIT)) == NULL) + goto free; + critical_enter(); ccp = &cxgb_caches->ccs_array[curcpu]; - zone = zone_clust; - for (i = 0; i < 8 && buf_stack_canfree(&ccp->ccp_cluster_free); i++) - vec[i] = buf_stack_pop(&ccp->ccp_cluster_free); + for (i = 0; i < 8 && buf_stack_avail(&ccp->ccp_jumbo_free); i++) + if (buf_stack_push(&ccp->ccp_jumbo_free, vec[i])) + break; critical_exit(); - count = i; - for (i = 0; i < count; i++) + + for (; i < 8; i++) uma_zfree(zone, vec[i]); + + + zone = zone_clust; + for (i = 0; i < 8; i++) + if ((vec[i] = uma_zalloc(zone, M_NOWAIT)) == NULL) + goto free; + critical_enter(); ccp = &cxgb_caches->ccs_array[curcpu]; - if (buf_stack_canfree(&ccp->ccp_cluster_free) || buf_stack_canfree(&ccp->ccp_jumbo_free)) - goto restart; + for (i = 0; i < 8 && buf_stack_avail(&ccp->ccp_cluster_free); i++) + if (buf_stack_push(&ccp->ccp_cluster_free, vec[i])) + break; critical_exit(); + + for (; i < 8; i++) + uma_zfree(zone, vec[i]); + + goto restart; + + +free: + count = i; + for (; i < count; i++) + uma_zfree(zone, vec[i]); } ==== //depot/projects/ethng/src/sys/dev/cxgb/sys/mvec.h#8 (text+ko) ==== @@ -40,7 +40,7 @@ void cxgb_cache_put(uma_zone_t zone, void *cl); -void cxgb_cache_rebalance(void); +void cxgb_cache_refill(void); extern int cxgb_cached_allocations; extern int cxgb_cached; @@ -55,7 +55,7 @@ struct m_ext_ mi_ext; uint32_t mi_flags; uint32_t mi_len; - uint16_t mi_offset; + caddr_t mi_data; uint16_t mi_tso_segsz; uint16_t mi_ether_vtag; uint16_t mi_rss_hash; /* this can be shrunk down if something comes @@ -70,7 +70,6 @@ #define mi_ext_free mi_ext.ext_free #define mi_ext_flags mi_ext.ext_flags #define mi_type mi_ext.ext_type -#define mi_data(mi) ((mi)->mi_base + (mi)->mi_offset) }; #define MIOVBYTES 512 @@ -102,7 +101,7 @@ } static __inline void -m_iovappend(struct mbuf *m, uint8_t *cl, int size, int len, int offset, volatile uint32_t *ref) +m_iovappend(struct mbuf *m, uint8_t *cl, int size, int len, caddr_t data, volatile uint32_t *ref) { struct mbuf_vec *mv = mtomv(m); struct mbuf_iovec *iov; @@ -113,13 +112,13 @@ panic("invalid flags in %s", __func__); if (mv->mv_count == 0) - m->m_data = cl + offset; + m->m_data = data; iov = &mv->mv_vec[idx]; iov->mi_type = m_gettype(size); iov->mi_base = cl; iov->mi_len = len; - iov->mi_offset = offset; + iov->mi_data = data; iov->mi_refcnt = ref; m->m_pkthdr.len += len; m->m_len += len; @@ -262,4 +261,6 @@ return (size); } +void dump_mi(struct mbuf_iovec *mi); + #endif /* _MVEC_H_ */ ==== //depot/projects/ethng/src/sys/dev/cxgb/sys/uipc_mvec.c#8 (text+ko) ==== @@ -92,6 +92,25 @@ uma_zdestroy(zone_miovec); } +void +dump_mi(struct mbuf_iovec *mi) +{ + int i; + struct mbuf_vec *mv; + + printf("mi_flags=0x%08x mi_base=%p mi_data=%p mi_len=%d mi_type=%d\n", + mi->mi_flags, mi->mi_base, mi->mi_data, mi->mi_len, mi->mi_type); + + if (mi->mi_type == EXT_CLIOVEC || + mi->mi_type == EXT_IOVEC) { + mv = mtomv((struct mbuf *)mi->mi_base); + mi = mv->mv_vec; + for (i = 0; i < mv->mv_count; i++, mi++) + dump_mi(mi); + + } +} + static __inline struct mbuf * _mcl_collapse_mbuf(struct mbuf_iovec *mi, struct mbuf *m) { @@ -110,11 +129,11 @@ } if (m->m_flags & M_EXT) { memcpy(&mi->mi_ext, &m->m_ext, sizeof(struct m_ext_)); - mi->mi_offset = (uint8_t *)m->m_data - (uint8_t *)m->m_ext.ext_buf; + mi->mi_data = m->m_data; mi->mi_type = m->m_ext.ext_type; } else { mi->mi_base = (caddr_t)m; - mi->mi_offset = (uint8_t *)m->m_data - (uint8_t *)m; + mi->mi_data = m->m_data; mi->mi_size = MSIZE; mi->mi_type = EXT_MBUF; mi->mi_refcnt = NULL; @@ -328,6 +347,7 @@ mi->mi_ext.ext_args); break; default: + dump_mi(mi); panic("unknown mv type in m_free_vec type=%d", type); break; }