svn commit: r325592 - head/sys/dev/ena

Marcin Wojtas mw at FreeBSD.org
Thu Nov 9 13:36:43 UTC 2017


Author: mw
Date: Thu Nov  9 13:36:42 2017
New Revision: 325592
URL: https://svnweb.freebsd.org/changeset/base/325592

Log:
  Allow usage of more RX descriptors than 1 in ENA driver
  
  Using only 1 descriptor on RX could be an issue, if system would be low
  on resources and could not provide driver with large chunks of
  contiguous memory.
  
  Submitted by: Michal Krawczyk <mk at semihalf.com>
  Reviewed by: byenduri_gmail.com
  Obtained from: Semihalf
  Sponsored by: Amazon, Inc.
  Differential Revision: https://reviews.freebsd.org/D12871

Modified:
  head/sys/dev/ena/ena.c
  head/sys/dev/ena/ena.h
  head/sys/dev/ena/ena_sysctl.c

Modified: head/sys/dev/ena/ena.c
==============================================================================
--- head/sys/dev/ena/ena.c	Thu Nov  9 13:35:07 2017	(r325591)
+++ head/sys/dev/ena/ena.c	Thu Nov  9 13:36:42 2017	(r325592)
@@ -549,7 +549,7 @@ ena_setup_rx_dma_tag(struct ena_adapter *adapter)
 	    BUS_SPACE_MAXADDR, 			  /* highaddr of excl window */
 	    NULL, NULL,				  /* filter, filterarg 	     */
 	    MJUM16BYTES,			  /* maxsize 		     */
-	    1,					  /* nsegments 		     */
+	    adapter->max_rx_sgl_size,		  /* nsegments 		     */
 	    MJUM16BYTES,			  /* maxsegsize 	     */
 	    0,					  /* flags 		     */
 	    NULL,				  /* lockfunc 		     */
@@ -950,6 +950,7 @@ ena_alloc_rx_mbuf(struct ena_adapter *adapter,
 	struct ena_com_buf *ena_buf;
 	bus_dma_segment_t segs[1];
 	int nsegs, error;
+	int mlen;
 
 	/* if previous allocated frag is not used */
 	if (unlikely(rx_info->mbuf != NULL))
@@ -959,11 +960,18 @@ ena_alloc_rx_mbuf(struct ena_adapter *adapter,
 	rx_info->mbuf = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, MJUM16BYTES);
 
 	if (unlikely(rx_info->mbuf == NULL)) {
-		counter_u64_add(rx_ring->rx_stats.mbuf_alloc_fail, 1);
-		return (ENOMEM);
+		counter_u64_add(rx_ring->rx_stats.mjum_alloc_fail, 1);
+		rx_info->mbuf = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
+		if (unlikely(rx_info->mbuf == NULL)) {
+			counter_u64_add(rx_ring->rx_stats.mbuf_alloc_fail, 1);
+			return (ENOMEM);
+		}
+		mlen = MCLBYTES;
+	} else {
+		mlen = MJUM16BYTES;
 	}
 	/* Set mbuf length*/
-	rx_info->mbuf->m_pkthdr.len = rx_info->mbuf->m_len = MJUM16BYTES;
+	rx_info->mbuf->m_pkthdr.len = rx_info->mbuf->m_len = mlen;
 
 	/* Map packets for DMA */
 	ena_trace(ENA_DBG | ENA_RSC | ENA_RXPTH,
@@ -983,7 +991,7 @@ ena_alloc_rx_mbuf(struct ena_adapter *adapter,
 
 	ena_buf = &rx_info->ena_buf;
 	ena_buf->paddr = segs[0].ds_addr;
-	ena_buf->len = MJUM16BYTES;
+	ena_buf->len = mlen;
 
 	ena_trace(ENA_DBG | ENA_RSC | ENA_RXPTH,
 	    "ALLOC RX BUF: mbuf %p, rx_info %p, len %d, paddr %#jx\n",

Modified: head/sys/dev/ena/ena.h
==============================================================================
--- head/sys/dev/ena/ena.h	Thu Nov  9 13:35:07 2017	(r325591)
+++ head/sys/dev/ena/ena.h	Thu Nov  9 13:36:42 2017	(r325592)
@@ -215,6 +215,7 @@ struct ena_stats_rx {
 	counter_u64_t bytes;
 	counter_u64_t refil_partial;
 	counter_u64_t bad_csum;
+	counter_u64_t mjum_alloc_fail;
 	counter_u64_t mbuf_alloc_fail;
 	counter_u64_t dma_mapping_err;
 	counter_u64_t bad_desc_num;

Modified: head/sys/dev/ena/ena_sysctl.c
==============================================================================
--- head/sys/dev/ena/ena_sysctl.c	Thu Nov  9 13:35:07 2017	(r325591)
+++ head/sys/dev/ena/ena_sysctl.c	Thu Nov  9 13:36:42 2017	(r325592)
@@ -200,6 +200,9 @@ ena_sysctl_add_stats(struct ena_adapter *adapter)
 		    "mbuf_alloc_fail", CTLFLAG_RD,
 		    &rx_stats->mbuf_alloc_fail, "Failed mbuf allocs");
 		SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO,
+		    "mjum_alloc_fail", CTLFLAG_RD,
+		    &rx_stats->mjum_alloc_fail, "Failed jumbo mbuf allocs");
+		SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO,
 		    "dma_mapping_err", CTLFLAG_RD,
 		    &rx_stats->dma_mapping_err, "DMA mapping errors");
 		SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO,


More information about the svn-src-head mailing list