PERFORCE change 126870 for review
Kip Macy
kmacy at FreeBSD.org
Thu Sep 27 12:14:00 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=126870
Change 126870 by kmacy at 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;
}
More information about the p4-projects
mailing list