Date: Thu, 27 Sep 2007 19:13:58 GMT From: Kip Macy <kmacy@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 126870 for review Message-ID: <200709271913.l8RJDw7w054150@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
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; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200709271913.l8RJDw7w054150>