-
Notifications
You must be signed in to change notification settings - Fork 0
/
README
191 lines (141 loc) · 7.83 KB
/
README
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
NOTE: PMDB was an Intel research project and is not currently being maintained. For current information and instructions related to persistent memory enabling in Linux please refer to https://nvdimm.wiki.kernel.org/
===============================================================================
INTEL PERSISTENT MEMORY BLOCK DRIVER (PMBD) v0.9
===============================================================================
This software implements a block device driver for persistent memory (PM).
This module provides a block-based logical interface to manage PM that is
physically attached to the system memory bus.
The architecture is assumed as follows. Both DRAM and PM DIMMs are directly
attached to the host memory bus. The PM space is presented to the operating
system as a contiguous range of physical memory address space at the high end.
There are three major design considerations: (1) Data protection - Private
mapping is used to prevent stray pointers (in kernel/driver bugs) to
accidentally wipe off persistent PM data. (2) Data persistence - Non-temporal
store and fence instructions are used to leverage the processor store buffer
and avoid polluting the CPU cache. (3) Write ordering - Write barrier is
supported to ensure correct order of writes.
This module also includes other (experimental) features, such as PM speed
emulation, checksum for page integrity, partial page updates, write
verification, etc. Please refer to the help page of the module.
===============================================================================
COMPILING AND INSTALLING THE PMBD DRIVER
===============================================================================
1. Compile the PMBD driver:
$ make
2. Install the PMBD driver:
$ sudo make install
3. Check available driver information:
$ modinfo pmbd
NOTE: This module runs with Linux kernel 3.2.1 or 2.6.34. For other kernel
versions, please search for "KERNEL_VERSION" and change the code as needed.
===============================================================================
QUICK USER'S GUIDE OF THE PMBD DRIVER
===============================================================================
1. modify /etc/grub.conf to set the physical memory address range that
is to be simulated as PM.
Add the following to the boot option line:
memmap=<PM_SIZE_GB>G$<DRAM_SIZE_GB>G numa=off
NOTE:
PM_SIZE_GB - the PM space size (in GBs)
DRAM_SIZE_GB - the DRAM space size (in GBs)
Example:
Assuming a total memory capacity of 24GB, and if we want to use 16GB PM and
8GB DRAM, it should be "memmap=16G$8G".
2. Reboot and check if the memory size is set as expected.
$ sudo reboot; exit
$ free
3. Load the device driver module
Load the driver module into the kernel with private mapping, non-temp store,
and write barrier enabled (*** RECOMMENDED CONFIG ***):
$ modprobe pmbd mode="pmbd<PM_SIZE_GB>;hmo=<DRAM_SIZE_GB>;hms<PM_SIZE_GB>; \
pmapY;ntsY;wbY;"
Check the kernel message output:
$ dmesg
After loading the module, a block device (/dev/pma) should appear. Since
now, it can be used as any block device, such as fdisk, mkfs, etc.
4. Unload the device driver
$ rmmod pmbd
===============================================================================
OTHER CONFIGURATION OPTIONS OF THE PERSISTENT MEMORY DEVICE DRIVER MODULE
===============================================================================
usage: $ modprobe pmbd mode="pmbd<#>;hmo<#>;hms<#>;[Option1];[Option2];;.."
GENERAL OPTIONS:
pmbd<#,#..> set pmbd size (GBs)
HM|VM use high memory (HM default) or vmalloc (VM)
hmo<#> high memory starting offset (GB)
hms<#> high memory size (GBs)
pmap<Y|N> use private mapping (Y) or not (N default) - (note: must
enable HM and wrprotN)
nts<Y|N> use non-temporal store (MOVNTQ) and sfence to do memcpy (Y),
or regular memcpy (N default)
wb<Y|N> use write barrier (Y) or not (N default)
fua<Y|N> use WRITE_FUA (Y default) or not (N) (only effective for
Linux 3.2.1)
ntl<Y|N> use non-temporal load (MOVNTDQA) to do memcpy (Y), or
regular memcpy (N default) - this option enforces memory type
of write combining
SIMULATION:
simmode<#,#..> use the specified numbers to the whole device (0 default) or
PM only (1)
rdlat<#,#..> set read access latency (ns)
wrlat<#,#..> set write access latency (ns)
rdbw<#,#..> set read bandwidth (MB/sec) (if set 0, no emulation)
wrbw<#,#..> set write bandwidth (MB/sec) (if set 0, no emulation)
rdsx<#,#..> set the relative slowdown (x) for read
wrsx<#,#..> set the relative slowdown (x) for write
rdpause<#,.> set a pause (cycles per 4KB) for each read
wrpause<#,.> set a pause (cycles per 4KB) for each write
adj<#> set an adjustment to the system overhead (nanoseconds)
WRITE PROTECTION:
wrprot<Y|N> use write protection for PM pages? (Y or N)
wpmode<#,#,..> write protection mode: use the PTE change (0 default) or flip
CR0/WP bit (1)
clflush<Y|N> use clflush to flush CPU cache for each write to PM space?
(Y or N)
wrverify<Y|N> use write verification for PM pages? (Y or N)
checksum<Y|N> use checksum to protect PM pages? (Y or N)
bufsize<#,#,..> the buffer size (MBs) (0 - no buffer, at least 4MB)
bufnum<#> the number of buffers for a PMBD device (16 buffers, at least 1
if using buffer, 0 -no buffer)
bufstride<#> the number of contiguous blocks(4KB) mapped into one buffer
(bucket size for round-robin mapping) (1024 in default)
batch<#,#> the batch size (num of pages) for flushing PMBD buffer (1 means
no batching)
MISC:
mgb<Y|N> mergeable? (Y or N)
lock<Y|N> lock the on-access page to serialize accesses? (Y or N)
cache<WB|WC|UC> use which CPU cache policy? Write back (WB), Write Combined
(WB), or Uncachable (UC)
subupdate<Y|N> only update the changed cachelines of a page? (Y or N) (check
PMBD_CACHELINE_SIZE)
timestat<Y|N> enable the detailed timing statistics (/proc/pmbd/pmbdstat)?
This will cause significant performance slowdown (Y or N)
NOTE:
(1) Option rdlat/wrlat only specifies the minimum access times. Real access
times can be higher.
(2) If rdsx/wrsx is specified, the rdlat/wrlat/rdbw/wrbw would be ignored.
(3) Option simmode1 applies the simulated specification to the PM space,
rather than the whole device, which may have buffer.
WARNING:
(1) When using simmode1 to simulate slow-speed PM space, soft lockup warning
may appear. Use "nosoftlockup" boot option to disable it.
(2) Enabling timestat may cause performance degradation.
(3) FUA is supported in Linux 3.2.1, but if buffer is used (for PT based
protection), enabling FUA lowers performance due to double writes.
(4) No support for changing CPU cache related PTE attributes for VM-based PMBD
in Linux 3.2.1 (RCU stalls).
PROC ENTRIES:
/proc/pmbd/pmbdcfg: config info about the PMBD devices
/proc/pmbd/pmbdstat: statistics of the PMBD devices (if timestat is enabled)
EXAMPLE:
Assuming a 16GB PM space with physical memory addresses from 8GB to 24GB:
(1) Basic (Ramdisk):
$ sudo modprobe pmbd mode="pmbd16;hmo8;hms16;"
(2) Protected (with private mapping):
$ sudo modprobe pmbd mode="pmbd16;hmo8;hms16;pmapY;"
(3) Protected and synced (with private mapping, non-temp store):
$ sudo modprobe pmbd mode="pmbd16;hmo8;hms16;pmapY;ntsY;"
(4) *** RECOMMENDED CONFIGURATION ***
Protected, synced, and ordered (with private mapping, nt-store, write
barrier):
$ sudo modprobe pmbd mode="pmbd16;hmo8;hms16;pmapY;ntsY;wbY;"