From owner-svn-src-user@FreeBSD.ORG Tue Feb 25 14:47:35 2014 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 907E138B; Tue, 25 Feb 2014 14:47:35 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 7BEB71160; Tue, 25 Feb 2014 14:47:35 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.8/8.14.8) with ESMTP id s1PElZ7f054975; Tue, 25 Feb 2014 14:47:35 GMT (envelope-from glebius@svn.freebsd.org) Received: (from glebius@localhost) by svn.freebsd.org (8.14.8/8.14.8/Submit) id s1PElZLJ054973; Tue, 25 Feb 2014 14:47:35 GMT (envelope-from glebius@svn.freebsd.org) Message-Id: <201402251447.s1PElZLJ054973@svn.freebsd.org> From: Gleb Smirnoff Date: Tue, 25 Feb 2014 14:47:35 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r262481 - user/glebius/course/09.mbufs X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 25 Feb 2014 14:47:35 -0000 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}