The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/sfxge/sfxge_tx.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2010-2016 Solarflare Communications Inc.
    3  * All rights reserved.
    4  *
    5  * This software was developed in part by Philip Paeps under contract for
    6  * Solarflare Communications, Inc.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions are met:
   10  *
   11  * 1. Redistributions of source code must retain the above copyright notice,
   12  *    this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright notice,
   14  *    this list of conditions and the following disclaimer in the documentation
   15  *    and/or other materials provided with the distribution.
   16  *
   17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
   18  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
   19  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   20  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
   21  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
   24  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
   25  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
   26  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
   27  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   28  *
   29  * The views and conclusions contained in the software and documentation are
   30  * those of the authors and should not be interpreted as representing official
   31  * policies, either expressed or implied, of the FreeBSD Project.
   32  *
   33  * $FreeBSD: releng/11.2/sys/dev/sfxge/sfxge_tx.h 331722 2018-03-29 02:50:57Z eadler $
   34  */
   35 
   36 #ifndef _SFXGE_TX_H
   37 #define _SFXGE_TX_H
   38 
   39 #include <netinet/in.h>
   40 #include <netinet/ip.h>
   41 #include <netinet/tcp.h>
   42 
   43 /* If defined, parse TX packets directly in if_transmit
   44  * for better cache locality and reduced time under TX lock
   45  */
   46 #define SFXGE_TX_PARSE_EARLY 1
   47 
   48 /* Maximum size of TSO packet */
   49 #define SFXGE_TSO_MAX_SIZE              (65535)
   50 
   51 /*
   52  * Maximum number of segments to be created for a TSO packet.
   53  * Allow for a reasonable minimum MSS of 512.
   54  */
   55 #define SFXGE_TSO_MAX_SEGS              howmany(SFXGE_TSO_MAX_SIZE, 512)
   56 
   57 /* Maximum number of DMA segments needed to map an mbuf chain.  With
   58  * TSO, the mbuf length may be just over 64K, divided into 2K mbuf
   59  * clusters taking into account that the first may be not 2K cluster
   60  * boundary aligned.
   61  * Packet header may be split into two segments because of, for example,
   62  * VLAN header insertion.
   63  * The chain could be longer than this initially, but can be shortened
   64  * with m_collapse().
   65  */
   66 #define SFXGE_TX_MAPPING_MAX_SEG                                        \
   67         (2 + howmany(SFXGE_TSO_MAX_SIZE, MCLBYTES) + 1)
   68 
   69 /*
   70  * Buffer mapping flags.
   71  *
   72  * Buffers and DMA mappings must be freed when the last descriptor
   73  * referring to them is completed.  Set the TX_BUF_UNMAP and
   74  * TX_BUF_MBUF flags on the last descriptor generated for an mbuf
   75  * chain.  Set only the TX_BUF_UNMAP flag on a descriptor referring to
   76  * a heap buffer.
   77  */
   78 enum sfxge_tx_buf_flags {
   79         TX_BUF_UNMAP = 1,
   80         TX_BUF_MBUF = 2,
   81 };
   82 
   83 /*
   84  * Buffer mapping information for descriptors in flight.
   85  */
   86 struct sfxge_tx_mapping {
   87         union {
   88                 struct mbuf     *mbuf;
   89                 caddr_t         heap_buf;
   90         }                       u;
   91         bus_dmamap_t            map;
   92         enum sfxge_tx_buf_flags flags;
   93 };
   94 
   95 #define SFXGE_TX_DPL_GET_PKT_LIMIT_DEFAULT              (64 * 1024)
   96 #define SFXGE_TX_DPL_GET_NON_TCP_PKT_LIMIT_DEFAULT      1024
   97 #define SFXGE_TX_DPL_PUT_PKT_LIMIT_DEFAULT              1024
   98 
   99 /*
  100  * Deferred packet list.
  101  */
  102 struct sfxge_tx_dpl {
  103         unsigned int    std_get_max;            /* Maximum number  of packets
  104                                                  * in get list */
  105         unsigned int    std_get_non_tcp_max;    /* Maximum number
  106                                                  * of non-TCP packets
  107                                                  * in get list */
  108         unsigned int    std_put_max;            /* Maximum number of packets
  109                                                  * in put list */
  110         uintptr_t       std_put;                /* Head of put list. */
  111         struct mbuf     *std_get;               /* Head of get list. */
  112         struct mbuf     **std_getp;             /* Tail of get list. */
  113         unsigned int    std_get_count;          /* Packets in get list. */
  114         unsigned int    std_get_non_tcp_count;  /* Non-TCP packets
  115                                                  * in get list */
  116         unsigned int    std_get_hiwat;          /* Packets in get list
  117                                                  * high watermark */
  118         unsigned int    std_put_hiwat;          /* Packets in put list
  119                                                  * high watermark */
  120 };
  121 
  122 
  123 #define SFXGE_TX_BUFFER_SIZE    0x400
  124 #define SFXGE_TX_HEADER_SIZE    0x100
  125 #define SFXGE_TX_COPY_THRESHOLD 0x200
  126 
  127 enum sfxge_txq_state {
  128         SFXGE_TXQ_UNINITIALIZED = 0,
  129         SFXGE_TXQ_INITIALIZED,
  130         SFXGE_TXQ_STARTED
  131 };
  132 
  133 enum sfxge_txq_type {
  134         SFXGE_TXQ_NON_CKSUM = 0,
  135         SFXGE_TXQ_IP_CKSUM,
  136         SFXGE_TXQ_IP_TCP_UDP_CKSUM,
  137         SFXGE_TXQ_NTYPES
  138 };
  139 
  140 #define SFXGE_TXQ_UNBLOCK_LEVEL(_entries)       (EFX_TXQ_LIMIT(_entries) / 4)
  141 
  142 #define SFXGE_TX_BATCH  64
  143 
  144 #define SFXGE_TXQ_LOCK_INIT(_txq, _ifname, _txq_index)                  \
  145         do {                                                            \
  146                 struct sfxge_txq  *__txq = (_txq);                      \
  147                                                                         \
  148                 snprintf((__txq)->lock_name,                            \
  149                          sizeof((__txq)->lock_name),                    \
  150                          "%s:txq%u", (_ifname), (_txq_index));          \
  151                 mtx_init(&(__txq)->lock, (__txq)->lock_name,            \
  152                          NULL, MTX_DEF);                                \
  153         } while (B_FALSE)
  154 #define SFXGE_TXQ_LOCK_DESTROY(_txq)                                    \
  155         mtx_destroy(&(_txq)->lock)
  156 #define SFXGE_TXQ_LOCK(_txq)                                            \
  157         mtx_lock(&(_txq)->lock)
  158 #define SFXGE_TXQ_TRYLOCK(_txq)                                         \
  159         mtx_trylock(&(_txq)->lock)
  160 #define SFXGE_TXQ_UNLOCK(_txq)                                          \
  161         mtx_unlock(&(_txq)->lock)
  162 #define SFXGE_TXQ_LOCK_ASSERT_OWNED(_txq)                               \
  163         mtx_assert(&(_txq)->lock, MA_OWNED)
  164 #define SFXGE_TXQ_LOCK_ASSERT_NOTOWNED(_txq)                            \
  165         mtx_assert(&(_txq)->lock, MA_NOTOWNED)
  166 
  167 
  168 struct sfxge_txq {
  169         /* The following fields should be written very rarely */
  170         struct sfxge_softc              *sc;
  171         enum sfxge_txq_state            init_state;
  172         enum sfxge_flush_state          flush_state;
  173         unsigned int                    tso_fw_assisted;
  174         enum sfxge_txq_type             type;
  175         unsigned int                    txq_index;
  176         unsigned int                    evq_index;
  177         efsys_mem_t                     mem;
  178         unsigned int                    buf_base_id;
  179         unsigned int                    entries;
  180         unsigned int                    ptr_mask;
  181         unsigned int                    max_pkt_desc;
  182 
  183         struct sfxge_tx_mapping         *stmp;  /* Packets in flight. */
  184         bus_dma_tag_t                   packet_dma_tag;
  185         efx_desc_t                      *pend_desc;
  186         efx_txq_t                       *common;
  187 
  188         efsys_mem_t                     *tsoh_buffer;
  189 
  190         char                            lock_name[SFXGE_LOCK_NAME_MAX];
  191 
  192         /* This field changes more often and is read regularly on both
  193          * the initiation and completion paths
  194          */
  195         int                             blocked __aligned(CACHE_LINE_SIZE);
  196 
  197         /* The following fields change more often, and are used mostly
  198          * on the initiation path
  199          */
  200         struct mtx                      lock __aligned(CACHE_LINE_SIZE);
  201         struct sfxge_tx_dpl             dpl;    /* Deferred packet list. */
  202         unsigned int                    n_pend_desc;
  203         unsigned int                    added;
  204         unsigned int                    reaped;
  205 
  206         /* The last VLAN TCI seen on the queue if FW-assisted tagging is
  207            used */
  208         uint16_t                        hw_vlan_tci;
  209 
  210         /* Statistics */
  211         unsigned long                   tso_bursts;
  212         unsigned long                   tso_packets;
  213         unsigned long                   tso_long_headers;
  214         unsigned long                   collapses;
  215         unsigned long                   drops;
  216         unsigned long                   get_overflow;
  217         unsigned long                   get_non_tcp_overflow;
  218         unsigned long                   put_overflow;
  219         unsigned long                   netdown_drops;
  220         unsigned long                   tso_pdrop_too_many;
  221         unsigned long                   tso_pdrop_no_rsrc;
  222 
  223         /* The following fields change more often, and are used mostly
  224          * on the completion path
  225          */
  226         unsigned int                    pending __aligned(CACHE_LINE_SIZE);
  227         unsigned int                    completed;
  228         struct sfxge_txq                *next;
  229 };
  230 
  231 struct sfxge_evq;
  232 
  233 extern uint64_t sfxge_tx_get_drops(struct sfxge_softc *sc);
  234 
  235 extern int sfxge_tx_init(struct sfxge_softc *sc);
  236 extern void sfxge_tx_fini(struct sfxge_softc *sc);
  237 extern int sfxge_tx_start(struct sfxge_softc *sc);
  238 extern void sfxge_tx_stop(struct sfxge_softc *sc);
  239 extern void sfxge_tx_qcomplete(struct sfxge_txq *txq, struct sfxge_evq *evq);
  240 extern void sfxge_tx_qflush_done(struct sfxge_txq *txq);
  241 extern void sfxge_if_qflush(struct ifnet *ifp);
  242 extern int sfxge_if_transmit(struct ifnet *ifp, struct mbuf *m);
  243 
  244 #endif

Cache object: 726b881410b0e7330a5ffd5663726bf1


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.