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

FreeBSD Manual Pages

  
 
  

home | help
POLLING(4)		 BSD Kernel Interfaces Manual		    POLLING(4)

NAME
     polling --	device polling support

SYNOPSIS
     options DEVICE_POLLING

DESCRIPTION
     Device polling (polling for brevity) refers to a technique	that lets the
     operating system periodically poll	devices, instead of relying on the de-
     vices to generate interrupts when they need attention.  This might	seem
     inefficient and counterintuitive, but when	done properly, polling gives
     more control to the operating system on when and how to handle devices,
     with a number of advantages in terms of system responsiveness and perfor-
     mance.

     In	particular, polling reduces the	overhead for context switches which is
     incurred when servicing interrupts, and gives more	control	on the sched-
     uling of the CPU between various tasks (user processes, software inter-
     rupts, device handling) which ultimately reduces the chances of livelock
     in	the system.

   Principles of Operation
     In	the normal, interrupt-based mode, devices generate an interrupt	when-
     ever they need attention.	This in	turn causes a context switch and the
     execution of an interrupt handler which performs whatever processing is
     needed by the device.  The	duration of the	interrupt handler is poten-
     tially unbounded unless the device	driver has been	programmed with	real-
     time concerns in mind (which is generally not the case for	FreeBSD	driv-
     ers).  Furthermore, under heavy traffic load, the system might be persis-
     tently processing interrupts without being	able to	complete other work,
     either in the kernel or in	userland.

     Device polling disables interrupts	by polling devices at appropriate
     times, i.e., on clock interrupts and within the idle loop.	 This way, the
     context switch overhead is	removed.  Furthermore, the operating system
     can control accurately how	much work to spend in handling device events,
     and thus prevent livelock by reserving some amount	of CPU to other	tasks.

     Enabling polling also changes the way software network interrupts are
     scheduled,	so there is never the risk of livelock because packets are not
     processed to completion.

   Enabling polling
     Currently only network interface drivers support the polling feature.  It
     is	turned on and off with help of ifconfig(8) command.

   MIB Variables
     The operation of polling is controlled by the following sysctl(8) MIB
     variables:

     kern.polling.user_frac
	     When polling is enabled, and provided that	there is some work to
	     do, up to this percent of the CPU cycles is reserved to userland
	     tasks, the	remaining fraction being available for polling pro-
	     cessing.  Default is 50.

     kern.polling.burst
	     Maximum number of packets grabbed from each network interface in
	     each timer	tick.  This number is dynamically adjusted by the ker-
	     nel, according to the programmed user_frac, burst_max, CPU	speed,
	     and system	load.

     kern.polling.each_burst
	     The burst above is	split into smaller chunks of this number of
	     packets, going round-robin	among all interfaces registered	for
	     polling.  This prevents the case that a large burst from a	single
	     interface can saturate the	IP interrupt queue
	     (net.inet.ip.intr_queue_maxlen).  Default is 5.

     kern.polling.burst_max
	     Upper bound for kern.polling.burst.  Note that when polling is
	     enabled, each interface can receive at most (HZ * burst_max)
	     packets per second	unless there are spare CPU cycles available
	     for polling in the	idle loop.  This number	should be tuned	to
	     match the expected	load (which can	be quite high with GigE
	     cards).  Default is 150 which is adequate for 100Mbit network and
	     HZ=1000.

     kern.polling.idle_poll
	     Controls if polling is enabled in the idle	loop.  There are no
	     reasons (other than power saving or bugs in the scheduler's han-
	     dling of idle priority kernel threads) to disable this.

     kern.polling.reg_frac
	     Controls how often	(every reg_frac	/ HZ seconds) the status reg-
	     isters of the device are checked for error	conditions and the
	     like.  Increasing this value reduces the load on the bus, but
	     also delays the error detection.  Default is 20.

     kern.polling.handlers
	     How many active devices have registered for polling.

     kern.polling.enable
	     Legacy MIB, that was used to enable or disable polling globally.
	     Currently if set to 1, polling is enabled on all capable inter-
	     faces.  If	set to 0, polling is disabled on all interfaces.

     kern.polling.short_ticks
     kern.polling.lost_polls
     kern.polling.pending_polls
     kern.polling.residual_burst
     kern.polling.phase
     kern.polling.suspect
     kern.polling.stalled
	     Debugging variables.

SUPPORTED DEVICES
     Device polling requires explicit modifications to the device drivers.  As
     of	this writing, the dc(4), em(4),	fwe(4),	fwip(4), fxp(4), ixgb(4),
     nge(4), re(4), rl(4), sf(4), sis(4), ste(4), vge(4), vr(4), and xl(4) de-
     vices are supported, with others in the works.  The modifications are
     rather straightforward, consisting	in the extraction of the inner part of
     the interrupt service routine and writing a callback function, *_poll(),
     which is invoked to probe the device for events and process them.	(See
     the conditionally compiled	sections of the	devices	mentioned above	for
     more details.)

     As	in the worst case the devices are only polled on clock interrupts, in
     order to reduce the latency in processing packets,	it is not advisable to
     decrease the frequency of the clock below 1000 Hz.

HISTORY
     Device polling first appeared in FreeBSD 4.6 and FreeBSD 5.0.

AUTHORS
     Device polling was	written	by Luigi Rizzo <luigi@iet.unipi.it>.

BSD				October	1, 2005				   BSD

NAME | SYNOPSIS | DESCRIPTION | SUPPORTED DEVICES | HISTORY | AUTHORS

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

home | help