Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

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.

     simple_tx
	     When set to one, iflib uses a simple transmit routine with no queu-
	     ing  at  all.  By default, iflib uses a highly optimized, lockless,
	     transmit queue called mp_ring.  This performs well when  there  are
	     more  CPU	cores  than  NIC queues and prevents lock contention for
	     transmit resources.  Unfortunately, mp_ring incurs  unneeded  over-
	     heads on workloads where resource contention is not a problem (well
	     behaved  applications on systems where there are as many NIC queues
	     as CPU cores).  Note that when this  is  enabled,	the  tx_abdicate
	     sysctl is no longer applicable and is ignored.  Defaults to zero.

     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.

     tx_reclaim_thresh
	     Controls  the threshold in packets before iflib will ask the driver
	     how many transmitted packets can  be  reclaimed.	Determining  how
	     many  many  packets  can be reclaimed can be expensive on some dri-
	     vers.

     tx_reclaim_ticks
	     Controls the time in ticks before iflib will  ask	the  driver  how
	     many  transmitted	packets  can be reclaimed.  Determining how many
	     many packets can be reclaimed can be expensive on some drivers.

     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 provides 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 ports 15.quarterly	 August 20, 2025			IFLIB(4)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=iflib&sektion=4&manpath=FreeBSD+15.1-RELEASE+and+Ports.quarterly>

home | help