svn commit: r262481 - user/glebius/course/09.mbufs
Gleb Smirnoff
glebius at FreeBSD.org
Tue Feb 25 14:47:35 UTC 2014
Author: glebius
Date: Tue Feb 25 14:47:34 2014
New Revision: 262481
URL: http://svnweb.freebsd.org/changeset/base/262481
Log:
Start lection on mbufs.
Added:
user/glebius/course/09.mbufs/
user/glebius/course/09.mbufs/Makefile (contents, props changed)
user/glebius/course/09.mbufs/lection.tex
Added: user/glebius/course/09.mbufs/Makefile
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ user/glebius/course/09.mbufs/Makefile Tue Feb 25 14:47:34 2014 (r262481)
@@ -0,0 +1,16 @@
+NAME?= lection
+
+TMP= $(NAME).aux $(NAME).log $(NAME).nav $(NAME).out $(NAME).snm \
+ $(NAME).toc $(NAME).vrb
+
+.MAIN: $(NAME).pdf
+
+.SUFFIXES: .pdf .tex
+.tex.pdf:
+ pdflatex -file-line-error -halt-on-error ${.IMPSRC}
+
+clean:
+ rm -f -- $(TMP) texput.log
+
+cleanall: clean
+ rm -f $(NAME).pdf
Added: user/glebius/course/09.mbufs/lection.tex
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ user/glebius/course/09.mbufs/lection.tex Tue Feb 25 14:47:34 2014 (r262481)
@@ -0,0 +1,285 @@
+\documentclass{beamer}
+
+\usepackage[utf8]{inputenc}
+\usepackage[russian]{babel}
+\usepackage{tikz}
+\usepackage{adjustbox}
+\usepackage{url}
+\usepackage{array}
+\usepackage{xcolor}
+\usepackage{listings}
+\usepackage{verbatim}
+\usepackage{ifthen}
+
+\usetikzlibrary{chains}
+\usetikzlibrary{scopes}
+\usetikzlibrary{positioning}
+\usetikzlibrary{shapes}
+\usetikzlibrary{patterns}
+
+\input{../course.tex}
+
+\title{Network Input/Output: mbufs. Mbuf manipulations. Netgraph.}
+
+\begin{document}
+
+\begin{frame}
+\titlepage
+\end{frame}
+
+\begin{frame}
+\frametitle{Basic view of network I/O}
+\begin{figure}
+\begin{tikzpicture}[thick]
+ \node [name=sockbuf, draw, rounded corners, minimum width=.4\paperwidth,
+ minimum height=2em]
+ { socket send/receive buffers };
+ \node [name=driver, draw, rounded corners, minimum width=.4\paperwidth,
+ minimum height=2em, below=.3\paperheight of sockbuf]
+ { NIC driver RX/TX rings };
+ \node [name=write, above left=of sockbuf.center] { write(2) };
+ \node [name=read, above right=of sockbuf.center] { read(2) };
+
+ \node [name=uk1, above left=2mm and .2\paperwidth of sockbuf] {};
+ \node [name=uk2, above right=2mm and .2\paperwidth of sockbuf] {};
+ \draw (uk1) --
+ node [above, pos=.9] { userland }
+ node [below, pos=.9] { kernel } (uk2);
+
+ \draw [->] (write) -- (write |- sockbuf.north);
+ \draw [<-] (read) -- (read |- sockbuf.north);
+
+ \node (mark1) at (node cs:name=sockbuf, angle=195) {};
+ \node (mark2) at (node cs:name=sockbuf, angle=345) {};
+ \draw [->] (mark1.center) -- (mark1 |- driver.north);
+ \draw [<-] (mark2.center) -- (mark2 |- driver.north);
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+
+\begin{frame}
+\frametitle{I/O metadata: protocol headers}
+ \begin{itemize}
+ \item{Unlike disk I/O, metadata is embedded into data}
+ \item{Metadata variates at different levels of I/O:
+ \begin{itemize}
+ \item{Socket buffers are free of metadata}
+ \item{NIC driver rings has protocol headers of all network levels}
+ \end{itemize}
+ }
+ \end{itemize}
+\end{frame}
+
+
+\begin{frame}
+\frametitle{I/O sizing}
+ \begin{itemize}
+ \item {Size of protocol headers is unpredictable,
+ variates around 10 - 100 bytes}
+ \item {Payload size:
+ \begin{itemize}
+ \item{TCP acknowledgement only packet has 0 sized payload}
+ \item{Typical Internet MTU 1500 bytes (minus protocol headers)}
+ \item{There is also Jumbo MTU of 9000 bytes}
+ \end{itemize}
+ }
+ \item {Typical memory page size is 4096 bytes}
+ \item {Driver alignment restrictions}
+ \end{itemize}
+\end{frame}
+
+
+\begin{frame}
+\frametitle{Demands for network I/O buffer}
+\begin{itemize}
+ \item{Variable memory size}
+ \item{Prependable and extendable}
+ \item{Queueable}
+\end{itemize}
+\end{frame}
+
+
+\begin{frame}
+\frametitle{The mbuf}
+\begin{figure}
+\begin{tikzpicture}[
+ start chain=going right, node distance=0mm,
+ mpart/.style= {
+ on chain,
+ minimum height=3em,
+ draw, thick,
+ align=center
+ }
+]
+\onslide <1-> {
+ \node [mpart, name=mhdr] { m\_hdr };
+ \node [mpart, name=empty1, text width=.05\paperwidth] { };
+ \node [mpart, name=proto1, pattern=checkerboard light gray, text width=8ex]
+ { protocol headers };
+ \node [mpart, name=payload, fill=gray, shading=axis, shading angle=45,
+ text width=.10\paperwidth]
+ { payload };
+ \node [mpart, name=proto2, pattern=checkerboard light gray, text width=8ex]
+ { protocol footers };
+ \node [mpart, name=empty2, text width=.15\paperwidth] { };
+}
+\onslide <2-> {
+ \node [name=struct, below right=2em and 2em of mhdr.south east,
+ anchor=north east,
+ struct, rectangle split parts=6] {
+ \textbf{struct m\_hdr}
+ \nodepart{two}char *m\_data
+ \nodepart{three}int32\_t m\_len
+ \nodepart{four}uint32\_t m\_flags
+ \nodepart{five}struct mbuf *m\_next
+ \nodepart{six}struct mbuf *m\_nextpkt
+ };
+ \draw (mhdr.south east) -- (struct.north east);
+ \draw (mhdr.south west) -- (struct.north west);
+ \draw [->, thick] (struct.two east) to [out=0, in=270] (proto1.south west);
+
+ \node [name=mark1, below=2mm of proto1.south west] {};
+ \node [name=mark2, below=2mm of proto2.south east] {};
+ \draw [<->] (mark1.center) -- node (mark3) {} (mark2.center);
+ \draw [->, thick, rounded corners] (struct.three east) -| (mark3.center);
+
+ \node [name=mark4, above=2mm of mhdr.north west] {};
+ \node [name=mark5, above=2mm of empty2.north east] {};
+ \draw [<->] (mark4.center) --
+ node [above] { MSIZE (256 bytes) } (mark5.center);
+}
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+
+\begin{frame}
+\frametitle{Mbuf chain}
+\begin{figure}
+\begin{tikzpicture}[
+ every node/.style= {
+ node distance=0mm,
+ minimum height=3em,
+ thick, align=center
+ }
+]
+{ [start chain=1 going right]
+ \node [draw, on chain=1, name=mhdr] { m\_hdr };
+ \node [draw, on chain=1, name=payload,
+ fill=gray, shading=axis, shading angle=45,
+ minimum width=.2\paperwidth]
+ { payload };
+ \node [draw, on chain=1, name=empty2, minimum width=.4\paperwidth] { };
+}
+{ [start chain=2 going right]
+ \node [name=mhdr2, below=2 of mhdr, draw, on chain=2] { m\_hdr };
+ \node [draw, on chain=2, name=payload,
+ fill=gray, shading=axis, shading angle=45,
+ minimum width=.6\paperwidth]
+ { payload continues};
+}
+ \draw [->, thick] (mhdr.south) --
+ node [above, rotate=90, minimum height=1em] {m\_next} (mhdr2.north);
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+
+\begin{frame}
+\frametitle{The packet header mbuf}
+\begin{figure}
+\begin{tikzpicture}[
+ start chain=going right, node distance=0mm,
+ mpart/.style= {
+ on chain,
+ minimum height=3em,
+ draw, thick,
+ align=center
+ }
+]
+ \node [mpart, name=mhdr] { m\_hdr };
+ \node [mpart, name=pkthdr] { pkthdr };
+ \node [mpart, name=empty, text width=.3\paperwidth] { };
+
+ \node [name=mhdrstr, below left=1em and 1em of mhdr.south east,
+ anchor=north east,
+ struct, rectangle split parts=3] {
+ \textbf{struct m\_hdr}
+ \nodepart{two}char *m\_data
+ \nodepart{three}uint32\_t m\_flags
+ };
+ \node [right=of mhdrstr.three east, anchor=west, color=red] { \& M\_PKTHDR };
+ \draw (mhdr.south west) -- (mhdrstr.north west);
+ \draw (mhdr.south east) -- (mhdrstr.north east);
+
+ \node [name=pkthdrstr, below=.2\paperwidth of empty.south east,
+ anchor=north east, struct, rectangle split parts=4] {
+ \textbf{struct pkthdr}
+ \nodepart{two}struct ifnet *rcvif
+ \nodepart{three}int32\_t len
+ \nodepart{four}SLIST\_HEAD(, m\_tag) tags
+ };
+ \draw (pkthdr.south west) -- (pkthdrstr.north west);
+ \draw (pkthdr.south east) -- (pkthdrstr.north east);
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+
+\begin{frame}
+\frametitle{The M\_EXT mbuf and mbuf cluster}
+\begin{figure}
+\begin{tikzpicture}[
+ start chain=going right, node distance=0mm,
+ mpart/.style= {
+ on chain,
+ minimum height=3em,
+ draw, thick,
+ align=center
+ }
+]
+\onslide <1-> {
+ \node [mpart, name=mhdr] { m\_hdr };
+ \node [mpart, name=pkthdr] { \textit{pkthdr} };
+ \node [mpart, name=mext] { m\_ext };
+ \node [mpart, name=empty, text width=.3\paperwidth] { };
+
+ \node [name=mhdrstr, below left=1em and 1em of mhdr.south east,
+ anchor=north east,
+ struct, rectangle split parts=3] {
+ \textbf{struct m\_hdr}
+ \nodepart{two}char *m\_data
+ \nodepart{three}uint32\_t m\_flags
+ };
+ \node [right=of mhdrstr.three east, anchor=west, color=red] { \& M\_EXT };
+ \draw (mhdr.south west) -- (mhdrstr.north west);
+ \draw (mhdr.south east) -- (mhdrstr.north east);
+}
+\onslide <2-> {
+ \node [name=mextstr, below=1em of empty.south east, anchor=north east,
+ struct, rectangle split parts=5] {
+ \textbf{struct m\_ext}
+ \nodepart{two}char *ext\_buf
+ \nodepart{three}uint32\_t ext\_size
+ \nodepart{four}uint32\_t ext\_flags
+ \nodepart{five}int (*ext\_free)(...)
+ };
+ \draw (mext.south west) -- (mextstr.north west);
+ \draw (mext.south east) -- (mextstr.north east);
+
+ \node [name=cluster, draw, below=1em of mextstr.south east, anchor=north east,
+ minimum height=3em, text width=.8\paperwidth, align=center]
+ { \textit{cluster} (2048 bytes) };
+
+ \draw [->,thick] (mextstr.two west)
+ .. controls +(-3,-3) and +(0,2) .. (cluster.north west);
+ \draw [->,thick] (mhdrstr.two east)
+ .. controls +(2,-2) and +(0,2) .. (node cs:name=cluster, angle=170);
+}
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+
+\end{document}
More information about the svn-src-user
mailing list