home | help
IFLIB(4)		     Kernel Interfaces Manual			IFLIB(4)

NAME
     iflib -- Network Interface Driver Framework

SYNOPSIS
     device pci
     device iflib

DESCRIPTION
     iflib  is a framework for network interface drivers for FreeBSD.  It is de-
     signed to remove a large amount of the boilerplate that is often needed for
     modern network interface devices, allowing driver authors to focus  on  the
     specific  code  needed for their hardware.  This allows for a shared set of
     sysctl(8) names, rather than each driver naming them individually.

SYSCTL VARIABLES
     These  variables  must  be  set  before  loading  the  driver,  either  via
     loader.conf(5)  or  through  the  use of kenv(1).	They are all prefixed by
     dev.X.Y.iflib. where X is the driver name, and Y is the instance number.

     override_nrxds
	     Override the number of RX descriptors for each queue.  The value is
	     a comma separated list of positive integers.  Some drivers only use
	     a single value, but others may use more.	These  numbers	must  be
	     powers  of two, and zero means to use the default.  Individual dri-
	     vers may have additional restrictions  on	allowable  values.   De-
	     faults to all zeros.

     override_ntxds
	     Override the number of TX descriptors for each queue.  The value is
	     a comma separated list of positive integers.  Some drivers only use
	     a	single	value,	but  others may use more.  These numbers must be
	     powers of two, and zero means to use the default.	Individual  dri-
	     vers  may	have  additional  restrictions on allowable values.  De-
	     faults to all zeros.

     override_qs_enable
	     When set, allows the number of transmit and receive  queues  to  be
	     different.   If not set, the lower of the number of TX or RX queues
	     will be used for both.

     override_nrxqs
	     Set the number of RX queues.  If zero, the number of RX  queues  is
	     derived  from  the  number  of cores on the socket connected to the
	     controller.  Defaults to 0.

     override_ntxqs
	     Set the number of TX queues.  If zero, the number of TX  queues  is
	     derived  from  the  number  of cores on the socket connected to the
	     controller.

     disable_msix
	     Disables MSI-X interrupts for the device.

     core_offset
	     Specifies a starting core offset to assign queues to.  If the value
	     is unspecified or 65535, cores  are  assigned  sequentially  across
	     controllers.

     separate_txrx
	     Requests  that RX and TX queues not be paired on the same core.  If
	     this is zero or not set, an RX and TX queue pair will  be	assigned
	     to each core.  When set to a non-zero value, TX queues are assigned
	     to cores following the last RX queue.

     These sysctl(8) variables can be changed at any time:

     tx_abdicate
	     Controls how the transmit ring is serviced.  If set to zero, when a
	     frame  is submitted to the transmission ring, the same task that is
	     submitting it will service the ring unless there's already  a  task
	     servicing the TX ring.  This ensures that whenever there is a pend-
	     ing  transmission,  the  transmit ring is being serviced.	This re-
	     sults in higher transmit throughput.  If set to a	non-zero  value,
	     task  returns  immediately  and  the transmit ring is serviced by a
	     different task.  This returns control to the caller faster and  un-
	     der high receive load, may result in fewer dropped RX frames.

     rx_budget
	     Sets  the	maximum number of frames to be received at a time.  Zero
	     (the default) indicates the default (currently 16) should be used.

     There are also some global sysctls which can change behaviour for all  dri-
     vers, and may be changed at any time.

     net.iflib.min_tx_latency
	     If this is set to a non-zero value, iflib will avoid any attempt to
	     combine  multiple	transmits, and notify the hardware as quickly as
	     possible of new descriptors.  This will lower the maximum	through-
	     put, but will also lower transmit latency.

     net.iflib.no_tx_batch
	     Some  NICs  allow	processing  completed  transmit  descriptors  in
	     batches.  Doing so usually increases the transmit throughput by re-
	     ducing the number of transmit interrupts.	Setting this to  a  non-
	     zero value will disable the use of this feature.

     These sysctl(8) variables are read-only:

     driver_version
	     A string indicating the internal version of the driver.

     There are a number of queue state sysctl(8) variables as well:

     txqZ    The  following are repeated for each transmit queue, where Z is the
	     transmit queue instance number:

	     r_abdications
		     Number of consumer abdications in	the  MP  ring  for  this
		     queue.   An abdication occurs on every ring submission when
		     tx_abdicate is true.

	     r_restarts
		     Number of consumer restarts in the MP ring for this  queue.
		     A	restart occurs when an attempt to drain a non-empty ring
		     fails, and the ring is already in the STALLED state.

	     r_stalls
		     Number of consumer stalls in the MP ring for this queue.  A
		     stall occurs when an attempt  to  drain  a  non-empty  ring
		     fails.

	     r_starts
		     Number  of  normal  consumer starts in the MP ring for this
		     queue.  A start occurs when the MP  ring  transitions  from
		     IDLE to BUSY.

	     r_drops
		     Number  of drops in the MP ring for this queue.  A drop oc-
		     curs when there is an attempt to add an entry to an MP ring
		     with no available space.

	     r_enqueues
		     Number of entries which have been enqueued to the	MP  ring
		     for this queue.

	     ring_state
		     MP (soft) ring state.  This privides a snapshot of the cur-
		     rent  MP  ring  state, including the producer head and tail
		     indexes, the consumer index, and the state.  The  state  is
		     one of "IDLE", "BUSY", "STALLED", or "ABDICATED".

	     txq_cleaned
		     The  number  of  transmit	descriptors  which have been re-
		     claimed.  Total cleaned.

	     txq_processed
		     The  number  of  transmit	descriptors  which   have   been
		     processed, but may not yet have been reclaimed.

	     txq_in_use
		     Descriptors  which  have  been added to the transmit queue,
		     but have not yet been cleaned.   This  value  will  include
		     both untransmitted descriptors as well as descriptors which
		     have been processed.

	     txq_cidx_processed
		     The transmit queue consumer index of the next descriptor to
		     process.

	     txq_cidx
		     The  transmit queue consumer index of the oldest descriptor
		     to reclaim.

	     txq_pidx
		     The transmit queue producer index where the next descriptor
		     to transmit will be inserted.

	     no_tx_dma_setup
		     Number of times DMA mapping a transmit mbuf failed for rea-
		     sons other than EFBIG.

	     txd_encap_efbig
		     Number of times DMA mapping a transmit mbuf failed  due  to
		     requiring too many segments.

	     tx_map_failed
		     Number  of times DMA mapping a transmit mbuf failed for any
		     reason (sum of no_tx_dma_setup and txd_encap_efbig)

	     no_desc_avail
		     Number of times a	descriptor  couldn't  be  added  to  the
		     transmit ring because the transmit ring was full.

	     mbuf_defrag_failed
		     Number  of  times both m_collapse(9) and m_defrag(9) failed
		     after an EFBIG error result from  DMA  mapping  a	transmit
		     mbuf.

	     m_pullups
		     Number  of times m_pullup(9) was called attempting to parse
		     a header.

	     mbuf_defrag
		     Number of times m_defrag(9) was called.

     rxqZ    The following are repeated for each receive queue, where Z  is  the
	     receive queue instance number:

	     rxq_fl0.credits
		     Credits currently available in the receive ring.

	     rxq_fl0.cidx
		     Current receive ring consumer index.

	     rxq_fl0.pidx
		     Current receive ring producer index.

     Additional  OIDs  useful  for driver and iflib development are exposed when
     the INVARIANTS and/or WITNESS options are enabled in the kernel.

SEE ALSO
     iflib(9)

HISTORY
     This framework was introduced in FreeBSD 11.0.

FreeBSD 12.2		       September 27, 2018			IFLIB(4)

home | help