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
       designed	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  num-
       ber.

       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  drivers may have additional restrictions
	       on allowable values.  Defaults 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 drivers may	have  additional  restrictions
	       on allowable values.  Defaults 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 as-
	       signed 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
	       queuing 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  in-
	       curs  unneeded overheads	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	 when-
	       ever  there is a	pending	transmission, the transmit ring	is be-
	       ing serviced.  This results 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 under	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
       drivers,	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 at-
	       tempt to	combine	multiple transmits, and	notify the hardware as
	       quickly as possible of new descriptors.	This  will  lower  the
	       maximum throughput, 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
	       reducing	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  transi-
		       tions from IDLE to BUSY.

	       r_drops
		       Number  of drops	in the MP ring for this	queue.	A drop
		       occurs 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
		       current	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	"ABDI-
		       CATED".

	       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  de-
		       scriptors which have been processed.

	       txq_cidx_processed
		       The  transmit queue consumer index of the next descrip-
		       tor to process.

	       txq_cidx
		       The transmit queue consumer index  of  the  oldest  de-
		       scriptor	to reclaim.

	       txq_pidx
		       The  transmit  queue  producer index where the next de-
		       scriptor	to transmit will be inserted.

	       no_tx_dma_setup
		       Number of times DMA mapping a transmit mbuf failed  for
		       reasons 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	15.0			August 20, 2025			      IFLIB(4)

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

home | help