Replace mbuf defragmentation with collapse

Collapse should be more effective than defragmentation.
Added missing declaration of ena_check_and_collapse_mbuf().

Submitted by:   Michal Krawczyk <mk@semihalf.com>
Obtained from:  Semihalf
Sponsored by:   Amazon.com Inc.
This commit is contained in:
Zbigniew Bodek 2017-07-04 00:10:29 +00:00
parent 8a573700af
commit 1b069f1c69
3 changed files with 21 additions and 18 deletions

View File

@ -156,6 +156,8 @@ static void ena_update_hwassist(struct ena_adapter *);
static int ena_setup_ifnet(device_t, struct ena_adapter *, static int ena_setup_ifnet(device_t, struct ena_adapter *,
struct ena_com_dev_get_features_ctx *); struct ena_com_dev_get_features_ctx *);
static void ena_tx_csum(struct ena_com_tx_ctx *, struct mbuf *); static void ena_tx_csum(struct ena_com_tx_ctx *, struct mbuf *);
static int ena_check_and_collapse_mbuf(struct ena_ring *tx_ring,
struct mbuf **mbuf);
static int ena_xmit_mbuf(struct ena_ring *, struct mbuf **); static int ena_xmit_mbuf(struct ena_ring *, struct mbuf **);
static void ena_start_xmit(struct ena_ring *); static void ena_start_xmit(struct ena_ring *);
static int ena_mq_start(if_t, struct mbuf *); static int ena_mq_start(if_t, struct mbuf *);
@ -2623,10 +2625,10 @@ ena_tx_csum(struct ena_com_tx_ctx *ena_tx_ctx, struct mbuf *mbuf)
} }
static int static int
ena_check_and_defragment_mbuf(struct ena_ring *tx_ring, struct mbuf **mbuf) ena_check_and_collapse_mbuf(struct ena_ring *tx_ring, struct mbuf **mbuf)
{ {
struct ena_adapter *adapter; struct ena_adapter *adapter;
struct mbuf *defrag_mbuf; struct mbuf *collapsed_mbuf;
int num_frags; int num_frags;
adapter = tx_ring->adapter; adapter = tx_ring->adapter;
@ -2635,16 +2637,17 @@ ena_check_and_defragment_mbuf(struct ena_ring *tx_ring, struct mbuf **mbuf)
/* One segment must be reserved for configuration descriptor. */ /* One segment must be reserved for configuration descriptor. */
if (num_frags < adapter->max_tx_sgl_size) if (num_frags < adapter->max_tx_sgl_size)
return (0); return (0);
counter_u64_add(tx_ring->tx_stats.defragment, 1); counter_u64_add(tx_ring->tx_stats.collapse, 1);
defrag_mbuf = m_defrag(*mbuf, M_NOWAIT); collapsed_mbuf = m_collapse(*mbuf, M_NOWAIT,
if (defrag_mbuf == NULL) { adapter->max_tx_sgl_size - 1);
counter_u64_add(tx_ring->tx_stats.defragment_err, 1); if (collapsed_mbuf == NULL) {
counter_u64_add(tx_ring->tx_stats.collapse_err, 1);
return (ENOMEM); return (ENOMEM);
} }
/* If mbuf was defragmented succesfully, original mbuf is released. */ /* If mbuf was collapsed succesfully, original mbuf is released. */
*mbuf = defrag_mbuf; *mbuf = collapsed_mbuf;
return (0); return (0);
} }
@ -2675,10 +2678,10 @@ ena_xmit_mbuf(struct ena_ring *tx_ring, struct mbuf **mbuf)
ENA_ASSERT(*mbuf, "mbuf is NULL\n"); ENA_ASSERT(*mbuf, "mbuf is NULL\n");
rc = ena_check_and_defragment_mbuf(tx_ring, mbuf); rc = ena_check_and_collapse_mbuf(tx_ring, mbuf);
if (rc) { if (rc) {
ena_trace(ENA_WARNING, ena_trace(ENA_WARNING,
"Failed to defragment mbuf! err: %d", rc); "Failed to collapse mbuf! err: %d", rc);
return (rc); return (rc);
} }

View File

@ -226,8 +226,8 @@ struct ena_stats_tx {
counter_u64_t doorbells; counter_u64_t doorbells;
counter_u64_t missing_tx_comp; counter_u64_t missing_tx_comp;
counter_u64_t bad_req_id; counter_u64_t bad_req_id;
counter_u64_t defragment; counter_u64_t collapse;
counter_u64_t defragment_err; counter_u64_t collapse_err;
}; };
struct ena_stats_rx { struct ena_stats_rx {

View File

@ -156,13 +156,13 @@ ena_sysctl_add_stats(struct ena_adapter *adapter)
"stops", CTLFLAG_RD, "stops", CTLFLAG_RD,
&tx_stats->queue_stop, "Queue stops"); &tx_stats->queue_stop, "Queue stops");
SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO,
"defragmentations", CTLFLAG_RD, "mbuf_collapses", CTLFLAG_RD,
&tx_stats->defragment, &tx_stats->collapse,
"Mbuf defragmentations"); "Mbuf collapse count");
SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO,
"defragmentation_err", CTLFLAG_RD, "mbuf_collapse_err", CTLFLAG_RD,
&tx_stats->defragment_err, &tx_stats->collapse_err,
"Mbuf defragmentation failures"); "Mbuf collapse failures");
/* RX specific stats */ /* RX specific stats */
rx_node = SYSCTL_ADD_NODE(ctx, queue_list, OID_AUTO, rx_node = SYSCTL_ADD_NODE(ctx, queue_list, OID_AUTO,