From 47bdb292724c50decd90471615b2d65c1eee7374 Mon Sep 17 00:00:00 2001 From: Manuel Traut Date: Wed, 30 Jan 2019 22:51:17 +0100 Subject: add klist slides very basic version of slides for kernel lists Signed-off-by: Manuel Traut --- kernel-devel/Kconfig | 1 + kernel-devel/klist/Kconfig | 5 ++ kernel-devel/klist/Makefile | 1 + kernel-devel/klist/pres_klist_en.tex | 93 ++++++++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 kernel-devel/klist/Kconfig create mode 100644 kernel-devel/klist/Makefile create mode 100644 kernel-devel/klist/pres_klist_en.tex (limited to 'kernel-devel') diff --git a/kernel-devel/Kconfig b/kernel-devel/Kconfig index 62d0fe9..513fe1c 100644 --- a/kernel-devel/Kconfig +++ b/kernel-devel/Kconfig @@ -15,4 +15,5 @@ if KERNEL source "kernel-devel/uio-driver/Kconfig" source "kernel-devel/kernel-perf/Kconfig" source "kernel-devel/dts/Kconfig" + source "kernel-devel/klist/Kconfig" endif diff --git a/kernel-devel/klist/Kconfig b/kernel-devel/klist/Kconfig new file mode 100644 index 0000000..4758e43 --- /dev/null +++ b/kernel-devel/klist/Kconfig @@ -0,0 +1,5 @@ +config KERNEL_KLIST + bool "Kernel klist papers" + default y + help + Papers about klist usage diff --git a/kernel-devel/klist/Makefile b/kernel-devel/klist/Makefile new file mode 100644 index 0000000..889e634 --- /dev/null +++ b/kernel-devel/klist/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_KERNEL_KLIST) += pres_klist_en.pdf diff --git a/kernel-devel/klist/pres_klist_en.tex b/kernel-devel/klist/pres_klist_en.tex new file mode 100644 index 0000000..29091cb --- /dev/null +++ b/kernel-devel/klist/pres_klist_en.tex @@ -0,0 +1,93 @@ +\input{configpres} + +\title{klist} +\maketitle + +\subsection{klist} + +\begin{frame} +\frametitle{Overview} +\tableofcontents +\end{frame} + +\subsubsection{What is it?} +\begin{frame} +\frametitle{klist functionality} +\begin{itemize} +\item Type oblivious - use with any data structure you have in mind +\item Doubly linked list +\item Iterations, etc. are easily readable +\end{itemize} +\end{frame} + +\subsubsection{Usage} +\begin{frame}[fragile] +\frametitle{Initialization} +\begin{lstlisting} +struct my_elem { + int member1; + long member2; + struct list_head node; +}; + +/* the following is the same as + * struct list_head mylist; + * INIT_LIST_HEAD(&mylist.list); + */ +LIST_HEAD(mylist); +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Add elements} +\begin{lstlisting} +struct my_elem *e; +while( .. ) { + e = kzalloc(sizeof(*e), GFP_KERNEL); + e->member1 = 3; + + /* add element to the beginning of the list */ + list_add(&e->node, &mylist); + + /* to add element to the tail of the list use + * list_add_tail(&e->node, &mylist); + */ +} +\end{lstlisting} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Iterate over list} +\begin{lstlisting} +struct my_elem *iterator, tmp; + +/* last argument is name of struct list_head inside mylist */ +list_for_each_entry(iterator, &mylist, node) { + iterator->member1 = 0x08; + iterator->member2 = 0x15; +} +\end{lstlisting} +\pause +\begin{lstlisting} +list_for_each_entry_reverse(iterator, &mylist, node) + iterator->member1 = 0x08; +\end{lstlisting} +\pause +\begin{lstlisting} +/* clear list and free elements + * _safe allows modificatio of the list during iteration + */ +list_for_each_entry_safe(iterator, tmp, &mylist, node) { + list_del(&iterator->node); + kfree(iterator); +} +\end{lstlisting} +\end{frame} + +\begin{frame} +\frametitle{There are a lot of helpers!} +see: include/linux/list.h +\end{frame} + +\input{tailpres} -- cgit v1.2.3