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 <m...@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,
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to