12
12
from lisa .executable import Tool
13
13
from lisa .features import SerialConsole
14
14
from lisa .messages import TestStatus , send_sub_test_result_message
15
- from lisa .operating_system import CBLMariner
15
+ from lisa .operating_system import CBLMariner , Ubuntu
16
16
from lisa .testsuite import TestResult
17
17
from lisa .tools import (
18
+ Cat ,
18
19
Chmod ,
19
20
Chown ,
20
21
Dmesg ,
25
26
Lsblk ,
26
27
Mkdir ,
27
28
Modprobe ,
29
+ Sed ,
28
30
Whoami ,
29
31
)
30
- from lisa .util import LisaException , find_groups_in_lines
32
+ from lisa .util import LisaException , UnsupportedDistroException , find_groups_in_lines
31
33
32
34
33
35
@dataclass
@@ -63,7 +65,8 @@ class CloudHypervisorTests(Tool):
63
65
64
66
# Block perf related env var
65
67
use_datadisk = ""
66
- disable_datadisk_cache = ""
68
+ use_pmem = ""
69
+ disable_disk_cache = ""
67
70
block_size_kb = ""
68
71
69
72
cmd_path : PurePath
@@ -164,8 +167,16 @@ def run_metrics_tests(
164
167
skip : Optional [List [str ]] = None ,
165
168
subtest_timeout : Optional [int ] = None ,
166
169
) -> None :
167
- if self .use_datadisk :
168
- self ._set_data_disk ()
170
+ disk_name = ""
171
+ if self .use_pmem :
172
+ disk_name = self ._get_pmem_for_block_tests ()
173
+ elif self .use_datadisk :
174
+ disk_name = self ._get_data_disk_for_block_tests ()
175
+
176
+ if disk_name :
177
+ self ._log .debug (f"Using disk: { disk_name } , for block tests" )
178
+ self .env_vars ["DATADISK_NAME" ] = disk_name
179
+ self ._save_kernel_logs (log_path )
169
180
170
181
if ref :
171
182
self .node .tools [Git ].checkout (ref , self .repo_root )
@@ -267,8 +278,8 @@ def _install(self) -> bool:
267
278
268
279
if self .use_datadisk :
269
280
self .env_vars ["USE_DATADISK" ] = self .use_datadisk
270
- if self .disable_datadisk_cache :
271
- self .env_vars ["DISABLE_DATADISK_CACHING" ] = self .disable_datadisk_cache
281
+ if self .disable_disk_cache :
282
+ self .env_vars ["DISABLE_DATADISK_CACHING" ] = self .disable_disk_cache
272
283
if self .block_size_kb :
273
284
self .env_vars ["PERF_BLOCK_SIZE_KB" ] = self .block_size_kb
274
285
else :
@@ -497,7 +508,53 @@ def _configure_vdpa_devices(self, node: Node) -> None:
497
508
node .tools [Chown ].change_owner (file = PurePath (device_path ), user = user )
498
509
node .tools [Chmod ].chmod (path = device_path , permission = permission , sudo = True )
499
510
500
- def _set_data_disk (self ) -> None :
511
+ def _get_pmem_for_block_tests (self ) -> str :
512
+ """
513
+ Following is the last usable entry in e829 table and is safest to use for
514
+ pmem since its most likely to be free. 0x0000001000000000 is 64G.
515
+
516
+ [ 0.000000] BIOS-e820: [mem 0x0000001000000000-0x00000040ffffffff] usable
517
+
518
+ """
519
+ memmap_str = "memmap=16G!64G"
520
+
521
+ lsblk = self .node .tools [Lsblk ]
522
+ sed = self .node .tools [Sed ]
523
+ cat = self .node .tools [Cat ]
524
+
525
+ grub_file = "/etc/default/grub"
526
+ grub_cmdline = cat .read_with_filter (
527
+ file = grub_file ,
528
+ grep_string = "GRUB_CMDLINE_LINUX=" ,
529
+ sudo = True ,
530
+ )
531
+ if memmap_str not in grub_cmdline :
532
+ sed .substitute (
533
+ file = grub_file ,
534
+ match_lines = "^GRUB_CMDLINE_LINUX=" ,
535
+ regexp = '"$' ,
536
+ replacement = ' memmap=16G!64G "' ,
537
+ sudo = True ,
538
+ )
539
+ if isinstance (self .node .os , CBLMariner ):
540
+ self .node .execute (
541
+ "grub2-mkconfig -o /boot/grub2/grub.cfg" , sudo = True , shell = True
542
+ )
543
+ elif isinstance (self .node .os , Ubuntu ):
544
+ self .node .execute ("update-grub" , sudo = True , shell = True )
545
+ else :
546
+ raise UnsupportedDistroException (
547
+ self .node .os ,
548
+ "pmem for CH tests is supported only on Ubuntu and CBLMariner" ,
549
+ )
550
+
551
+ lsblk .run ()
552
+ self .node .reboot (time_out = 900 )
553
+ lsblk .run ()
554
+
555
+ return "/dev/pmem0"
556
+
557
+ def _get_data_disk_for_block_tests (self ) -> str :
501
558
datadisk_name = ""
502
559
lsblk = self .node .tools [Lsblk ]
503
560
disks = lsblk .get_disks ()
@@ -512,8 +569,7 @@ def _set_data_disk(self) -> None:
512
569
lsblk .run ()
513
570
if not datadisk_name :
514
571
raise LisaException ("No unmounted data disk (/dev/sdX) found" )
515
- self ._log .debug (f"Using data disk: { datadisk_name } " )
516
- self .env_vars ["DATADISK_NAME" ] = datadisk_name
572
+ return datadisk_name
517
573
518
574
519
575
def extract_jsons (input_string : str ) -> List [Any ]:
0 commit comments