From owner-svn-src-head@freebsd.org Wed Nov 18 22:20:51 2015 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id EC909A32B21; Wed, 18 Nov 2015 22:20:50 +0000 (UTC) (envelope-from cem@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id C26EC18C7; Wed, 18 Nov 2015 22:20:50 +0000 (UTC) (envelope-from cem@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id tAIMKnGo084519; Wed, 18 Nov 2015 22:20:49 GMT (envelope-from cem@FreeBSD.org) Received: (from cem@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id tAIMKn35084518; Wed, 18 Nov 2015 22:20:49 GMT (envelope-from cem@FreeBSD.org) Message-Id: <201511182220.tAIMKn35084518@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: cem set sender to cem@FreeBSD.org using -f From: "Conrad E. Meyer" Date: Wed, 18 Nov 2015 22:20:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r291034 - head/sys/dev/ntb/if_ntb X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 18 Nov 2015 22:20:51 -0000 Author: cem Date: Wed Nov 18 22:20:49 2015 New Revision: 291034 URL: https://svnweb.freebsd.org/changeset/base/291034 Log: if_ntb: Reuse receive buffers correctly Discard the unused rx_free_q. Instead, reuse inputed packets by putting them back on the *pend* queue after reinitialization. If tx or rx handlers are unavailable, free mbufs rather than leaking them. With this change, if_ntb can receive more than 100 (NTB_QP_DEF_NUM_ENTRIES) packets. Sponsored by: EMC / Isilon Storage Division Modified: head/sys/dev/ntb/if_ntb/if_ntb.c Modified: head/sys/dev/ntb/if_ntb/if_ntb.c ============================================================================== --- head/sys/dev/ntb/if_ntb/if_ntb.c Wed Nov 18 22:20:40 2015 (r291033) +++ head/sys/dev/ntb/if_ntb/if_ntb.c Wed Nov 18 22:20:49 2015 (r291034) @@ -164,7 +164,6 @@ struct ntb_transport_qp { void *data, int len); struct ntb_queue_list rx_post_q; struct ntb_queue_list rx_pend_q; - struct ntb_queue_list rx_free_q; /* ntb_rx_q_lock: synchronize access to rx_XXXX_q */ struct mtx ntb_rx_q_lock; struct task rx_completion_task; @@ -718,7 +717,6 @@ ntb_transport_init_queue(struct ntb_tran STAILQ_INIT(&qp->rx_post_q); STAILQ_INIT(&qp->rx_pend_q); - STAILQ_INIT(&qp->rx_free_q); STAILQ_INIT(&qp->tx_free_q); callout_reset(&qp->link_work, 0, ntb_qp_link_work, qp); @@ -743,9 +741,6 @@ ntb_transport_free_queue(struct ntb_tran qp->tx_handler = NULL; qp->event_handler = NULL; - while ((entry = ntb_list_rm(&qp->ntb_rx_q_lock, &qp->rx_free_q))) - free(entry, M_NTB_IF); - while ((entry = ntb_list_rm(&qp->ntb_rx_q_lock, &qp->rx_pend_q))) free(entry, M_NTB_IF); @@ -910,8 +905,11 @@ ntb_process_tx(struct ntb_transport_qp * if (entry->len > qp->tx_max_frame - sizeof(struct ntb_payload_header)) { if (qp->tx_handler != NULL) qp->tx_handler(qp, qp->cb_data, entry->buf, - EIO); + EIO); + else + m_freem(entry->buf); + entry->buf = NULL; ntb_list_add(&qp->ntb_tx_free_q_lock, entry, &qp->tx_free_q); CTR1(KTR_NTB, "TX: frame too big. returning entry %p to tx_free_q", @@ -969,8 +967,11 @@ ntb_memcpy_tx(struct ntb_transport_qp *q qp->tx_bytes += entry->len; if (qp->tx_handler) - qp->tx_handler(qp, qp->cb_data, entry->cb_data, - entry->len); + qp->tx_handler(qp, qp->cb_data, entry->buf, + entry->len); + else + m_freem(entry->buf); + entry->buf = NULL; } CTR3(KTR_NTB, @@ -1146,17 +1147,28 @@ ntb_complete_rxc(void *arg, int pending) entry->x_hdr->flags = 0; iowrite32(entry->index, &qp->rx_info->entry); + STAILQ_REMOVE_HEAD(&qp->rx_post_q, entry); + len = entry->len; m = entry->buf; - STAILQ_REMOVE_HEAD(&qp->rx_post_q, entry); - STAILQ_INSERT_TAIL(&qp->rx_free_q, entry, entry); + /* + * Re-initialize queue_entry for reuse; rx_handler takes + * ownership of the mbuf. + */ + entry->buf = NULL; + entry->len = transport_mtu; + entry->cb_data = qp->transport->ifp; + + STAILQ_INSERT_TAIL(&qp->rx_pend_q, entry, entry); mtx_unlock_spin(&qp->ntb_rx_q_lock); CTR2(KTR_NTB, "RX: completing entry %p, mbuf %p", entry, m); if (qp->rx_handler != NULL && qp->client_ready) qp->rx_handler(qp, qp->cb_data, m, len); + else + m_freem(m); mtx_lock_spin(&qp->ntb_rx_q_lock); }