SlideShare una empresa de Scribd logo
1 de 53
Understanding Modern Device Drivers
Asim Kadav and Michael M. Swift
University ofWisconsin-Madison
Why study device drivers?
» Linux drivers constitute ~5 million LOC and 70% of kernel
» Little exposure to this breadth of driver code from research
» Better understanding of drivers can lead to better driver model
» Large code base discourages major changes
» Hard to generalize about driver properties
» Slow architectural innovation in driver subsystems
» Existing architecture: Error prone drivers
» Many developers, privileged execution, C language
» Recipe for complex system with reliability problems
2
Our view of drivers is narrow
» Driver research is focused on reliability
» Focus limited to fault/bug detection and tolerance
» Little attention to architecture/structure
» Driver research only explores a small set of drivers
» Systems evaluate with mature drivers
» Volume of driver code limits breadth
» Necessary to review current drivers in modern settings
3
Difficult to validate research on all drivers
Improvement System Validation
Drivers Bus Classes
New functionality Shadow driver migration [OSR09] 1 1 1
RevNIC [Eurosys 10] 1 1 1
Reliability Nooks [SOSP 03] 6 1 2
XFI [ OSDI 06] 2 1 1
CuriOS [OSDI 08] 2 1 2
Type Safety SafeDrive [OSDI 06] 6 2 3
Singularity [Eurosys 06] 1 1 1
Specification Nexus [OSDI 08] 2 1 2
Termite [SOSP 09] 2 1 2
Static analysis tools SDV [Eurosys 06] All All All
Carburizer [SOSP 09] All/1 All All
Cocinelle [Eurosys 08]
All All All
Device availability/slow driver development restrict our
research runtime solutions to a small set of drivers
4
Improvement System Validation
Drivers Bus Classes
New functionality Shadow driver migration [OSR09] 1 1 1
RevNIC [Eurosys 10] 1 1 1
Reliability Nooks [SOSP 03] 6 1 2
XFI [ OSDI 06] 2 1 1
CuriOS [OSDI 08] 2 1 2
Type Safety SafeDrive [OSDI 06] 6 2 3
Singularity [Eurosys 06] 1 1 1
Specification Nexus [OSDI 08] 2 1 2
Termite [SOSP 09] 2 1 2
Static analysis tools SDV [Eurosys 06] All All All
Carburizer [SOSP 09] All/1 All All
Cocinelle [Eurosys 08]
All All All
Difficult to validate research on all drivers
5
“...Please do not misuse these
tools!(Coverity).... If you focus too
much on fixing the problems quickly
rather than fixing them cleanly, then we
forever lose the opportunity to clean
our code, because the problems will then
be hidden.”
LKML mailing list http://lkml.org/lkml/2005/3/27/131
Understanding Modern Device Drivers
» Study source of all Linux drivers for x86 (~3200 drivers)
» Understand properties of driver code
» What are common code characteristics?
» Do driver research assumptions generalize?
» Understand driver interactions with outside world
» Can drivers be easily re-architected or migrated ?
» Can we develop more efficient fault-isolation mechanisms?
» Understand driver code similarity
» Do we really need all 5 million lines of code?
» Can we build better abstractions?
6
Outline
Methodology
Driver code characteristics
Driver interactions
Driver redundancy
7
Methodology of our study
» Target Linux 2.6.37.6 (May 2011) kernel
» Use static source analyses to gather information
» Perform multiple dataflow/control-flow analyses
» Detect driver properties of the drive code
» Detect driver code interactions with environment
» Detect driver code similarities within classes
8
Extract driver wide properties for individual drivers
9
Step 1: Determine driver code characteristics for each driver
from driver data structures registered with the kernel
Determine code characteristics of each driver function
Step 2: Propagate the required information to driver
functions and collect information about each function
10
Determining interactions of each driver function
11
Step 3: Determine driver interactions from I/O operations and calls
to kernel and bus for each function and propagate to entry points
Outline
Methodology
Driver code characteristics
Driver interactions
Driver redundancy
12
Part 1: Driver Code Behavior
A device driver can be thought of as a translator. Its input
consists of high level commands such as “retrieve block 123”.
Its output consists of low level, hardware specific instructions
that are used by the hardware controller, which interfaces
the I/O device to the rest of the system.
-- Operating SystemConceptsVIII edition
Driver code complexity and size is assumed to be a result
of its I/O function.
13
» Core I/O & interrupts – 23%
» Initialization/cleanup – 36 %
» Device configuration – 15%
» Power management – 7.4%
» Device ioctl – 6.2%
1-a) Driver Code
Characteristics
14
» Core I/O & interrupts – 23%
» Initialization/cleanup – 36 %
» Device configuration – 15%
» Power management – 7.4%
» Device ioctl – 6.2%
Driver Code
Characteristics
15
Only 23% of driver
code is dedicated to I/O
and interrupts
» Core I/O & interrupts – 23%
» Initialization/cleanup – 36 %
» Device configuration – 15%
» Power management – 7.4%
» Device ioctl – 6.2%
Driver Code
Characteristics
16
Driver code complexity
stems mostly from
initialization/cleanup
code.
» Core I/O & interrupts – 23%
» Initialization/cleanup – 36 %
» Device configuration – 15%
» Power management – 7.4%
» Device ioctl – 6.2%
Driver Code
Characteristics
17
Better ways needed to
manage device
configuration code
1-b) Do drivers belong to classes?
» Drivers registers a class interface with kernel
» Example: Ethernet drivers register with bus and net device library
» Class definition includes:
» Callbacks registered with the bus, device and kernel subsystem
» ExportedAPIs of the kernel to use kernel resources and services
» Most research assumes drivers obey class behavior
18
Class definition used to record state
» Modern research assumes drivers conform to class behavior
» Example: Driver recovery (Shadow drivers[OSDI 04] )
» Driver state is recorded based on
interfaces defined by class
» State is replayed upon restart after
failure to restore state
Figure from Shadow drivers paper
19
Non-class behavior can lead to incomplete restore after failure
Do drivers belong to classes?
» Non-class behavior stems from:
» Load time parameters, unique ioctls, procfs and sysfs interactions
... qlcnic_sysfs_write_esw_config (...) {
...
switch (esw_cfg[i].op_mode) {
case QLCNIC_PORT_DEFAULTS:
qlcnic_set_eswitch_...(...,&esw_cfg[i]);
...
case QLCNIC_ADD_VLAN:
qlcnic_set_vlan_config(...,&esw_cfg[i]);
...
case QLCNIC_DEL_VLAN:
esw_cfg[i].vlan_id = 0;
qlcnic_set_vlan_config(...,&esw_cfg[i]);
...
Drivers/net/qlcnic/qlcnic_main.c: Qlogic driver(network class)
21
Many drivers do not conform to class definition
» Results as measured by our analyses:
» 16% of drivers use proc /sysfs support
» 36% of drivers use load time parameters
» 16% of drivers use ioctl that may include non-standard behavior
» Breaks systems that assume driver semantics can be
completely determined from class behavior
Overall, 44% of drivers do not conform to class behavior
Systems based on class definitions may not work properly
when such non-class extensions are used
22
1-c) Do drivers perform significant processing?
» Drivers are considered only a conduit of data
» Example: Synthesis of drivers (Termite[SOSP09])
» State machine model only allows passing of data
» Does not support transformations/processing
» But: drivers perform checksums for RAID, networking, or
calculate display geometry data inVMs
23
Instances of processing loops in drivers
static u8 e1000_calculate_checksum(...)
{ u32 i;
u8 sum = 0;
...
for (i = 0; i < length; i++)
sum += buffer[i];
return (u8) (0 - sum);
}
drivers/net/e1000e/lib.c: e1000e network driver
» Detect loops in driver code that:
» do no I/O,
» do not interact with kernel
» lie on the core I/O path
24
Many instances of processing across classes
static void _cx18_process_vbi_data(...)
{
// Process header & check endianess
// Obtain RAW and sliced VBI data
// Compress data, remove spaces, insert mpg info.
}
void cx18_process_vbi_data(...)
{
// Loop over incoming buffer
// and call above function
}
drivers/media/video/cx18/cx18-vbi.c:cx18 IVTV driver
25
Drivers do perform processing of data
» Processing results from our analyses:
» 15% of all drivers perform processing
» 28% of sound and network drivers perform processing
» Driver behavior models should include processing semantics
» Implications in automatic generation of driver code
» Implications in accounting for CPU time in virtualized environment
Driver behavior models should consider processing
26
Outline
Methodology
Driver code characteristics
Driver interactions
Driver redundancy
27
Part 2: Driver interactions
a)What are the opportunities to redesign drivers?
» Can we learn from drivers that communicate efficiently?
» Can driver code be moved to user mode, aVM, or the device for
improved performance/reliability?
b) How portable are modern device drivers?
» What are the kernel services drivers most rely on?
c) Can we develop more efficient fault-tolerance mechanisms?
» Study drivers interaction with kernel, bus, device, concurrency
28
0
50
100
150
200
250
device library
kernel services
kernel library
synchronization
memory
2-a) Driver kernel interaction
29
Calls/driverfromallentrypoints
0
50
100
150
200
250
device library
kernel services
kernel library
synchronization
memory
Driver kernel interaction
30
Calls/driverfromallentrypoints
Common drivers invoking device specific routines reduces
driver code significantly (and more classes can benefit)
0
50
100
150
200
250
device library
kernel services
kernel library
synchronization
memory
Driver kernel interaction
31
Calls/driverfromallentrypoints
Many classes are portable: Limited interaction with device
library and kernel services
2-b) Driver-bus interaction
» Compare driver structure across buses
» Look for lessons in driver simplicity and performance
» Can they support new architectures to move drivers out of kernel?
» Efficiency of bus interfaces (higher devices/driver)
 Interface standardization helps move code away from kernel
