Skip site navigation (1)Skip section navigation (2)
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>