summaryrefslogtreecommitdiffstats
path: root/share/man/man4/polling.4
diff options
context:
space:
mode:
Diffstat (limited to 'share/man/man4/polling.4')
-rw-r--r--share/man/man4/polling.4222
1 files changed, 222 insertions, 0 deletions
diff --git a/share/man/man4/polling.4 b/share/man/man4/polling.4
new file mode 100644
index 0000000..6abc37c
--- /dev/null
+++ b/share/man/man4/polling.4
@@ -0,0 +1,222 @@
+.\" Copyright (c) 2002 Luigi Rizzo
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd April 6, 2007
+.Dt POLLING 4
+.Os
+.Sh NAME
+.Nm polling
+.Nd device polling support
+.Sh SYNOPSIS
+.Cd "options DEVICE_POLLING"
+.Sh DESCRIPTION
+Device polling
+.Nm (
+for brevity) refers to a technique that
+lets the operating system periodically poll devices, instead of
+relying on the devices to generate interrupts when they need attention.
+This might seem inefficient and counterintuitive, but when done
+properly,
+.Nm
+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 performance.
+.Pp
+In particular,
+.Nm
+reduces the overhead for context
+switches which is incurred when servicing interrupts, and
+gives more control on the scheduling of the CPU between various
+tasks (user processes, software interrupts, device handling)
+which ultimately reduces the chances of livelock in the system.
+.Ss Principles of Operation
+In the normal, interrupt-based mode, devices generate an interrupt
+whenever 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 potentially unbounded
+unless the device driver has been programmed with real-time
+concerns in mind (which is generally not the case for
+.Fx
+drivers).
+Furthermore, under heavy traffic load, the system might be
+persistently processing interrupts without being able to
+complete other work, either in the kernel or in userland.
+.Pp
+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.
+.Pp
+Enabling
+.Nm
+also changes the way software network interrupts
+are scheduled, so there is never the risk of livelock because
+packets are not processed to completion.
+.Ss Enabling polling
+Currently only network interface drivers support the
+.Nm
+feature.
+It is turned on and off with help of
+.Xr ifconfig 8
+command.
+.Pp
+The historic
+.Va kern.polling.enable ,
+which enabled polling for all interfaces, can be replaced with the following
+code:
+.Bd -literal
+for i in `ifconfig -l` ;
+ do ifconfig $i polling; # use -polling to disable
+done
+.Ed
+.Ss MIB Variables
+The operation of
+.Nm
+is controlled by the following
+.Xr sysctl 8
+MIB variables:
+.Pp
+.Bl -tag -width indent -compact
+.It Va kern.polling.user_frac
+When
+.Nm
+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
+.Nm
+processing.
+Default is 50.
+.Pp
+.It Va kern.polling.burst
+Maximum number of packets grabbed from each network interface in
+each timer tick.
+This number is dynamically adjusted by the kernel,
+according to the programmed
+.Va user_frac , burst_max ,
+CPU speed, and system load.
+.Pp
+.It Va 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
+.Nm .
+This prevents the case that a large burst from a single interface
+can saturate the IP interrupt queue
+.Pq Va net.inet.ip.intr_queue_maxlen .
+Default is 5.
+.Pp
+.It Va kern.polling.burst_max
+Upper bound for
+.Va kern.polling.burst .
+Note that when
+.Nm
+is enabled, each interface can receive at most
+.Pq Va HZ No * Va burst_max
+packets per second unless there are spare CPU cycles available for
+.Nm
+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.
+.Pp
+.It Va kern.polling.idle_poll
+Controls if
+.Nm
+is enabled in the idle loop.
+There are no reasons (other than power saving or bugs in the scheduler's
+handling of idle priority kernel threads) to disable this.
+.Pp
+.It Va kern.polling.reg_frac
+Controls how often (every
+.Va reg_frac No / Va HZ
+seconds) the status registers 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.
+.Pp
+.It Va kern.polling.handlers
+How many active devices have registered for
+.Nm .
+.Pp
+.It Va kern.polling.short_ticks
+.It Va kern.polling.lost_polls
+.It Va kern.polling.pending_polls
+.It Va kern.polling.residual_burst
+.It Va kern.polling.phase
+.It Va kern.polling.suspect
+.It Va kern.polling.stalled
+Debugging variables.
+.El
+.Sh SUPPORTED DEVICES
+Device polling requires explicit modifications to the device drivers.
+As of this writing, the
+.Xr bge 4 ,
+.Xr dc 4 ,
+.Xr em 4 ,
+.Xr fwe 4 ,
+.Xr fwip 4 ,
+.Xr fxp 4 ,
+.Xr igb 4 ,
+.Xr ixgb 4 ,
+.Xr nfe 4 ,
+.Xr nge 4 ,
+.Xr re 4 ,
+.Xr rl 4 ,
+.Xr sf 4 ,
+.Xr sis 4 ,
+.Xr ste 4 ,
+.Xr stge 4 ,
+.Xr vge 4 ,
+.Xr vr 4 ,
+and
+.Xr xl 4
+devices 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,
+.Fn *_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.)
+.Pp
+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.
+.Sh HISTORY
+Device polling first appeared in
+.Fx 4.6
+and
+.Fx 5.0 .
+.Sh AUTHORS
+Device polling was written by
+.An Luigi Rizzo Aq luigi@iet.unipi.it .
OpenPOWER on IntegriCloud