-
Notifications
You must be signed in to change notification settings - Fork 0
/
defence.tex
1247 lines (1097 loc) · 35.7 KB
/
defence.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
\documentclass[xcolor=dvipsnames]{beamer}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage{manfnt}
\usepackage{wasysym}
\usepackage{listings}
\usepackage{graphicx}
\usepackage{url}
\usepackage{ulem}
\usepackage{marvosym}
\usepackage{skull}
\usepackage{proof}
\usepackage{array}
\setbeamertemplate{navigation symbols}{}
\title[Landslide]{{\bf Landslide: Systematic Dynamic Race Detection in Kernel-space}}
\subtitle[]{ {\em showing that Pebbles are less stable than you thought since 2011.}}
\author[Ben Blum]{Ben Blum \texttt{(bblum@andrew.cmu.edu)}}
\institute[CMU]{Carnegie Mellon University}
\date[]{2012, May 10}
\setbeamertemplate{footline}{\hspace*{.5cm}\scriptsize{\insertauthor\hspace*{50pt} \hfill\insertframenumber\hspace*{.5cm}}}
\usecolortheme{seahorse}
\usecolortheme{rose}
\useoutertheme{infolines}
\usecolortheme[named=RoyalBlue]{structure}
\newcommand\noob{\mathsf{noob}}
\newcommand\gibs{\mathsf{gibs}}
\newcommand\dps{\mathsf{dps}}
\newcommand\squig\rightsquigarrow
\newcommand\Coloneqq{\mathrel{\mathop{::}}=}
\newcommand\dmg{\text{\Laserbeam}}
\newcommand\delter\delta
\newcommand\alpher\alpha
\newcommand\defnor{\text{ }|\text{ }}
\newcommand\pimp{\mathop{\supset}}
\newcommand\pand{\mathop{\wedge}}
\newcommand\por{\mathop{\vee}}
\newcommand\ptrue{\top}
\newcommand\pfalse{\bot}
\begin{document}
\normalem
\begin{frame}
\titlepage
\end{frame}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand\linegap{\vspace{0.2in}}
\newcommand\breakslide[1]{\begin{frame}{} \begin{center} #1 \end{center} \end{frame}}
\newcommand\related[1]{\textsuperscript{\em [#1]}}
\begin{frame}{Outline}
\textbf{Motivation: Concurrency debugging}
\begin{itemize}
\item Systematic testing versus stress testing
\item Challenges of kernel-space
\end{itemize}
\linegap
{\bf Tool: Landslide}
\begin{itemize}
\item Design and interface
\item Addressing challenges
\end{itemize}
\linegap
{\bf Evaluation: Finding Races}
\begin{itemize}
\item Student user study
\item Case study
\end{itemize}
\linegap
{\bf Future Work and Conclusion}
\end{frame}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Motivation}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Race Conditions and the Finding Thereof}
\begin{frame}[fragile]{Case Study}
\begin{center}
\begin{verbatim}
int thread_fork()
{
thread_t *child = spawn_new_thread();
add_to_runqueue(child);
return child->tid;
}
\end{verbatim}
\end{center}
\begin{itemize}
\item On exit, child's state is freed
\item Forking thread does use-after-free
\item Might return garbage instead of thread ID
\end{itemize}
\end{frame}
\begin{frame}{Testing Techniques} % slide: sys ex vs stress testing
\textbf{Stress Testing:} Common testing approach
\begin{itemize}
\item Attempting to exercise as many interleavings as possible
\item Exposes race conditions at random
\begin{itemize}
\item ``If a preemption occurs at {\em just the right time}\dots''
\end{itemize}
\item Cryptic panic messages or machine reboots
\end{itemize}
\linegap
{\bf Systematic Testing} \related{Musuvathi '08}
\begin{itemize}
\item Make educated guesses about when to preempt
\item Run {\em every single} interleaving
\item Provide better debugging information, reproducibility
\end{itemize}
\end{frame}
\begin{frame}{Execution Tree} % slide: decision tree
\begin{center}
\includegraphics[width=\textwidth]{tree.png}
\end{center}
\end{frame}
\begin{frame}{Finding Races in Kernel-space} % slide: 15-410 6-week project why we need it in kernels
\textbf{15-410:} Undergraduate Operating Systems
\begin{itemize}
\item Project 3: students write a kernel in 6 weeks.
\item ``Pebbles'' is a UNIX-like, preemptible kernel specification.
\end{itemize}
\linegap
Previous work in kernel-space has not used systematic testing.
%\begin{itemize}
% \item Data race detection\related{Erickson '10}
% \item Failure resiliency\related{Kadav '09}
%\end{itemize}
\end{frame}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Challenges of Kernel-space}
\breakslide{Why is this environment different from all other environments?}
\begin{frame}{Causes of Concurrency} % slide: causes of concurrency, thread scheduling
\textbf{Kernels contain their own concurrency implementation.}
\linegap
Context switching
\begin{itemize}
\item Non-deterministic timer-driven thread scheduling
\end{itemize}
Runqueue tracking
\begin{itemize}
\item Which threads are runnable?
\end{itemize}
Thread lifecycle tracking
\begin{itemize}
\item When are threads created/destroyed?
\end{itemize}
\end{frame}
% slide: ad-hoc communication, memory conflicts (freeing, runqueue)
%\begin{frame}{Ad-Hoc Thread Communication}
% No message-passing % TODO this slide sucks
%
% User-space systematic exploration relies on it\related{Simsa '10}; we cannot.
%
% Kernel threads share state via globals, heap.
%\end{frame}
\begin{frame}{The Kernel as One Program} % slide: the kernel is too big to test all at once
% say: it's also important to understand the kernel's internals instead of just viewing it as one ``black box''
\begin{center}
\includegraphics[width=\textwidth]{pebbles.png}
\end{center}
% now that we see these internal interfaces, how do we apply systematic testing to it?
\end{frame}
\begin{frame}{The Kernel as One Program} % slide: the kernel is too big to test all at once
``Everything interleaves with everything else''?
\begin{itemize}
% Say: "we don't want to have to explore every possible interaction between each of these components"
\item Impractical to explore resulting state spaces
\end{itemize}
\linegap
What is a ``bug'', anyway?\related{Engler '01}
\begin{itemize}
\item False-negative-oriented approach
\end{itemize}
\end{frame}
\begin{frame}{Contribution} % slide: summary: "sys ex is a tool \ldots``
Systematic testing is a {\em tool} for testing concurrent systems.
\begin{itemize}
\item How can it be applied in kernel-space?
\item What simple things can we ask of the user to make it possible?
\end{itemize}
\linegap
{\bf Landslide} is an effort to answer these questions.
% say: landslide is an exploratory work into finding out what lies behind these questions.
\end{frame}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Landslide}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand\done[1]{\textcolor{gray}{\em \small #1}}
%\begin{frame}{Outline}
% \done{Motivation: Concurrency debugging}
% \begin{itemize}
% \item \done{Systematic exploration versus stress testing}
% \item \done{Challenges of kernel-space}
% \end{itemize}
% \linegap
%
% {\bf Tool: Landslide}
% \begin{itemize}
% \item {\bf Design and interface}
% \item {\bf Addressing challenges}
% \end{itemize}
% \linegap
%
% Evaluation: Finding Races
% \begin{itemize}
% \item Student user study
% \item Case study
% \end{itemize}
% \linegap
%
% Future Work and Conclusion
%\end{frame}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Design}
\begin{frame}{Environment}
\textbf{Simics:} a full-system x86 simulator
\begin{itemize}
\item Students in 15-410 use Simics to test their kernels.
\item Landslide is a transparently-embedded Simics module.
\end{itemize}
\end{frame}
\begin{frame}{Anatomy of Landslide}
\begin{center}
\includegraphics[width=0.7\textwidth]{landslide.png}
\end{center}
% Remember to talk about solving the thread scheduling challenge
\end{frame}
\subsection{Interface}
\begin{frame}{Using Landslide}
\begin{center}
\includegraphics[width=0.9\textwidth]{tell_landslide.png}
\end{center}
User must tell Landslide when certain kernel events happen:
\begin{itemize}
\item When do threads become runnable / descheduled?
\item When does the scheduler switch threads?
\end{itemize}
\linegap
% Make sure to expound on what these are
Some complicated conditions require in-Landslide instrumentation.
\begin{itemize}
\item Scheduler design details
\end{itemize}
\end{frame}
\begin{frame}{Decision Trace}
% FIXME make the stack trace coloured
\includegraphics[width=\textwidth]{found_a_bug.png}
% Say: So landslide had to explore 5 different interleavings to find the bug. But this was a pretty simple test case, and
\end{frame}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Addressing Challenges} % rename
\begin{frame}{State Space Reduction}
% Say: ``combinatorial explosion''
\begin{center}
\includegraphics[width=\textwidth]{undiamond1.png}
\end{center}
\end{frame}
\begin{frame}{State Space Reduction}
State spaces grow exponentially.
\begin{itemize}
\item Fortunately, some sequences result in identical states.
\item Dynamic Partial Order Reduction\related{Flanagan '05}
\begin{itemize}
\item Requires ``memory independence relation'' between transitions.
\end{itemize}
\end{itemize}
\end{frame}
\begin{frame}{Shared Memory Conflicts} % slide: ignoring shared memory accesses - venn diagram
\begin{center}
\includegraphics[width=\textwidth]{shm-conflict0.png}
\end{center}
\end{frame}
\begin{frame}{Shared Memory Conflicts}
\begin{center}
\includegraphics[width=\textwidth]{shm-conflict1.png}
\end{center}
\end{frame}
\begin{frame}{Shared Memory Conflicts}
\begin{center}
\includegraphics[width=\textwidth]{shm-conflict2.png}
\end{center}
\end{frame}
\begin{frame}{Shared Memory Conflicts}
%\textbf{Problem:} Many conflicts we don't care about
%\begin{itemize}
% \item Every transition accesses scheduler state.
% \item Many transitions access ``unrelated'' global objects.
%\end{itemize}
%\linegap
\textbf{Solution:} Only consider ``relevant'' memory conflicts.
\begin{itemize}
\item Ignore scheduler, global objects assumed to be correct
\begin{itemize}
\item Sacrifice ability to test these to efficiently test everything else.
\end{itemize}
\item User must specify what to ignore.
\end{itemize}
\end{frame}
\begin{frame}[fragile]{Identifying Bugs}
\begin{columns}[l]
\column{0.75\textwidth}
\textbf{How do we know we've found a bug?}
\linegap
Definite bugs
\begin{itemize}
\item Kernel panics / assertion failures
\item Use-after-free
\item Deadlock
\end{itemize}
Probable bugs
\begin{itemize}
\item Infinite loop
\begin{itemize}
\item Use structure of execution tree to judge progress.
\end{itemize}
\end{itemize}
\column{0.25\textwidth}
\includegraphics[width=\textwidth]{blank-livelock.png}
\end{columns}
\end{frame}
\begin{frame}[fragile]{Identifying Bugs}
\begin{columns}[l]
\column{0.75\textwidth}
\textbf{How do we know we've found a bug?}
\linegap
Definite bugs
\begin{itemize}
\item Kernel panics / assertion failures
\item Use-after-free
\item Deadlock
\end{itemize}
Probable bugs
\begin{itemize}
\item Infinite loop
\begin{itemize}
\item Use structure of execution tree to judge progress.
\end{itemize}
\end{itemize}
\column{0.25\textwidth}
\includegraphics[width=\textwidth]{livelock.png}
\end{columns}
\end{frame}
% slide: other_prob: decide on mutex_lock as opposed to everywhere, but...
% slide: manual shaping - have *user* specify what to focus on (automating intuition)
\begin{frame}{Focusing the Search Space}
Recommended decision points: \texttt{mutex\_lock()} and \texttt{mutex\_unlock()}
\linegap
{\bf Problem:} Kernel uses mutexes {\em everywhere}.
\begin{itemize}
\item Good: \texttt{exit()} calls \texttt{mutex\_lock()}
\item Bad: \texttt{exit()} calls \texttt{destroy\_address\_space()} calls \texttt{mutex\_lock()}
\end{itemize}
\linegap
{\bf Solution:} User specifies what modules of the kernel to pay attention to.
\begin{itemize}
\item \texttt{within\_function exit}
\item \texttt{without\_function destroy\_address\_space}
\end{itemize}
\end{frame}
% slide: exciting teaser "i think this is not too far off!"
\begin{frame}{Teaser: (Semi-)Automated Search Focusing}
Searching for bugs given a stack trace
\begin{itemize}
\item User knows {\em where} the bug is, but not {\em what}.
\item Testing framework can use stack trace to conduct a more focused search.
\end{itemize}
\end{frame}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Evaluation}
\breakslide{Evaluating Landslide}
%\begin{frame}{Outline}
% \done{Motivation: Concurrency debugging}
% \begin{itemize}
% \item \done{Systematic exploration versus stress testing}
% \item \done{Challenges of kernel-space}
% \end{itemize}
% \linegap
%
% \done{Tool: Landslide}
% \begin{itemize}
% \item \done{Design and interface}
% \item \done{Addressing challenges}
% \end{itemize}
% \linegap
%
% {\bf Evaluation: Finding Races}
% \begin{itemize}
% \item {\bf Student user study}
% \item {\bf Case study}
% \end{itemize}
% \linegap
%
% Future Work and Conclusion
%\end{frame}
\subsection{User Study}
\begin{frame}{Working with Students} % slide: worked with students - give some time breakdown
Solicited students in 15-410 to use Landslide on their kernels.
\begin{itemize}
\item Can Landslide find bugs ``in the wild''?
\item How much time does it take to get it working?
\end{itemize}
\linegap
Five groups participated; four got it to work.
\begin{itemize}
\item Average instrumentation time 100 minutes (55 to 158)
%\item Average customisation time 25 minutes (0 to 60)
\end{itemize}
\end{frame}
\begin{frame}{Landslide Victories} % slide: anecdotes: two deterministic bugs & two races
All four groups who got it to work found bugs.
\linegap
Race conditions
\begin{itemize}
\item Too many waiters allowed
\begin{itemize}
\item One parent thread might block forever
\end{itemize}
\item Accidental return to an exited thread
% Also talk about their vanish/vanish bug
\end{itemize}
\linegap
Deterministic bugs
\begin{itemize}
\item Inappropriate idling
\begin{itemize}
\item Waiting for a timer tick with no useful work to do
\end{itemize}
\item Use-after-free
\begin{itemize}
\item Required memory tracking to detect
\end{itemize}
\end{itemize}
\end{frame}
\subsection{Case Study}
\begin{frame}{Studying Bugs In-Depth} % slide: "I have built a software smarter than me!" 30-40sec to find
Worked with two kernels: my own, and one I graded
\linegap
``I have made something smarter than me.''
% Heh, if it were really smarter than me, I wouldn't have had to debug it.
\begin{itemize}
\item \texttt{double\_wait} - two parent threads \texttt{wait()} on one exiting child
\begin{itemize}
\item Expected: One thread reaps child, the other returns failure
\item Got: \texttt{failed assertion `nobe->cond\_queue\_next == NULL'}
\end{itemize}
\item Previously unknown, not found by stress testing or by TA
\end{itemize}
\end{frame}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Conclusion}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%\begin{frame}{Outline}
% \done{Motivation: Concurrency debugging}
% \begin{itemize}
% \item \done{Systematic exploration versus stress testing}
% \item \done{Challenges of kernel-space}
% \end{itemize}
% \linegap
%
% \done{Tool: Landslide}
% \begin{itemize}
% \item \done{Design and interface}
% \item \done{Addressing challenges}
% \end{itemize}
% \linegap
%
% \done{Evaluation: Finding Races}
% \begin{itemize}
% \item \done{Student user study}
% \item \done{Case study}
% \end{itemize}
% \linegap
%
% {\bf Future Work and Conclusion}
%\end{frame}
%\subsection{Future Work}
\begin{frame}{Promising Directions}
Top 15-410 students, effectively supervised, can find hard bugs faster.
\begin{itemize}
\item Use as a debugging tool may help students learn more.
\end{itemize}
\linegap
After Pebbles\dots
\begin{itemize}
\item Potential application to production kernels
\begin{itemize}
\item General purpose OSes, device drivers
% Be ready to field questions about SMP.
\end{itemize}
\end{itemize}
\linegap
Emphasis on users ``steering'' test by changing parameters
\begin{itemize}
\item Start with coarse granularity, iterate refining decision points
\item Perhaps we can automate this steering?
\end{itemize}
\linegap
\end{frame}
%\subsection{Summary}
\begin{frame}{Summary}
\textbf{Systematic testing in kernel-space}
\begin{itemize}
\item Use internal kernel abstractions to understand concurrency behaviour.
\item Relying on user's knowledge makes testing easier.
\end{itemize}
\linegap
\textbf{Landslide}
\begin{itemize}
\item Has potential to be a useful tool for 15-410.
\item A first step towards sophisticated kernel debugging techniques.
\end{itemize}
\linegap
\linegap
\begin{center}
{\scriptsize \em Please hold on. This transit is approaching the Landslide terminal, \\baggage claim, ground transportation, and ticketing.}
\end{center}
\end{frame}
% slide: bonus slides
\end{document}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Introduction}
\subsection{Introduction}
\subsection{Race Conditions}
% Say: Since I'm no longer a member of course staff, I'm allowed to give away a
% race condition that some of you might have, for the sake of example.
\begin{frame}{Decision Points (``good'' case)}
\begin{tabular}{|l|l|l}
\cline{1-2}
{\bf Thread 1} & {\bf Thread 2} & \\
\cline{1-2}
\texttt{spawn\_new\_thread} && \\
\cline{1-2}
\texttt{add\_to\_runqueue} && (new thread) \\
\cline{1-2}
\texttt{return child->tid} && \\
\cline{1-2}
& \texttt{vanish} & \\
\cline{1-2}
& (TCB gets freed) & (voluntary reschedule) \\
\cline{1-2}
\end{tabular}
\end{frame}
\begin{frame}{Decision Points (race condition)}
\begin{tabular}{|l|l|l}
\cline{1-2}
{\bf Thread 1} & {\bf Thread 2} & \\
\cline{1-2}
\texttt{spawn\_new\_thread} && \\
\cline{1-2}
\texttt{add\_to\_runqueue} && (new thread + preempted) \\
\cline{1-2}
& \texttt{vanish} & \\
\cline{1-2}
& (TCB gets freed) & (voluntary reschedule) \\
\cline{1-2}
\texttt{return child->tid} && (bad!) \\
\cline{1-2}
\end{tabular}
\end{frame}
\breakslide{\Large A different way of looking at race conditions\ldots}
\begin{frame}{Execution Tree}
\begin{center}
%\includegraphics[width=0.9\textwidth]{threadfork0.png}
\end{center}
\end{frame}
\begin{frame}{Execution Tree}
\begin{center}
%\includegraphics[width=0.9\textwidth]{threadfork05.png}
\end{center}
\end{frame}
\begin{frame}{Execution Tree}
\begin{center}
%\includegraphics[width=0.9\textwidth]{threadfork1.png}
\end{center}
\end{frame}
\begin{frame}{Execution Tree}
\begin{center}
%\includegraphics[width=0.9\textwidth]{threadfork2.png}
\end{center}
\end{frame}
\begin{frame}{Decision Points} % : duplicate slide with later
A {\bf decision point} is\ldots
\linegap
A code location where being preempted causes different behaviour.
\begin{itemize}
\item Intuitively: Somewhere that interesting interleavings can happen around.
\end{itemize}
Examples:
\begin{itemize}
\item A new thread becomes runnable
\item Voluntary reschedule (e.g. \texttt{yield}, \texttt{cond\_wait})
\item Synchronization primitives
\end{itemize}
% Say: We'll revisit this later.
\end{frame}
% Say: Obviously we want to be able to always run the third path. But knowing
% that ahead of time is impossible.
% Say: Okay, now what if we could build a tool that could ``systematically''
% explore this tree, and find the branch with the bug in it? What would such a
% tool need to be able to do?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Systematic Testing}
\breakslide{\Large Systematic Testing}
\begin{frame}{Systematic Testing}
\textbf{Systematic testing} is:
\begin{itemize}
\item Systematically enumerating different interleavings
\begin{itemize}
\item Intuitively: Generate many ``tabular execution traces''
\end{itemize}
\item Exploring all branches in these trees
\begin{itemize}
\item (by controlling scheduling decisions at decision points)
\end{itemize}
\item In practice: Depth-first search of branches
\end{itemize}
\end{frame}
\subsection{Requirements}
\begin{frame}{Execution Tree Exploration}
Important point: When does a branch end?
\begin{itemize}
\item All threads run to completion, or
\item A bug is detected % Say: more on this later.
\end{itemize}
{\bf Backtracking}:
\begin{itemize}
\item Identify a decision point to choose differently
\item Reset machine state and start over
\item Replay test from the beginning, with different choices
\end{itemize}
\end{frame}
\begin{frame}{More on Decision Points}
Important point: What does ``all possible interleavings'' mean?
\linegap
One extreme: Decide at every instruction
\begin{itemize}
\item Good news: Will find every possible race condition.
\item Bad news: Runtime of test will be impossibly large.
\end{itemize}
\linegap
Other extreme: Nothing is a decision point
\begin{itemize}
\item Good news: Test will finish quickly.
\item Bad news: Only one execution was checked for bugginess.
\item Bad news: No alternative interleavings explored.
\begin{itemize}
\item Makes ``no race found'' a weak claim.
\end{itemize}
\end{itemize}
\end{frame}
\begin{frame}{More on Decision Points}
Sweet spot: Insert a thread switch everywhere it ``might matter''.
\linegap
When do we fear being preempted?
\begin{itemize}
\item New threads becoming runnable (\texttt{fork}, \texttt{cond\_signal}, etc)
\begin{itemize}
\item Preemptions may cause it to run before we're ready
\end{itemize}
\item Synchronization primitives (\texttt{mutex\_lock}, etc)
\begin{itemize}
\item If used improperly\ldots
\end{itemize}
\item Unprotected shared memory accesses % Say: more on this later.
\begin{itemize}
\item May result in data structure corruption
\end{itemize}
\end{itemize}
\linegap
Finding the sweet spot is a joint effort between programmer and tool. (More on this later.)
\end{frame}
\subsection{Challenges}
\begin{frame}{Controlling Scheduling Decisions}
Control over sources of nondeterminism
\begin{itemize}
\item Device interrupts/input
\begin{itemize}
\item Disk drivers: when disk reads finish
\item Ethernet drivers: when packets arrive
\end{itemize}
\item To control thread switches in a 410 kernel, vary when clock ticks happen.
\end{itemize}
\end{frame}
\begin{frame}{Memory Interposition}
In order to find use-after-free, need to know:
\begin{itemize}
\item When objects are \texttt{free()}d
\item When threads access shared memory in the heap
\end{itemize}
\linegap
Solution: Keep track of all memory events
\begin{itemize}
\item All calls to \texttt{malloc}/\texttt{free}
\item All shared memory reads/writes
\end{itemize}
\end{frame}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{State Space Explosion}
\begin{frame}{State Space Explosion}
State spaces grow exponentially
\begin{itemize}
\item With $d$ decision points, $k$ runnable threads, size $d^k$.
\item Threatens our ability to explore everything.
\item Fortunately, some sequences result in identical states.
\end{itemize}
\linegap
{\bf Partial Order Reduction} can help.
\begin{itemize}
\item Complicated algorithm; ask me later for details.
\item Intuitive explanation follows.
\end{itemize}
\end{frame}
\begin{frame}{State Space Explosion}
\begin{center}
%\includegraphics[width=\textwidth]{undiamond0.png}
\end{center}
\end{frame}
\begin{frame}{State Space Explosion}
\begin{center}
%\includegraphics[width=\textwidth]{undiamond1.png}
\end{center}
\end{frame}
\begin{frame}{State Space Explosion}
\begin{center}
%\includegraphics[width=\textwidth]{diamond1.png}
\end{center}
\end{frame}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Landslide}
\breakslide{\Huge Landslide}
\begin{frame}{About The Project}
5th year MS since June 2011 % Say: planning to finish this may, hopefully
\linegap
Working with Garth Gibson, Jiri Simsa
\linegap
{\bf Landslide}: Shows that your Pebbles are not as stable as you thought.
\end{frame}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{How Landslide Works}
\begin{frame}{Landslide in Simics}
As a Simics module, Landslide knows:
\begin{itemize}
\item Every instruction the kernel executes
\item Every memory address the kernel reads/writes
\end{itemize}
\linegap
Artificially causes timer interrupts
\linegap
Checkpointing/backtracking via Simics bookmarks
\end{frame}
\begin{frame}{Anatomy}
\begin{center}
%\includegraphics[width=0.6\textwidth]{landslide.png}
\end{center}
\end{frame}
\begin{frame}{Identifying Bugs}
Landslide can {\em definitely discover}:
\begin{itemize}
\item Kernel panics % Say: note: the better your asserts are..!
\item Deadlock
\item Use-after-free / double-free
\end{itemize}
Landslide can {\em reasonably suspect}:
\begin{itemize}
\item Memory leak
\item Progress sense (halting problem)
\end{itemize}
\end{frame}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Using Landslide}
\breakslide{\Large Using Landslide}
\begin{frame}{In Which Ben Offers Help}
% Say: So, this wasn't just a research talk
This is something you can try!
\linegap
Mutual benefit
\begin{itemize}
\item Landslide may help you find bugs
\item You may help Ben evaluate his thesis project
\end{itemize}
\end{frame}
\begin{frame}{Keeping It Real}
Finding race conditions is hard for humans.
\linegap
It is hard for computer programs too.
\linegap
Landslide is not an oracle.
\end{frame}
\begin{frame}{Annotating Your Kernel}
Step 1
\begin{center}
%\includegraphics[width=0.9\textwidth]{tell_landslide.png}
\end{center}
Your kernel needs to say when certain events happen:
\begin{itemize}
\item When do threads become runnable / descheduled?
\item When does the scheduler switch threads?
\end{itemize}
\linegap
\framebox{Time estimate: 40 minutes}
\end{frame}
\begin{frame}{Configuring Landslide}
Step 2
\begin{center}
%\includegraphics[width=0.8\textwidth]{config-landslide.png}
\end{center}
Edit \texttt{config.landslide} with some details and tweaks
Fill in two implementation-dependent C functions in Landslide ($\le$10 lines)
% Say: Which depend on your kernel's specific implementation
\linegap
\framebox{Time estimate: 60 minutes}
\end{frame}
\begin{frame}{Configuring Decision Points}
Landslide automatically identifies a minimal set of decision points.
\begin{itemize}
\item It might find bugs.
\item It might overlook more fine-grained interleavings.
\end{itemize}
With help from you, it could find more.
\begin{itemize}
\item Optional annotation: \texttt{tell\_landslide\_decide()}
\item Hints to where a context switch should be forced.
\item Inside every call to \texttt{mutex\_lock}\ldots
\end{itemize}
\end{frame}
\breakslide{\Large Quick Demo}
%\begin{frame}{Decision Points (noticing a theme here?)}
% Landslide is {\bf false negative}-oriented.
% \begin{itemize}
% \item If Landslide reports a bug, there is a bug for sure.
% % Say: Well, except progress sense might be wrong.
% \item If not,
% \begin{itemize}
% \item Maybe there was no race, or
% \item Maybe your decision points were not granular enough.
% \end{itemize}
% \end{itemize}
%\end{frame}
%\begin{frame}{Decision Points (noticing a theme here?)}
% Sometimes the default set will work.
%
% Sometimes you need to tweak\ldots
% \begin{itemize}
% \item Ignore certain global mutexes
% \item Whitelist or blacklist entire syscalls
% \item (get creative)
% \end{itemize}
% Intuitively: focusing Landslide on relevant parts of the kernel.
%\end{frame}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{User Study}
\begin{frame}{In Which Ben Offers Help - Warning}
\textbf{If you are already struggling, this will not ``save'' you.}
\begin{itemize}
\item False-negatives: not guaranteed to find races at all
\item Research-quality: possibly difficult to integrate with your kernel