From: Michal Privoznik Date: Wed, 6 Aug 2014 08:37:48 +0000 (+0200) Subject: qemu: Make virFileFindHugeTLBFS fault tolerant X-Git-Tag: v1.2.8-rc1~234 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d26e810838fad49294c6650ed05e8145ae6bb2ba;p=thirdparty%2Flibvirt.git qemu: Make virFileFindHugeTLBFS fault tolerant Since commit be0782e1 we are parsing /proc/meminfo to find out the default huge page size. However, if the host we are running at does not support any huge pages (e.g. CONFIG_HUGETLB_PAGE is turned off), we will not successfully parse the meminfo file and hence the whole qemu driver init process fails. Moreover, the default huge page size is needed if and only if there's at least one hugetlbfs mount point. So the fix consists of moving the virFileGetDefaultHugepageSize function call after the first hugetlbfs mount point is found. With this fix, we fail to start with one or more hugetlbfs mounts and malformed meminfo file, but that's expected (how can one mount hugetlbfs without kernel supporting huge pages?). Workaround in that case is to umount all the hugetlbfs mounts. Reported-by: Jim Fehlig Signed-off-by: Michal Privoznik --- diff --git a/src/util/virfile.c b/src/util/virfile.c index 9863fd0001..f9efc65eb0 100644 --- a/src/util/virfile.c +++ b/src/util/virfile.c @@ -2990,10 +2990,7 @@ virFileFindHugeTLBFS(virHugeTLBFSPtr *ret_fs, char mntbuf[1024]; virHugeTLBFSPtr fs = NULL; size_t nfs = 0; - unsigned long long default_hugepagesz; - - if (virFileGetDefaultHugepageSize(&default_hugepagesz) < 0) - goto cleanup; + unsigned long long default_hugepagesz = 0; if (!(f = setmntent(PROC_MOUNTS, "r"))) { virReportSystemError(errno, @@ -3019,6 +3016,10 @@ virFileFindHugeTLBFS(virHugeTLBFSPtr *ret_fs, if (virFileGetHugepageSize(tmp->mnt_dir, &tmp->size) < 0) goto cleanup; + if (!default_hugepagesz && + virFileGetDefaultHugepageSize(&default_hugepagesz) < 0) + goto cleanup; + tmp->deflt = tmp->size == default_hugepagesz; }