diff --git a/sys/dev/cxgb/cxgb_sge.c b/sys/dev/cxgb/cxgb_sge.c index 491d1a751f4..f13d2f03180 100644 --- a/sys/dev/cxgb/cxgb_sge.c +++ b/sys/dev/cxgb/cxgb_sge.c @@ -312,20 +312,22 @@ set_wr_hdr(struct work_request_hdr *wrp, uint32_t wr_hi, uint32_t wr_lo) struct coalesce_info { int count; int nbytes; + int noncoal; }; static int coalesce_check(struct mbuf *m, void *arg) { struct coalesce_info *ci = arg; - int *count = &ci->count; - int *nbytes = &ci->nbytes; - if ((*nbytes == 0) || ((*nbytes + m->m_len <= 10500) && - (*count < 7) && (m->m_next == NULL) && - ((mtod(m, vm_offset_t) & PAGE_MASK) + m->m_len <= PAGE_SIZE))) { - *count += 1; - *nbytes += m->m_len; + if ((m->m_next != NULL) || + ((mtod(m, vm_offset_t) & PAGE_MASK) + m->m_len > PAGE_SIZE)) + ci->noncoal = 1; + + if ((ci->count == 0) || (ci->noncoal == 0 && (ci->count < 7) && + (ci->nbytes + m->m_len <= 10500))) { + ci->count++; + ci->nbytes += m->m_len; return (1); } return (0); @@ -342,7 +344,7 @@ cxgb_dequeue(struct sge_qset *qs) return TXQ_RING_DEQUEUE(qs); m_head = m_tail = NULL; - ci.count = ci.nbytes = 0; + ci.count = ci.nbytes = ci.noncoal = 0; do { m = TXQ_RING_DEQUEUE_COND(qs, coalesce_check, &ci); if (m_head == NULL) {