base: add hugepages argument

hugepages (--hugepages) argument will be passed down to arch layer so that
it can configure GuestMemory to support Transparent Huge Pages.

BUG=b:174206107
TEST=arc.Boot.vm on hatch-arc-r

Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Change-Id: I1590238f7be3f12c9aa22b4c9061a56bfc381332
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2812544
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Chirantan Ekbote <chirantan@chromium.org>
diff --git a/arch/src/lib.rs b/arch/src/lib.rs
index 3c67757..5070e72 100644
--- a/arch/src/lib.rs
+++ b/arch/src/lib.rs
@@ -79,6 +79,7 @@
     pub vcpu_count: usize,
     pub vcpu_affinity: Option<VcpuAffinity>,
     pub no_smt: bool,
+    pub hugepages: bool,
     pub vm_image: VmImage,
     pub android_fstab: Option<File>,
     pub pstore: Option<Pstore>,
diff --git a/src/crosvm.rs b/src/crosvm.rs
index e691438..7a4318a 100644
--- a/src/crosvm.rs
+++ b/src/crosvm.rs
@@ -201,6 +201,7 @@
     pub vcpu_affinity: Option<VcpuAffinity>,
     pub no_smt: bool,
     pub memory: Option<u64>,
+    pub hugepages: bool,
     pub memory_file: Option<PathBuf>,
     pub executable_path: Option<Executable>,
     pub android_fstab: Option<PathBuf>,
@@ -276,6 +277,7 @@
             vcpu_affinity: None,
             no_smt: false,
             memory: None,
+            hugepages: false,
             memory_file: None,
             executable_path: None,
             android_fstab: None,
diff --git a/src/linux.rs b/src/linux.rs
index 43a496d..b78d4ea 100644
--- a/src/linux.rs
+++ b/src/linux.rs
@@ -2335,6 +2335,7 @@
         vcpu_count: cfg.vcpu_count.unwrap_or(1),
         vcpu_affinity: cfg.vcpu_affinity.clone(),
         no_smt: cfg.no_smt,
+        hugepages: cfg.hugepages,
         vm_image,
         android_fstab: cfg
             .android_fstab
diff --git a/src/main.rs b/src/main.rs
index e48cbaf..e86845a 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -866,6 +866,9 @@
                         })?,
                 )
         }
+        "hugepages" => {
+            cfg.hugepages = true;
+        }
         #[cfg(feature = "audio")]
         "ac97" => {
             let ac97_params = parse_ac97_options(value.unwrap())?;
@@ -1825,6 +1828,7 @@
                                 "mem",
                                 "N",
                                 "Amount of guest memory in MiB. (default: 256)"),
+          Argument::flag("hugepages", "Advise the kernel to use Huge Pages for guest memory mappings."),
           Argument::short_value('r',
                                 "root",
                                 "PATH[,key=value[,key=value[,...]]",