» Granularity of interaction with kernel/device when using a bus
 Coarse grained interface helps move code away from kernel
32
PCI drivers: Fine grained & few devices/driver
» PCI drivers have fine grained access to kernel and device
» Support low number of devices per driver (same vendor)
» Support performance sensitive devices
» Provide little isolation due to heavy interaction with kernel
» Extend support for a device with a completely new driver
33
BUS Kernel Interactions (network drivers) Device Interactions (network drivers)
mem sync dev lib kern lib services port/mmio DMA bus Devices/driver
PCI 29.3 91.1 46.7 103 12 302 22 40.4 9.6
USB: Coarse grained & higher devices/driver
» USB devices support far more devices/driver
» Bus offers significant functionality enabling standardization
» Simpler drivers (like, DMA via bus) with coarse grained access
» Extend device specific functionality for most drivers by only
providing code for extra features
34
BUS Kernel Interactions (network drivers) Device Interactions (network drivers)
mem sync dev lib kern lib services port/mmio DMA bus Devices/driver
PCI 29.3 91.1 46.7 103 12 302 22 40.4 9.6
USB 24.5 72.7 10.8 25.3 11.5 0.0 6.2* 36.0 15.5
* accessed via bus
Xen : Extreme standardization, limit device features
BUS Kernel Interactions (network drivers) Device Interactions (network drivers)
mem sync dev lib kern lib services port/mmio DMA bus Devices/driver
PCI 29.3 91.1 46.7 103 12 302 22 40.4 9.6
USB 24.5 72.7 10.8 25.3 11.5 0.0 6.2* 36.0 15.5
Xen 11.0 7.0 27.0 7.0 7.0 0.0 0.0 24.0 1/All
» Xen represents extreme in device standardization
» Xen can support very high number of devices/driver
» Device functionality limited to a set of standard features
» Non-standard device features accessed from domain
executing the driver
Efficient remote access to devices and efficient device
driver support offered by USB and Xen 35
Outline
Methodology
Driver code characteristics
Driver interactions
Driver redundancy
36
Part 3: Can we reduce the amount of driver code?
» Are 5 million lines of code needed to support all devices?
» Are there opportunities for better abstractions?
» Better abstractions reduce incidence of bugs
» Better abstractions improve software composability
» Goal: Identify the missing abstraction types in drivers
» Quantify the savings by using better abstractions
» Identify opportunities for improving abstractions/interfaces
37
Finding out similar code in drivers
Determine similar driver code by identifying clusters of code that
invoke similar device, kernel interactions and driver operations
38
Reduce each
function to
statement type,
edit distance
coordinates
Reduce every
function to a
single signature
values
1.2356
Compare signature
values for all driver
functions in a class
To improve
accuracy, weigh
statement types,
limit comparisons
to classes
1.56
Drivers within subclasses often differ by reg values
.. nv_mcp55_thaw(...) {
void __iomem *mmio_base = ap->host-
>iomap[NV_MMIO_BAR];
int shift = ap->port_no *
NV_INT_PORT_SHIFT_MCP55;
...
writel(NV_INT_ALL_MCP55 <<
shift,
mmio_base+NV_INT_STATUS_MCP55);
mask = readl(mmio_base +
NV_INT_ENABLE_MCP55);
mask |= (NV_INT_MASK_MCP55 <<
shift);
writel(mask, mmio_base +
NV_INT_ENABLE_MCP55);
.. nv_ck804_thaw(...) {
void __iomem *mmio_base = ap-
>host->iomap[NV_MMIO_BAR];
int shift = ap->port_no *
NV_INT_PORT_SHIFT;
...
writeb(NV_INT_ALL << shift,
mmio_base +
NV_INT_STATUS_CK804);
mask = readb(mmio_base +
NV_INT_ENABLE_CK804);
mask |= (NV_INT_MASK << shift);
writeb(mask, mmio_base +
NV_INT_ENABLE_CK804);
drivers/ata/sata_nv.c
39
Wrappers around device/bus functions
static int nv_pre_reset(...)
{..
struct pci_bits nv_enable_bits[]
= {
{ 0x50, 1, 0x02, 0x02 },
{ 0x50, 1, 0x01, 0x01 }
};
struct ata_port *ap = link->ap;
struct pci_dev *pdev =
to_pci_dev(...);
if (!pci_test_config_bits
(pdev,&nv_enable_bits[ap-
>port_no]))
return -ENOENT;
return ata_sff_prereset(..);
}
static int amd_pre_reset(...)
{..
struct pci_bits
amd_enable_bits[] = {
{ 0x40, 1, 0x02, 0x02 },
{ 0x40, 1, 0x01, 0x01 }
};
struct ata_port *ap = link->ap;
struct pci_dev *pdev =
to_pci_dev(...);
if (!pci_test_config_bits
(pdev,&amd_enable_bits[ap-
>port_no]))
return -ENOENT;
return ata_sff_prereset(..);
}
drivers/ata/pata_amd.c
40
Significant opportunities to improve abstractions
» At least 8% of all driver code is similar to other code
41
Sources of redundancy Potential applicable solutions
Calls to device/bus with
different register values
Table/data driven programming
models
Wrappers around kernel/device
library calls
Procedural abstraction for device
classes
Code in family of devices from
one vendor
Layered design/subclass libraries
Conclusions
» Many driver assumptions do not hold
» Bulk of driver code dedicated to initialization/cleanup
» 44% of drivers have behavior outside class definition
» 15% of drivers perform computation over drivers
» USB/Xen drivers can be offered as services away from kernel
» 8% of driver code can be reduced by better abstractions
» More results in the paper!
42
ThankYou
Contact
» Email
» kadav@cs.wisc.edu
» Driver research webpage
» http://cs.wisc.edu/sonar ata (1%)
cdrom
ide
md (RAID)
mmc
network RAID
mtd (1.5%)
scsi (9.6%)floppy
tape
acpi
blue tooth
crypto
fire wire
gpu (3.9%)
input
joy stick
key board
mouse
touch screentablet game port
serio
leds
media (10.5%)
isdn (3.4%)
sound (10%)
pcm
midi
mixer
thermal
tty
char (52%)
block (16%)
net (27%)
other (5%)
atm
ethernet
infiniband
wireless
wimax
token ring
Linux
Device Drivers
gpio
tpm
serial
display
lcd
back light
video (5.2%)
pata
disk
sata
disk
fiber channel
iscsi
usb-storageosd
raid
drm
vga
bus drivers
xen/lguest
dma/pci libs
video
radio
digital video broadcasting
wan
uwb
driver libraries
43
Taxonomy of Linux drivers developed using
static analysis to find out important classes
for all our results (details in the paper)
Extra slides
44
Drivers repeat functionality around kernel wrappers
... delkin_cb_resume(...) {
struct ide_host *host =
pci_get_drvdata(dev);
int rc;
pci_set_power_state(dev, PCI_D0);
rc = pci_enable_device(dev);
if (rc)
return rc;
pci_restore_state(dev);
pci_set_master(dev);
if (host->init_chipset)
host->init_chipset(dev);
return 0;
}
... ide_pci_resume(...) {
struct ide_host *host =
pci_get_drvdata(dev);
int rc;
pci_set_power_state(dev, PCI_D0);
rc = pci_enable_device(dev);
if (rc)
return rc;
pci_restore_state(dev);
pci_set_master(dev);
if (host->init_chipset)
host->init_chipset(dev);
return 0;
}
drivers/ide/ide.c
45
drivers/delkin_cb.c
Drivers covered by our analysis
• All drivers that compile on x86 platform in Linux 2.6.37.6
• Consider driver, bus and virtual drivers
• Skip drivers/staging directory
– Incomplete/buggy drivers may skew analysis
• Non x86 drivers may have similar kernel interactions
• Windows drivers may have similar device interactions
– New driver model introduced (WDM), improvement over vxd
46
Limitations of our analyses
• Hard to be sound/complete over ALL Linux drivers
• Examples of incomplete/unsound behavior
– Driver maintains private structures to perform tasks and
exposes opaque operations to the kernel
47
Repeated code in family of devices (e.g initialization)
... asd_aic9405_setup(...) {
int err = asd_common_setup(...);
if (err)
return err;
asd_ha->hw_prof.addr_range = 4;
asd_ha->hw_prof.port_name... = 0;
asd_ha->hw_prof.dev_name... = 4;
asd_ha->hw_prof.sata_name... = 8;
return 0;
}
... asd_aic9410_setup(...) {
int err = asd_common_setup(...);
if (err)
return err;
asd_ha->hw_prof.addr_range = 8;
asd_ha->hw_prof.port_name_...= 0;
asd_ha->hw_prof.dev_name_... = 8;
asd_ha->hw_prof.sata_name_...= 16;
return 0;
}
drivers/scsi/aic94xx driver
48
How many devices does a driver support?
• Many research projects generate code for specific
device/driver
• Example, safety specifications for a specific driver
49
How many devices does a driver support?
static int __devinit cy_pci_probe(...)
{
if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo) { ...
if (pci_resource_flags(pdev,2)&IORESOURCE_IO){ ...
if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo ||
device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) {...
}else if (device_id==PCI_DEVICE_ID_CYCLOM_Z_Hi)
....
if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo ||
device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) {
switch (plx_ver) {
case PLX_9050: …
default: /* Old boards, use PLX_9060 */
}
drivers/char/cyclades.c: Cyclades character driver
50
How many devices does a driver support?
0
5
10
15
20
25
30
35
40
acpi
bluetooth
crypto
firewire
gpio
gpu
hwmon
input
isdn
leds
media
misc
parport
pnp
serial
sound
video
watchdog
ata
ide
md
mtd
scsi
atm
infiniband
net
uwb
Chipsets per drivers
28% of drivers support more than one chipset
51
How many devices does a driver support?
28% of drivers support more than one chipset
83% of the total devices are supported by these drivers
• Linux drivers support ~14000 devices with 3200 drivers
• Number of chipsets weakly correlated to the size of
the driver (not just initialization code)
• Introduces complexity in driver code
• Any system that generates unique drivers/specs per
chipset will lead in expansion in code
52
Driver device interaction
0
20
40
60
80
100
120
140
160
acpi
bluetooth
crypto
firewire
gpio
gpu
hwmon
input
isdn
leds
media
misc
parport
pnp
serial
sound
video
watchdog
ata
ide
md
mtd
scsi
atm
infiniband
net
uwb
bus DMA portio/mmio • Portio/mmio: Access to
memory mapped I/O
or x86 ports
• DMA:When pages are
mapped
• Bus:When bus actions
are invoked
• Varying style of
interactions
• Varying frequency of
operations
53
Class definition used to record state
» Modern research assumes drivers conform to class behavior
» Driver state is recorded based
on interfaces defined by class
» State is replayed upon restart
after failure to restore state 54
» Driver behavior is reverse
engineered based on interfaces
defined by class
» Code is synthesized for another
OS based on this behavior

Más contenido relacionado

La actualidad más candente

linux device driver
linux device driverlinux device driver
linux device driverRahul Batra
 
Linux Device Driver Training-TutorialsDaddy
Linux Device Driver Training-TutorialsDaddyLinux Device Driver Training-TutorialsDaddy
Linux Device Driver Training-TutorialsDaddyStryker King
 
brief intro to Linux device drivers
brief intro to Linux device driversbrief intro to Linux device drivers
brief intro to Linux device driversAlexandre Moreno
 
Device Drivers and Running Modules
Device Drivers and Running ModulesDevice Drivers and Running Modules
Device Drivers and Running ModulesYourHelper1
 
Kernel module programming
Kernel module programmingKernel module programming
Kernel module programmingVandana Salve
 
Linux device driver
Linux device driverLinux device driver
Linux device driverchatsiri
 
Board support package_on_linux
Board support package_on_linuxBoard support package_on_linux
Board support package_on_linuxVandana Salve
 
Linux for embedded_systems
Linux for embedded_systemsLinux for embedded_systems
Linux for embedded_systemsVandana Salve
 
Introduction to embedded linux device driver and firmware
Introduction to embedded linux device driver and firmwareIntroduction to embedded linux device driver and firmware
Introduction to embedded linux device driver and firmwaredefinecareer
 
Linux Internals - Kernel/Core
Linux Internals - Kernel/CoreLinux Internals - Kernel/Core
Linux Internals - Kernel/CoreShay Cohen
 
Kernel Recipes 2015: Linux Kernel IO subsystem - How it works and how can I s...
Kernel Recipes 2015: Linux Kernel IO subsystem - How it works and how can I s...Kernel Recipes 2015: Linux Kernel IO subsystem - How it works and how can I s...
Kernel Recipes 2015: Linux Kernel IO subsystem - How it works and how can I s...Anne Nicolas
 

La actualidad más candente (20)

linux device driver
linux device driverlinux device driver
linux device driver
 
Linux Device Driver Training-TutorialsDaddy
Linux Device Driver Training-TutorialsDaddyLinux Device Driver Training-TutorialsDaddy
Linux Device Driver Training-TutorialsDaddy
 
brief intro to Linux device drivers
brief intro to Linux device driversbrief intro to Linux device drivers
brief intro to Linux device drivers
 
Linux Device Driver’s
Linux Device Driver’sLinux Device Driver’s
Linux Device Driver’s
 
Device Drivers and Running Modules
Device Drivers and Running ModulesDevice Drivers and Running Modules
Device Drivers and Running Modules
 
Linux Kernel I/O Schedulers
Linux Kernel I/O SchedulersLinux Kernel I/O Schedulers
Linux Kernel I/O Schedulers
 
Linux device drivers
Linux device drivers Linux device drivers
Linux device drivers
 
Kernel module programming
Kernel module programmingKernel module programming
Kernel module programming
 
Linux device driver
Linux device driverLinux device driver
Linux device driver
 
Embedded Linux on ARM
Embedded Linux on ARMEmbedded Linux on ARM
Embedded Linux on ARM
 
Device drivers tsp
Device drivers tspDevice drivers tsp
Device drivers tsp
 
Board support package_on_linux
Board support package_on_linuxBoard support package_on_linux
Board support package_on_linux
 
Linux for embedded_systems
Linux for embedded_systemsLinux for embedded_systems
Linux for embedded_systems
 
Introduction to embedded linux device driver and firmware
Introduction to embedded linux device driver and firmwareIntroduction to embedded linux device driver and firmware
Introduction to embedded linux device driver and firmware
 
Embedded Android : System Development - Part I
Embedded Android : System Development - Part IEmbedded Android : System Development - Part I
Embedded Android : System Development - Part I
 
Linux Programming
Linux ProgrammingLinux Programming
Linux Programming
 
Linux kernel modules
Linux kernel modulesLinux kernel modules
Linux kernel modules
 
Kernel modules
Kernel modulesKernel modules
Kernel modules
 
Linux Internals - Kernel/Core
Linux Internals - Kernel/CoreLinux Internals - Kernel/Core
Linux Internals - Kernel/Core
 
Kernel Recipes 2015: Linux Kernel IO subsystem - How it works and how can I s...
Kernel Recipes 2015: Linux Kernel IO subsystem - How it works and how can I s...Kernel Recipes 2015: Linux Kernel IO subsystem - How it works and how can I s...
Kernel Recipes 2015: Linux Kernel IO subsystem - How it works and how can I s...
 

Similar a Understanding Modern Device Drivers

Fine-grained fault tolerance using device checkpoints
Fine-grained fault tolerance using device checkpointsFine-grained fault tolerance using device checkpoints
Fine-grained fault tolerance using device checkpointsasimkadav
 
Reverse Engineering and Bug Hunting on KMDF Drivers - Enrique Nissim - 44CON ...
Reverse Engineering and Bug Hunting on KMDF Drivers - Enrique Nissim - 44CON ...Reverse Engineering and Bug Hunting on KMDF Drivers - Enrique Nissim - 44CON ...
Reverse Engineering and Bug Hunting on KMDF Drivers - Enrique Nissim - 44CON ...44CON
 
Understanding and Improving Device Access Complexity
Understanding and Improving Device Access ComplexityUnderstanding and Improving Device Access Complexity
Understanding and Improving Device Access Complexityasimkadav
 
Journey from Monolith to a Modularized Application - Approach and Key Learnin...
Journey from Monolith to a Modularized Application - Approach and Key Learnin...Journey from Monolith to a Modularized Application - Approach and Key Learnin...
Journey from Monolith to a Modularized Application - Approach and Key Learnin...mfrancis
 
To study pcms pegasus erp cargo management system-release-7 from architectu...
To study pcms   pegasus erp cargo management system-release-7 from architectu...To study pcms   pegasus erp cargo management system-release-7 from architectu...
To study pcms pegasus erp cargo management system-release-7 from architectu...Shahzad
 
Introduction to architecture exploration
Introduction to architecture explorationIntroduction to architecture exploration
Introduction to architecture explorationDeepak Shankar
 
EC 308 Embedded Systems Module 1 Notes APJKTU
EC 308 Embedded Systems Module 1 Notes APJKTUEC 308 Embedded Systems Module 1 Notes APJKTU
EC 308 Embedded Systems Module 1 Notes APJKTUAgi George
 
Mobica White Paper -Digital Instrument Cluster
Mobica White Paper -Digital Instrument ClusterMobica White Paper -Digital Instrument Cluster
Mobica White Paper -Digital Instrument ClusterSchuyler Kennedy
 
Generic Vehicle Architecture – DDS at the Core.
Generic Vehicle Architecture – DDS at the Core.Generic Vehicle Architecture – DDS at the Core.
Generic Vehicle Architecture – DDS at the Core.Real-Time Innovations (RTI)
 
HiPEAC Computing Systems Week 2022_Mario Porrmann presentation
HiPEAC Computing Systems Week 2022_Mario Porrmann presentationHiPEAC Computing Systems Week 2022_Mario Porrmann presentation
HiPEAC Computing Systems Week 2022_Mario Porrmann presentationVEDLIoT Project
 
Efficient Reverse Engineering of Automotive Firmware
Efficient Reverse Engineering of Automotive FirmwareEfficient Reverse Engineering of Automotive Firmware
Efficient Reverse Engineering of Automotive FirmwareRiscure
 
Will future vehicles be secure?
Will future vehicles be secure?Will future vehicles be secure?
Will future vehicles be secure?Alan Tatourian
 
SLTS kernel and base-layer development in the Civil Infrastructure Platform
SLTS kernel and base-layer development in the Civil Infrastructure PlatformSLTS kernel and base-layer development in the Civil Infrastructure Platform
SLTS kernel and base-layer development in the Civil Infrastructure PlatformYoshitake Kobayashi
 
Embedded 2 marks Anna university-Adhithya.pdf
Embedded 2 marks Anna university-Adhithya.pdfEmbedded 2 marks Anna university-Adhithya.pdf
Embedded 2 marks Anna university-Adhithya.pdfAdhithyaS5
 
Short.course.introduction.to.vhdl for beginners
Short.course.introduction.to.vhdl for beginners Short.course.introduction.to.vhdl for beginners
Short.course.introduction.to.vhdl for beginners Ravi Sony
 
Design of control unit.pptx
Design of control unit.pptxDesign of control unit.pptx
Design of control unit.pptxShubham014
 
HKG15-300: Art's Quick Compiler: An unofficial overview
HKG15-300: Art's Quick Compiler: An unofficial overviewHKG15-300: Art's Quick Compiler: An unofficial overview
HKG15-300: Art's Quick Compiler: An unofficial overviewLinaro
 

Similar a Understanding Modern Device Drivers (20)

Faults inside System Software
Faults inside System SoftwareFaults inside System Software
Faults inside System Software
 
Fine-grained fault tolerance using device checkpoints
Fine-grained fault tolerance using device checkpointsFine-grained fault tolerance using device checkpoints
Fine-grained fault tolerance using device checkpoints
 
Reverse Engineering and Bug Hunting on KMDF Drivers - Enrique Nissim - 44CON ...
Reverse Engineering and Bug Hunting on KMDF Drivers - Enrique Nissim - 44CON ...Reverse Engineering and Bug Hunting on KMDF Drivers - Enrique Nissim - 44CON ...
Reverse Engineering and Bug Hunting on KMDF Drivers - Enrique Nissim - 44CON ...
 
Understanding and Improving Device Access Complexity
Understanding and Improving Device Access ComplexityUnderstanding and Improving Device Access Complexity
Understanding and Improving Device Access Complexity
 
Journey from Monolith to a Modularized Application - Approach and Key Learnin...
Journey from Monolith to a Modularized Application - Approach and Key Learnin...Journey from Monolith to a Modularized Application - Approach and Key Learnin...
Journey from Monolith to a Modularized Application - Approach and Key Learnin...
 
To study pcms pegasus erp cargo management system-release-7 from architectu...
To study pcms   pegasus erp cargo management system-release-7 from architectu...To study pcms   pegasus erp cargo management system-release-7 from architectu...
To study pcms pegasus erp cargo management system-release-7 from architectu...
 
AUToSAR introduction
AUToSAR introductionAUToSAR introduction
AUToSAR introduction
 
Unified Hardware Abstraction Layer with Device Masquerade
Unified Hardware Abstraction Layer with Device MasqueradeUnified Hardware Abstraction Layer with Device Masquerade
Unified Hardware Abstraction Layer with Device Masquerade
 
Introduction to architecture exploration
Introduction to architecture explorationIntroduction to architecture exploration
Introduction to architecture exploration
 
EC 308 Embedded Systems Module 1 Notes APJKTU
EC 308 Embedded Systems Module 1 Notes APJKTUEC 308 Embedded Systems Module 1 Notes APJKTU
EC 308 Embedded Systems Module 1 Notes APJKTU
 
Mobica White Paper -Digital Instrument Cluster
Mobica White Paper -Digital Instrument ClusterMobica White Paper -Digital Instrument Cluster
Mobica White Paper -Digital Instrument Cluster
 
Generic Vehicle Architecture – DDS at the Core.
Generic Vehicle Architecture – DDS at the Core.Generic Vehicle Architecture – DDS at the Core.
Generic Vehicle Architecture – DDS at the Core.
 
HiPEAC Computing Systems Week 2022_Mario Porrmann presentation
HiPEAC Computing Systems Week 2022_Mario Porrmann presentationHiPEAC Computing Systems Week 2022_Mario Porrmann presentation
HiPEAC Computing Systems Week 2022_Mario Porrmann presentation
 
Efficient Reverse Engineering of Automotive Firmware
Efficient Reverse Engineering of Automotive FirmwareEfficient Reverse Engineering of Automotive Firmware
Efficient Reverse Engineering of Automotive Firmware
 
Will future vehicles be secure?
Will future vehicles be secure?Will future vehicles be secure?
Will future vehicles be secure?
 
SLTS kernel and base-layer development in the Civil Infrastructure Platform
SLTS kernel and base-layer development in the Civil Infrastructure PlatformSLTS kernel and base-layer development in the Civil Infrastructure Platform
SLTS kernel and base-layer development in the Civil Infrastructure Platform
 
Embedded 2 marks Anna university-Adhithya.pdf
Embedded 2 marks Anna university-Adhithya.pdfEmbedded 2 marks Anna university-Adhithya.pdf
Embedded 2 marks Anna university-Adhithya.pdf
 
Short.course.introduction.to.vhdl for beginners
Short.course.introduction.to.vhdl for beginners Short.course.introduction.to.vhdl for beginners
Short.course.introduction.to.vhdl for beginners
 
Design of control unit.pptx
Design of control unit.pptxDesign of control unit.pptx
Design of control unit.pptx
 
HKG15-300: Art's Quick Compiler: An unofficial overview
HKG15-300: Art's Quick Compiler: An unofficial overviewHKG15-300: Art's Quick Compiler: An unofficial overview
HKG15-300: Art's Quick Compiler: An unofficial overview
 

Último

Disentangling the origin of chemical differences using GHOST
Disentangling the origin of chemical differences using GHOSTDisentangling the origin of chemical differences using GHOST
Disentangling the origin of chemical differences using GHOSTSérgio Sacani
 
Orientation, design and principles of polyhouse
Orientation, design and principles of polyhouseOrientation, design and principles of polyhouse
Orientation, design and principles of polyhousejana861314
 
Call Girls in Munirka Delhi 💯Call Us 🔝9953322196🔝 💯Escort.
Call Girls in Munirka Delhi 💯Call Us 🔝9953322196🔝 💯Escort.Call Girls in Munirka Delhi 💯Call Us 🔝9953322196🔝 💯Escort.
Call Girls in Munirka Delhi 💯Call Us 🔝9953322196🔝 💯Escort.aasikanpl
 
Animal Communication- Auditory and Visual.pptx
Animal Communication- Auditory and Visual.pptxAnimal Communication- Auditory and Visual.pptx
Animal Communication- Auditory and Visual.pptxUmerFayaz5
 
Behavioral Disorder: Schizophrenia & it's Case Study.pdf
Behavioral Disorder: Schizophrenia & it's Case Study.pdfBehavioral Disorder: Schizophrenia & it's Case Study.pdf
Behavioral Disorder: Schizophrenia & it's Case Study.pdfSELF-EXPLANATORY
 
A relative description on Sonoporation.pdf
A relative description on Sonoporation.pdfA relative description on Sonoporation.pdf
A relative description on Sonoporation.pdfnehabiju2046
 
GFP in rDNA Technology (Biotechnology).pptx
GFP in rDNA Technology (Biotechnology).pptxGFP in rDNA Technology (Biotechnology).pptx
GFP in rDNA Technology (Biotechnology).pptxAleenaTreesaSaji
 
STERILITY TESTING OF PHARMACEUTICALS ppt by DR.C.P.PRINCE
STERILITY TESTING OF PHARMACEUTICALS ppt by DR.C.P.PRINCESTERILITY TESTING OF PHARMACEUTICALS ppt by DR.C.P.PRINCE
STERILITY TESTING OF PHARMACEUTICALS ppt by DR.C.P.PRINCEPRINCE C P
 
Recombinant DNA technology( Transgenic plant and animal)
Recombinant DNA technology( Transgenic plant and animal)Recombinant DNA technology( Transgenic plant and animal)
Recombinant DNA technology( Transgenic plant and animal)DHURKADEVIBASKAR
 
Scheme-of-Work-Science-Stage-4 cambridge science.docx
Scheme-of-Work-Science-Stage-4 cambridge science.docxScheme-of-Work-Science-Stage-4 cambridge science.docx
Scheme-of-Work-Science-Stage-4 cambridge science.docxyaramohamed343013
 
The Black hole shadow in Modified Gravity
The Black hole shadow in Modified GravityThe Black hole shadow in Modified Gravity
The Black hole shadow in Modified GravitySubhadipsau21168
 
Artificial Intelligence In Microbiology by Dr. Prince C P
Artificial Intelligence In Microbiology by Dr. Prince C PArtificial Intelligence In Microbiology by Dr. Prince C P
Artificial Intelligence In Microbiology by Dr. Prince C PPRINCE C P
 
Luciferase in rDNA technology (biotechnology).pptx
Luciferase in rDNA technology (biotechnology).pptxLuciferase in rDNA technology (biotechnology).pptx
Luciferase in rDNA technology (biotechnology).pptxAleenaTreesaSaji
 
SOLUBLE PATTERN RECOGNITION RECEPTORS.pptx
SOLUBLE PATTERN RECOGNITION RECEPTORS.pptxSOLUBLE PATTERN RECOGNITION RECEPTORS.pptx
SOLUBLE PATTERN RECOGNITION RECEPTORS.pptxkessiyaTpeter
 
Discovery of an Accretion Streamer and a Slow Wide-angle Outflow around FUOri...
Discovery of an Accretion Streamer and a Slow Wide-angle Outflow around FUOri...Discovery of an Accretion Streamer and a Slow Wide-angle Outflow around FUOri...
Discovery of an Accretion Streamer and a Slow Wide-angle Outflow around FUOri...Sérgio Sacani
 
Call Girls in Mayapuri Delhi 💯Call Us 🔝9953322196🔝 💯Escort.
Call Girls in Mayapuri Delhi 💯Call Us 🔝9953322196🔝 💯Escort.Call Girls in Mayapuri Delhi 💯Call Us 🔝9953322196🔝 💯Escort.
Call Girls in Mayapuri Delhi 💯Call Us 🔝9953322196🔝 💯Escort.aasikanpl
 
Biopesticide (2).pptx .This slides helps to know the different types of biop...
Biopesticide (2).pptx  .This slides helps to know the different types of biop...Biopesticide (2).pptx  .This slides helps to know the different types of biop...
Biopesticide (2).pptx .This slides helps to know the different types of biop...RohitNehra6
 
TOPIC 8 Temperature and Heat.pdf physics
TOPIC 8 Temperature and Heat.pdf physicsTOPIC 8 Temperature and Heat.pdf physics
TOPIC 8 Temperature and Heat.pdf physicsssuserddc89b
 

Último (20)

Disentangling the origin of chemical differences using GHOST
Disentangling the origin of chemical differences using GHOSTDisentangling the origin of chemical differences using GHOST
Disentangling the origin of chemical differences using GHOST
 
Orientation, design and principles of polyhouse
Orientation, design and principles of polyhouseOrientation, design and principles of polyhouse
Orientation, design and principles of polyhouse
 
Call Girls in Munirka Delhi 💯Call Us 🔝9953322196🔝 💯Escort.
Call Girls in Munirka Delhi 💯Call Us 🔝9953322196🔝 💯Escort.Call Girls in Munirka Delhi 💯Call Us 🔝9953322196🔝 💯Escort.
Call Girls in Munirka Delhi 💯Call Us 🔝9953322196🔝 💯Escort.
 
Animal Communication- Auditory and Visual.pptx
Animal Communication- Auditory and Visual.pptxAnimal Communication- Auditory and Visual.pptx
Animal Communication- Auditory and Visual.pptx
 
Behavioral Disorder: Schizophrenia & it's Case Study.pdf
Behavioral Disorder: Schizophrenia & it's Case Study.pdfBehavioral Disorder: Schizophrenia & it's Case Study.pdf
Behavioral Disorder: Schizophrenia & it's Case Study.pdf
 
A relative description on Sonoporation.pdf
A relative description on Sonoporation.pdfA relative description on Sonoporation.pdf
A relative description on Sonoporation.pdf
 
GFP in rDNA Technology (Biotechnology).pptx
GFP in rDNA Technology (Biotechnology).pptxGFP in rDNA Technology (Biotechnology).pptx
GFP in rDNA Technology (Biotechnology).pptx
 
STERILITY TESTING OF PHARMACEUTICALS ppt by DR.C.P.PRINCE
STERILITY TESTING OF PHARMACEUTICALS ppt by DR.C.P.PRINCESTERILITY TESTING OF PHARMACEUTICALS ppt by DR.C.P.PRINCE
STERILITY TESTING OF PHARMACEUTICALS ppt by DR.C.P.PRINCE
 
Recombinant DNA technology( Transgenic plant and animal)
Recombinant DNA technology( Transgenic plant and animal)Recombinant DNA technology( Transgenic plant and animal)
Recombinant DNA technology( Transgenic plant and animal)
 
The Philosophy of Science
The Philosophy of ScienceThe Philosophy of Science
The Philosophy of Science
 
Scheme-of-Work-Science-Stage-4 cambridge science.docx
Scheme-of-Work-Science-Stage-4 cambridge science.docxScheme-of-Work-Science-Stage-4 cambridge science.docx
Scheme-of-Work-Science-Stage-4 cambridge science.docx
 
The Black hole shadow in Modified Gravity
The Black hole shadow in Modified GravityThe Black hole shadow in Modified Gravity
The Black hole shadow in Modified Gravity
 
Artificial Intelligence In Microbiology by Dr. Prince C P
Artificial Intelligence In Microbiology by Dr. Prince C PArtificial Intelligence In Microbiology by Dr. Prince C P
Artificial Intelligence In Microbiology by Dr. Prince C P
 
Luciferase in rDNA technology (biotechnology).pptx
Luciferase in rDNA technology (biotechnology).pptxLuciferase in rDNA technology (biotechnology).pptx
Luciferase in rDNA technology (biotechnology).pptx
 
SOLUBLE PATTERN RECOGNITION RECEPTORS.pptx
SOLUBLE PATTERN RECOGNITION RECEPTORS.pptxSOLUBLE PATTERN RECOGNITION RECEPTORS.pptx
SOLUBLE PATTERN RECOGNITION RECEPTORS.pptx
 
Discovery of an Accretion Streamer and a Slow Wide-angle Outflow around FUOri...
Discovery of an Accretion Streamer and a Slow Wide-angle Outflow around FUOri...Discovery of an Accretion Streamer and a Slow Wide-angle Outflow around FUOri...
Discovery of an Accretion Streamer and a Slow Wide-angle Outflow around FUOri...
 
Call Girls in Mayapuri Delhi 💯Call Us 🔝9953322196🔝 💯Escort.
Call Girls in Mayapuri Delhi 💯Call Us 🔝9953322196🔝 💯Escort.Call Girls in Mayapuri Delhi 💯Call Us 🔝9953322196🔝 💯Escort.
Call Girls in Mayapuri Delhi 💯Call Us 🔝9953322196🔝 💯Escort.
 
Biopesticide (2).pptx .This slides helps to know the different types of biop...
Biopesticide (2).pptx  .This slides helps to know the different types of biop...Biopesticide (2).pptx  .This slides helps to know the different types of biop...
Biopesticide (2).pptx .This slides helps to know the different types of biop...
 
TOPIC 8 Temperature and Heat.pdf physics
TOPIC 8 Temperature and Heat.pdf physicsTOPIC 8 Temperature and Heat.pdf physics
TOPIC 8 Temperature and Heat.pdf physics
 
9953056974 Young Call Girls In Mahavir enclave Indian Quality Escort service
9953056974 Young Call Girls In Mahavir enclave Indian Quality Escort service9953056974 Young Call Girls In Mahavir enclave Indian Quality Escort service
9953056974 Young Call Girls In Mahavir enclave Indian Quality Escort service
 

Understanding Modern Device Drivers

  • 1. Understanding Modern Device Drivers Asim Kadav and Michael M. Swift University ofWisconsin-Madison
  • 2. Why study device drivers? » Linux drivers constitute ~5 million LOC and 70% of kernel » Little exposure to this breadth of driver code from research » Better understanding of drivers can lead to better driver model » Large code base discourages major changes » Hard to generalize about driver properties » Slow architectural innovation in driver subsystems » Existing architecture: Error prone drivers » Many developers, privileged execution, C language » Recipe for complex system with reliability problems 2
  • 3. Our view of drivers is narrow » Driver research is focused on reliability » Focus limited to fault/bug detection and tolerance » Little attention to architecture/structure » Driver research only explores a small set of drivers » Systems evaluate with mature drivers » Volume of driver code limits breadth » Necessary to review current drivers in modern settings 3
  • 4. Difficult to validate research on all drivers Improvement System Validation Drivers Bus Classes New functionality Shadow driver migration [OSR09] 1 1 1 RevNIC [Eurosys 10] 1 1 1 Reliability Nooks [SOSP 03] 6 1 2 XFI [ OSDI 06] 2 1 1 CuriOS [OSDI 08] 2 1 2 Type Safety SafeDrive [OSDI 06] 6 2 3 Singularity [Eurosys 06] 1 1 1 Specification Nexus [OSDI 08] 2 1 2 Termite [SOSP 09] 2 1 2 Static analysis tools SDV [Eurosys 06] All All All Carburizer [SOSP 09] All/1 All All Cocinelle [Eurosys 08] All All All Device availability/slow driver development restrict our research runtime solutions to a small set of drivers 4
  • 5. Improvement System Validation Drivers Bus Classes New functionality Shadow driver migration [OSR09] 1 1 1 RevNIC [Eurosys 10] 1 1 1 Reliability Nooks [SOSP 03] 6 1 2 XFI [ OSDI 06] 2 1 1 CuriOS [OSDI 08] 2 1 2 Type Safety SafeDrive [OSDI 06] 6 2 3 Singularity [Eurosys 06] 1 1 1 Specification Nexus [OSDI 08] 2 1 2 Termite [SOSP 09] 2 1 2 Static analysis tools SDV [Eurosys 06] All All All Carburizer [SOSP 09] All/1 All All Cocinelle [Eurosys 08] All All All Difficult to validate research on all drivers 5 “...Please do not misuse these tools!(Coverity).... If you focus too much on fixing the problems quickly rather than fixing them cleanly, then we forever lose the opportunity to clean our code, because the problems will then be hidden.” LKML mailing list http://lkml.org/lkml/2005/3/27/131
  • 6. Understanding Modern Device Drivers » Study source of all Linux drivers for x86 (~3200 drivers) » Understand properties of driver code » What are common code characteristics? » Do driver research assumptions generalize? » Understand driver interactions with outside world » Can drivers be easily re-architected or migrated ? » Can we develop more efficient fault-isolation mechanisms? » Understand driver code similarity » Do we really need all 5 million lines of code? » Can we build better abstractions? 6
  • 8. Methodology of our study » Target Linux 2.6.37.6 (May 2011) kernel » Use static source analyses to gather information » Perform multiple dataflow/control-flow analyses » Detect driver properties of the drive code » Detect driver code interactions with environment » Detect driver code similarities within classes 8
  • 9. Extract driver wide properties for individual drivers 9 Step 1: Determine driver code characteristics for each driver from driver data structures registered with the kernel
  • 10. Determine code characteristics of each driver function Step 2: Propagate the required information to driver functions and collect information about each function 10
  • 11. Determining interactions of each driver function 11 Step 3: Determine driver interactions from I/O operations and calls to kernel and bus for each function and propagate to entry points
  • 12. Outline Methodology Driver code characteristics Driver interactions Driver redundancy 12
  • 13. Part 1: Driver Code Behavior A device driver can be thought of as a translator. Its input consists of high level commands such as “retrieve block 123”. Its output consists of low level, hardware specific instructions that are used by the hardware controller, which interfaces the I/O device to the rest of the system. -- Operating SystemConceptsVIII edition Driver code complexity and size is assumed to be a result of its I/O function. 13
  • 14. » Core I/O & interrupts – 23% » Initialization/cleanup – 36 % » Device configuration – 15% » Power management – 7.4% » Device ioctl – 6.2% 1-a) Driver Code Characteristics 14
  • 15. » Core I/O & interrupts – 23% » Initialization/cleanup – 36 % » Device configuration – 15% » Power management – 7.4% » Device ioctl – 6.2% Driver Code Characteristics 15 Only 23% of driver code is dedicated to I/O and interrupts
  • 16. » Core I/O & interrupts – 23% » Initialization/cleanup – 36 % » Device configuration – 15% » Power management – 7.4% » Device ioctl – 6.2% Driver Code Characteristics 16 Driver code complexity stems mostly from initialization/cleanup code.
  • 17. » Core I/O & interrupts – 23% » Initialization/cleanup – 36 % » Device configuration – 15% » Power management – 7.4% » Device ioctl – 6.2% Driver Code Characteristics 17 Better ways needed to manage device configuration code
  • 18. 1-b) Do drivers belong to classes? » Drivers registers a class interface with kernel » Example: Ethernet drivers register with bus and net device library » Class definition includes: » Callbacks registered with the bus, device and kernel subsystem » ExportedAPIs of the kernel to use kernel resources and services » Most research assumes drivers obey class behavior 18
  • 19. Class definition used to record state » Modern research assumes drivers conform to class behavior » Example: Driver recovery (Shadow drivers[OSDI 04] ) » Driver state is recorded based on interfaces defined by class » State is replayed upon restart after failure to restore state Figure from Shadow drivers paper 19 Non-class behavior can lead to incomplete restore after failure
  • 20. Do drivers belong to classes? » Non-class behavior stems from: » Load time parameters, unique ioctls, procfs and sysfs interactions ... qlcnic_sysfs_write_esw_config (...) { ... switch (esw_cfg[i].op_mode) { case QLCNIC_PORT_DEFAULTS: qlcnic_set_eswitch_...(...,&esw_cfg[i]); ... case QLCNIC_ADD_VLAN: qlcnic_set_vlan_config(...,&esw_cfg[i]); ... case QLCNIC_DEL_VLAN: esw_cfg[i].vlan_id = 0; qlcnic_set_vlan_config(...,&esw_cfg[i]); ... Drivers/net/qlcnic/qlcnic_main.c: Qlogic driver(network class) 21
  • 21. Many drivers do not conform to class definition » Results as measured by our analyses: » 16% of drivers use proc /sysfs support » 36% of drivers use load time parameters » 16% of drivers use ioctl that may include non-standard behavior » Breaks systems that assume driver semantics can be completely determined from class behavior Overall, 44% of drivers do not conform to class behavior Systems based on class definitions may not work properly when such non-class extensions are used 22
  • 22. 1-c) Do drivers perform significant processing? » Drivers are considered only a conduit of data » Example: Synthesis of drivers (Termite[SOSP09]) » State machine model only allows passing of data » Does not support transformations/processing » But: drivers perform checksums for RAID, networking, or calculate display geometry data inVMs 23
  • 23. Instances of processing loops in drivers static u8 e1000_calculate_checksum(...) { u32 i; u8 sum = 0; ... for (i = 0; i < length; i++) sum += buffer[i]; return (u8) (0 - sum); } drivers/net/e1000e/lib.c: e1000e network driver » Detect loops in driver code that: » do no I/O, » do not interact with kernel » lie on the core I/O path 24
  • 24. Many instances of processing across classes static void _cx18_process_vbi_data(...) { // Process header & check endianess // Obtain RAW and sliced VBI data // Compress data, remove spaces, insert mpg info. } void cx18_process_vbi_data(...) { // Loop over incoming buffer // and call above function } drivers/media/video/cx18/cx18-vbi.c:cx18 IVTV driver 25
  • 25. Drivers do perform processing of data » Processing results from our analyses: » 15% of all drivers perform processing » 28% of sound and network drivers perform processing » Driver behavior models should include processing semantics » Implications in automatic generation of driver code » Implications in accounting for CPU time in virtualized environment Driver behavior models should consider processing 26
  • 26. Outline Methodology Driver code characteristics Driver interactions Driver redundancy 27
  • 27. Part 2: Driver interactions a)What are the opportunities to redesign drivers? » Can we learn from drivers that communicate efficiently? » Can driver code be moved to user mode, aVM, or the device for improved performance/reliability? b) How portable are modern device drivers? » What are the kernel services drivers most rely on? c) Can we develop more efficient fault-tolerance mechanisms? » Study drivers interaction with kernel, bus, device, concurrency 28
  • 28. 0 50 100 150 200 250 device library kernel services kernel library synchronization memory 2-a) Driver kernel interaction 29 Calls/driverfromallentrypoints
  • 29. 0 50 100 150 200 250 device library kernel services kernel library synchronization memory Driver kernel interaction 30 Calls/driverfromallentrypoints Common drivers invoking device specific routines reduces driver code significantly (and more classes can benefit)
  • 30. 0 50 100 150 200 250 device library kernel services kernel library synchronization memory Driver kernel interaction 31 Calls/driverfromallentrypoints Many classes are portable: Limited interaction with device library and kernel services
  • 31. 2-b) Driver-bus interaction » Compare driver structure across buses » Look for lessons in driver simplicity and performance » Can they support new architectures to move drivers out of kernel? » Efficiency of bus interfaces (higher devices/driver)  Interface standardization helps move code away from kernel » Granularity of interaction with kernel/device when using a bus  Coarse grained interface helps move code away from kernel 32
  • 32. PCI drivers: Fine grained & few devices/driver » PCI drivers have fine grained access to kernel and device » Support low number of devices per driver (same vendor) » Support performance sensitive devices » Provide little isolation due to heavy interaction with kernel » Extend support for a device with a completely new driver 33 BUS Kernel Interactions (network drivers) Device Interactions (network drivers) mem sync dev lib kern lib services port/mmio DMA bus Devices/driver PCI 29.3 91.1 46.7 103 12 302 22 40.4 9.6
  • 33. USB: Coarse grained & higher devices/driver » USB devices support far more devices/driver » Bus offers significant functionality enabling standardization » Simpler drivers (like, DMA via bus) with coarse grained access » Extend device specific functionality for most drivers by only providing code for extra features 34 BUS Kernel Interactions (network drivers) Device Interactions (network drivers) mem sync dev lib kern lib services port/mmio DMA bus Devices/driver PCI 29.3 91.1 46.7 103 12 302 22 40.4 9.6 USB 24.5 72.7 10.8 25.3 11.5 0.0 6.2* 36.0 15.5 * accessed via bus
  • 34. Xen : Extreme standardization, limit device features BUS Kernel Interactions (network drivers) Device Interactions (network drivers) mem sync dev lib kern lib services port/mmio DMA bus Devices/driver PCI 29.3 91.1 46.7 103 12 302 22 40.4 9.6 USB 24.5 72.7 10.8 25.3 11.5 0.0 6.2* 36.0 15.5 Xen 11.0 7.0 27.0 7.0 7.0 0.0 0.0 24.0 1/All » Xen represents extreme in device standardization » Xen can support very high number of devices/driver » Device functionality limited to a set of standard features » Non-standard device features accessed from domain executing the driver Efficient remote access to devices and efficient device driver support offered by USB and Xen 35
  • 35. Outline Methodology Driver code characteristics Driver interactions Driver redundancy 36
  • 36. Part 3: Can we reduce the amount of driver code? » Are 5 million lines of code needed to support all devices? » Are there opportunities for better abstractions? » Better abstractions reduce incidence of bugs » Better abstractions improve software composability » Goal: Identify the missing abstraction types in drivers » Quantify the savings by using better abstractions » Identify opportunities for improving abstractions/interfaces 37
  • 37. Finding out similar code in drivers Determine similar driver code by identifying clusters of code that invoke similar device, kernel interactions and driver operations 38 Reduce each function to statement type, edit distance coordinates Reduce every function to a single signature values 1.2356 Compare signature values for all driver functions in a class To improve accuracy, weigh statement types, limit comparisons to classes 1.56
  • 38. Drivers within subclasses often differ by reg values .. nv_mcp55_thaw(...) { void __iomem *mmio_base = ap->host- >iomap[NV_MMIO_BAR]; int shift = ap->port_no * NV_INT_PORT_SHIFT_MCP55; ... writel(NV_INT_ALL_MCP55 << shift, mmio_base+NV_INT_STATUS_MCP55); mask = readl(mmio_base + NV_INT_ENABLE_MCP55); mask |= (NV_INT_MASK_MCP55 << shift); writel(mask, mmio_base + NV_INT_ENABLE_MCP55); .. nv_ck804_thaw(...) { void __iomem *mmio_base = ap- >host->iomap[NV_MMIO_BAR]; int shift = ap->port_no * NV_INT_PORT_SHIFT; ... writeb(NV_INT_ALL << shift, mmio_base + NV_INT_STATUS_CK804); mask = readb(mmio_base + NV_INT_ENABLE_CK804); mask |= (NV_INT_MASK << shift); writeb(mask, mmio_base + NV_INT_ENABLE_CK804); drivers/ata/sata_nv.c 39
  • 39. Wrappers around device/bus functions static int nv_pre_reset(...) {.. struct pci_bits nv_enable_bits[] = { { 0x50, 1, 0x02, 0x02 }, { 0x50, 1, 0x01, 0x01 } }; struct ata_port *ap = link->ap; struct pci_dev *pdev = to_pci_dev(...); if (!pci_test_config_bits (pdev,&nv_enable_bits[ap- >port_no])) return -ENOENT; return ata_sff_prereset(..); } static int amd_pre_reset(...) {.. struct pci_bits amd_enable_bits[] = { { 0x40, 1, 0x02, 0x02 }, { 0x40, 1, 0x01, 0x01 } }; struct ata_port *ap = link->ap; struct pci_dev *pdev = to_pci_dev(...); if (!pci_test_config_bits (pdev,&amd_enable_bits[ap- >port_no])) return -ENOENT; return ata_sff_prereset(..); } drivers/ata/pata_amd.c 40
  • 40. Significant opportunities to improve abstractions » At least 8% of all driver code is similar to other code 41 Sources of redundancy Potential applicable solutions Calls to device/bus with different register values Table/data driven programming models Wrappers around kernel/device library calls Procedural abstraction for device classes Code in family of devices from one vendor Layered design/subclass libraries
  • 41. Conclusions » Many driver assumptions do not hold » Bulk of driver code dedicated to initialization/cleanup » 44% of drivers have behavior outside class definition » 15% of drivers perform computation over drivers » USB/Xen drivers can be offered as services away from kernel » 8% of driver code can be reduced by better abstractions » More results in the paper! 42
  • 42. ThankYou Contact » Email » kadav@cs.wisc.edu » Driver research webpage » http://cs.wisc.edu/sonar ata (1%) cdrom ide md (RAID) mmc network RAID mtd (1.5%) scsi (9.6%)floppy tape acpi blue tooth crypto fire wire gpu (3.9%) input joy stick key board mouse touch screentablet game port serio leds media (10.5%) isdn (3.4%) sound (10%) pcm midi mixer thermal tty char (52%) block (16%) net (27%) other (5%) atm ethernet infiniband wireless wimax token ring Linux Device Drivers gpio tpm serial display lcd back light video (5.2%) pata disk sata disk fiber channel iscsi usb-storageosd raid drm vga bus drivers xen/lguest dma/pci libs video radio digital video broadcasting wan uwb driver libraries 43 Taxonomy of Linux drivers developed using static analysis to find out important classes for all our results (details in the paper)
  • 44. Drivers repeat functionality around kernel wrappers ... delkin_cb_resume(...) { struct ide_host *host = pci_get_drvdata(dev); int rc; pci_set_power_state(dev, PCI_D0); rc = pci_enable_device(dev); if (rc) return rc; pci_restore_state(dev); pci_set_master(dev); if (host->init_chipset) host->init_chipset(dev); return 0; } ... ide_pci_resume(...) { struct ide_host *host = pci_get_drvdata(dev); int rc; pci_set_power_state(dev, PCI_D0); rc = pci_enable_device(dev); if (rc) return rc; pci_restore_state(dev); pci_set_master(dev); if (host->init_chipset) host->init_chipset(dev); return 0; } drivers/ide/ide.c 45 drivers/delkin_cb.c
  • 45. Drivers covered by our analysis • All drivers that compile on x86 platform in Linux 2.6.37.6 • Consider driver, bus and virtual drivers • Skip drivers/staging directory – Incomplete/buggy drivers may skew analysis • Non x86 drivers may have similar kernel interactions • Windows drivers may have similar device interactions – New driver model introduced (WDM), improvement over vxd 46
  • 46. Limitations of our analyses • Hard to be sound/complete over ALL Linux drivers • Examples of incomplete/unsound behavior – Driver maintains private structures to perform tasks and exposes opaque operations to the kernel 47
  • 47. Repeated code in family of devices (e.g initialization) ... asd_aic9405_setup(...) { int err = asd_common_setup(...); if (err) return err; asd_ha->hw_prof.addr_range = 4; asd_ha->hw_prof.port_name... = 0; asd_ha->hw_prof.dev_name... = 4; asd_ha->hw_prof.sata_name... = 8; return 0; } ... asd_aic9410_setup(...) { int err = asd_common_setup(...); if (err) return err; asd_ha->hw_prof.addr_range = 8; asd_ha->hw_prof.port_name_...= 0; asd_ha->hw_prof.dev_name_... = 8; asd_ha->hw_prof.sata_name_...= 16; return 0; } drivers/scsi/aic94xx driver 48
  • 48. How many devices does a driver support? • Many research projects generate code for specific device/driver • Example, safety specifications for a specific driver 49
  • 49. How many devices does a driver support? static int __devinit cy_pci_probe(...) { if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo) { ... if (pci_resource_flags(pdev,2)&IORESOURCE_IO){ ... if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo || device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) {... }else if (device_id==PCI_DEVICE_ID_CYCLOM_Z_Hi) .... if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo || device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) { switch (plx_ver) { case PLX_9050: … default: /* Old boards, use PLX_9060 */ } drivers/char/cyclades.c: Cyclades character driver 50
  • 50. How many devices does a driver support? 0 5 10 15 20 25 30 35 40 acpi bluetooth crypto firewire gpio gpu hwmon input isdn leds media misc parport pnp serial sound video watchdog ata ide md mtd scsi atm infiniband net uwb Chipsets per drivers 28% of drivers support more than one chipset 51
  • 51. How many devices does a driver support? 28% of drivers support more than one chipset 83% of the total devices are supported by these drivers • Linux drivers support ~14000 devices with 3200 drivers • Number of chipsets weakly correlated to the size of the driver (not just initialization code) • Introduces complexity in driver code • Any system that generates unique drivers/specs per chipset will lead in expansion in code 52
  • 52. Driver device interaction 0 20 40 60 80 100 120 140 160 acpi bluetooth crypto firewire gpio gpu hwmon input isdn leds media misc parport pnp serial sound video watchdog ata ide md mtd scsi atm infiniband net uwb bus DMA portio/mmio • Portio/mmio: Access to memory mapped I/O or x86 ports • DMA:When pages are mapped • Bus:When bus actions are invoked • Varying style of interactions • Varying frequency of operations 53
  • 53. Class definition used to record state » Modern research assumes drivers conform to class behavior » Driver state is recorded based on interfaces defined by class » State is replayed upon restart after failure to restore state 54 » Driver behavior is reverse engineered based on interfaces defined by class » Code is synthesized for another OS based on this behavior

Notas del editor

  1. First, we find that only 23% of overall driver code is dedicated to perform core I/O and interrupt processing. This means bulk of code in a driver is not towards core I/O and hence driver improvement should also look at non I/O code for improving the quality of drivers.
  2. Next, we find that majority of driver code – about 36% is dedicated towards driver initialization and cleanup. Efforts at reducing the complexity of drivers should also focus on better mechanisms for driver initialization and cleanup. For example, as devices are increasingly becoming virtualization aware, quick ways to initialize devices are critical for important I/O virtualization features such as re-assignment of devices.
  3. We also find, that the device configuration is the third biggest contributor to driver code. Network and video drivers have upto 30% of their code as device configuration. OS research should also look at better mechanisms for managing shared configuration code. About 6% of driver code is also exposed as opaque iocts. There are oppurtunites to make better interfaces and present more informed view of this part of configuration code to the kernel
  4. We next look at whether drivers can be described based on their class definitions. Most drivers register a class interface with kernel to utilize device library services of that class. For example, PCI network drivers register with the network device subsystem and PCI bus subsystem to use its services. It is often assumed that drivers will behave within the boundaries of the class definition and the complete semantics of drivers can be understood by its registered calls to and from the kernel. However, many vendors introduce non-class behavior in driver to introduce non-standard features for competetive advantage in their products.
  5. Most research assumes that drivers observe class behavior. For example, shadow drivers which automatically recovers device state after failures, records driver state based on class definition. It then replays this state upon failure, to bring back the driver to its previous state. ENTER. Non class behavior can lead to incomplete restore after failure since the state via non-class behavior is not recorded
  6. Another example is reverse engineering of drivers.For example, a recent system, RevNIC records driver behavior state for one operating system and synthesizes it for another operating system by observing the traces. The traces are generated by invoking driver operations based on class behavior.PRESS Hence, non class behavior can lead to synthesis of incomplete driver.----- Meeting Notes (3/1/12 16:20) -----Drop this revnic
  7. In Linux drivers, non class behavior manifests as load time parameters to the driver, unique ioctols to the device and interactions with the sys and proc file system. For, example, the Qlogic network driver shown in the figure, was detected by our analysis as an example of non-class behavior. The driver configuration settings are read from the sysfs and appropriate driver functions are called to change the driver state. This behavior is not recorded or invoked if one is only tracking class behavior operations.
  8. We used our analyses to identify such behavior across all drivers and find that code supporting /proc and /sys is present in 16% of drivers. 36% of drivers have atleast one parameter to control behavior and configuration options not available through the class interface. Additionally, 16% of driver code contains ioctl, which can cause non-class behavior.Overall, 44% of drivers use one of the first two non-class features and such code breaks systems that use class behavior to interpret the semantics of drivers
  9. Another common assumption is that drivers perform little processing and just shuttle data between OS and device. For example, automatic synthesis of drivers only allows operations primarily based on communicating data. It does not support memory transformations or processing made by drivers. However, if drivers perform processing for example to compute checksums for RAID, or to calculate display data, then automatic synthesis is unable to generate code for these parts of the driver
  10. In order to detect processing, we detect loops in driver code that do not perform I/O, do not interact with kernel and lie on the core I/O path. The goal here was to detect driver code that transforms incoming or outgoing driver data in a loop without invoking a kernel service or making device calls. ENTER For example, in this figure, in the processing instance detected by our driver, we can see that the network driver is computing checksum for the network packets.
  11. We also find other classes of drivers that perform processing. Here in this figure, we can see video processing being done by media drivers on the incoming video data. Other forms of processing include, wireless drivers which use processing to calculate power levels at different frequencies. Even CDROM drivers, use computation to analyze table of content information for CD-ROMS
  12. We also see that higher percentage of network and sound drivers perform processing. These results have implications in not just automatic generation of drivers but also in virtualized settings where heavy I/O from one guest VM can substantially reduce CPU for other guest VMs without proper accounting.
  13. We next looks at couple of results from our driver interactions study.
  14. In this section, we look at how drivers use the kernel and how drivers communicate with devices? We see three reasons to study these interactions. First, extra processing power on devices or extra cores on host CPU provide an oppurtunity to redesign the driver architecture for improved reliability and performanceSecond, much of the difficulty in moving drivers comes from the driver/kernel interface, so investigating what drivers request from kernel can aid in designing more portable drivers. Third the cost of isolation and reliability are proportional to the size of the interface and the frequency of interactions, so understanding the interface can lead to more efficient fault tolerance mechanisms
  15. We use our analyses to detect driver interactions with the kernel. The yaxis.. We classify these invocations based on 5 categories using static analysis: First is :Memory management (e.g. allocation): Second is Synchronization (e.g. Locks), Third is Kernel Library (generic stateless support routines – like timers, checksums, reporting etc. Fourth is Kernel Services (access to other subsystems like vfs, cpu, etc)Finally,Device Library (device subsystem supporting a class such as the network drivers)
  16. While we expect diversity in kernel interaction, we see that some of the drivers such as ATA, IDE, gpio, drivers make limited use of kernel services.We look closely and find that in these drivers, rather than having a driver that invokes support routines, these drivers are a small set of device specific routines called from a much larger common driver. This design is similar to miniport drivers in Windows. ENTERConverting more drivers into this architecture can be benefical in reducing driver code as we see in the last part of the talk----- Meeting Notes (3/1/12 16:20) -----remove uwbdouble check acpi and gpio (and thats why they have simple)
  17. We next look at portability of drivers? We look at what does the driver need the kernel for? If we want to run driver code elsewhere, such as user-mode, what does it need?Device library and kernel services require core kernel features which can be difficult to provide outside the kernel.Drivers with rich device library support are fairly limited (like network and sound) while other drivers such as video drivers have limited device library support and are more commonFrom our results, we see that most invocations are for kernel library routines, memory management and synchronization which are primary local to the driver and a driver executing in a separate execution context will not need to call into the kernel for these services. ENTER. Hence many driver classes such as crypto, firewire, media, mtd are portable to other environments.
  18. We now study structural properties of drivers to identify differences between buses. We look for lessons on driver simplicity and performance. And review which buses support newer architectures that move drivers out of the kernel. We do so by looking at interface standardization and granularity of accesses across drivers from different buses. Both features are good indicators of portability of driver code
  19. We first look to quantify efficiency of PCI devices. We intentionally pick a single class and compare how devices belong to a single class differ according to the bus. The table shows kernal and device interactions across all entrypoints for network drivers. The data about all classes is in the paper. PCI devices have fine grained and heavy access to kernel and driver. They support only 10 devices per driver which are usually from the same vendor. In order to support a new device, in most cases, one needs to write a new driver.Hence, we see that high performance of PCI drivers comes at a cost: increased driver complexity, and less interface standardization, and supporting a new device usually means writing a new driver
  20. USB drivers are slightly more efficient and support almost 60% as many devices per driver often from many vendors. While the USB standardization efforts have been instrumental in increasing the bus efficiency The coarse grained interface to kernel and device offered by the bus also helps reducing driver code and produces better drivers. Here, a vendor can add non-standard code just for the features without creating new drivers in order to support a new device.
  21. Xen pushes standardization further by supporting all drivers of a class using a single driver in the guest domain. Additional non-standard features can only be accessed from the domain executing the driver and are not available to guest OS. Hence, XEN can be more efficient than USB but one loses the ability to support non-standard driver code. Addition of non-standard behavior requires separate messaging protocol from outside the driver such as RPC. These results imply that Xen and USB provide interface standardization that could help move driver code away from the kernel and also provide a coarse grained accesses, reducing the cost of isolation.
  22. I will now talk about redundancy in driver code
  23. Given that all the drivers for a class perform essentially the same task, one may ask why so much code is needed. The problem of writing similar/repeated code is well documented. It causes bugs, prevents standardization and causes maintainability issues. Our goal in this section is to quantify the repeated code in drivers and what are the missing abstractions in that are creating repeated code.
  24. We are not just looking for cloned code but similar code in drivers. To do so, we use an existing clustering technique from machine learning, called shape analysis, often used to cluster related documents. We generate a set of multi dimensonal coordinates representing the statement type and edit distance to represent the shape of every driver function. We then use a euclidean function to reduce these coordinates to a single signature value. This methodology helps us scale better to whole set of drivers since we are only comparing signature values. It also gives us a knob to control the amount of similarity that we wish to see by clustering signature values appropriately in the results obtained
  25. We now look at two of the most commonsimilarity types identified by our analyses. Here is an example of similar code where we see drivers invoking device by using different register values!
  26. This is an example of similar code found in drivers. We find here drivers are in many cases repeating wrappers around kernel functions in same sequence.
  27. Overall we find 8% of driver code is very similar (which is approximately 400, 000 lines!)we find three cateogaries of similar code. First is calls to device/bus with different register values. Many drivers have a similar pattern of communicating with device, except using a different register values. This can be abstracted out by using a table driven programming, where common code executes and looks up tables to invoke appropriate device. Next is wrappers around kernel libraries, where kernel libraries are either missing interfaces or provide incomplete interfaces for accomplishing a task. For example, suspending a device requires holding appropriate locks, saving state, disabling device. Such wrappers are common across large number of drivers. Providing a common procedural abstraction for these kernel functions can help reduce driver code.Finally, we also see lots of repeated code amongst family of devices within a class. Provding object oriented design features or sub class librarries can further reduce this driver code.By removing these sources, one can reduce driver code, reduce incidence of bugs and improve software composability to support newer features such as power management.
  28. To summarize, we review the large body of driver code and revisited generalizations about them and find that many assumptions about driver code do not hold. We also study interactions and reviewed how drive code can be moved away from kernel. We also, find missing interfaces in driver code, and providing them can reduce the driver code significantly.
  29. This is an example of similar code in family of drivers. We see that much of the code is same, except for difference for driver data structures for different devices.----- Meeting Notes (2/28/12 16:28) -----example is badnot initialziing is not goodlook for wrappers (before and afer calls)? Look in paper----- Meeting Notes (3/1/12 16:20) -----add ide (in delkin_cb.c)FIX swap titlesCODE CAN BE ABSTRACTED (NOT CLEAR - REPEAT WRAPPERS AROUND KENRLE FNCITONS)
  30. The Windows Driver Model, while a significant improvement over the VxD and Windows NT driver model used before it, has been criticised by driver software developers [1], most significantly for the following:WDM has a very steep learning curve.Interactions with power management events and plug and play are difficult. This leads to a variety of situations where Windows machines cannot go to sleep or wake up correctly due to bugs in driver code.I/O cancellation is almost impossible to get right.Thousands of lines of support code are required for every driver.No support for writing pure user-mode drivers.
  31. This is an example of similar code in family of drivers. We see that much of the code is same, except for difference for driver data structures for different devices.----- Meeting Notes (2/28/12 16:28) -----example is badnot initialziing is not goodlook for wrappers (before and afer calls)? Look in paper
  32. Cut out devices/driver
  33. Gpu drivers do many register reads/wrtites before performing a DMA
  34. Most research assumes that drivers observe class behavior. For example, shadow drivers which automatically recovers device state after failures, records driver state based on class definition. It then replays this state upon failure, to bring back the driver to its previous state. ENTER. Non class behavior…since the state via non-class behavior is not recorded