@@ -102,30 +102,20 @@ static u64 get_hugepage_blk_size(const char *htlbfs_path)
return sfs.f_bsize;
}
-static void *mmap_hugetlbfs(struct kvm *kvm, const char *htlbfs_path, u64 size)
+static void *mmap_hugetlbfs(struct kvm *kvm, const char *htlbfs_path, u64 size, u64 blk_size)
{
const char *name = "kvmtool";
unsigned int flags = 0;
int fd;
void *addr;
- u64 blk_size;
- int htsize;
+ int htsize = __builtin_ctzl(blk_size);
- blk_size = get_hugepage_blk_size(htlbfs_path);
- if (blk_size == 0 || blk_size > size) {
- die("Can't use hugetlbfs pagesize %lld for mem size %lld\n",
- (unsigned long long)blk_size, (unsigned long long)size);
- }
-
- htsize = __builtin_ctzl(blk_size);
if ((1ULL << htsize) != blk_size)
die("Hugepage size must be a power of 2.\n");
flags |= MFD_HUGETLB;
flags |= htsize << MFD_HUGE_SHIFT;
- kvm->ram_pagesize = blk_size;
-
fd = memfd_create(name, flags);
if (fd < 0)
die("Can't memfd_create for hugetlbfs map\n");
@@ -141,13 +131,23 @@ static void *mmap_hugetlbfs(struct kvm *kvm, const char *htlbfs_path, u64 size)
/* This function wraps the decision between hugetlbfs map (if requested) or normal mmap */
void *mmap_anon_or_hugetlbfs(struct kvm *kvm, const char *htlbfs_path, u64 size)
{
- if (htlbfs_path)
- /*
- * We don't /need/ to map guest RAM from hugetlbfs, but we do so
- * if the user specifies a hugetlbfs path.
- */
- return mmap_hugetlbfs(kvm, htlbfs_path, size);
- else {
+ u64 blk_size = 0;
+
+ /*
+ * We don't /need/ to map guest RAM from hugetlbfs, but we do so
+ * if the user specifies a hugetlbfs path.
+ */
+ if (htlbfs_path) {
+ blk_size = get_hugepage_blk_size(htlbfs_path);
+
+ if (blk_size == 0 || blk_size > size) {
+ die("Can't use hugetlbfs pagesize %lld for mem size %lld\n",
+ (unsigned long long)blk_size, (unsigned long long)size);
+ }
+
+ kvm->ram_pagesize = blk_size;
+ return mmap_hugetlbfs(kvm, htlbfs_path, size, blk_size);
+ } else {
kvm->ram_pagesize = getpagesize();
return mmap(NULL, size, PROT_RW, MAP_ANON_NORESERVE, -1, 0);
}
This is the first step of making this function more generic. The main purpose of this patch is to make it easier to review the next one. No functional change intended. Signed-off-by: Fuad Tabba <tabba@google.com> --- util/util.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-)