On Thu, Jul 17, 2014 at 06:12:43PM +0200, Michal Privoznik wrote: > This should iterate over mount tab and search for hugetlbfs among with > looking for the default value of huge pages. > > Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> > --- > src/libvirt_private.syms | 1 + > src/util/virfile.c | 155 +++++++++++++++++++++++++++++++++++++++++++++++ > src/util/virfile.h | 12 ++++ > 3 files changed, 168 insertions(+) > > diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms > index 8d3671c..44403fd 100644 > --- a/src/libvirt_private.syms > +++ b/src/libvirt_private.syms > @@ -1297,6 +1297,7 @@ virFileDirectFdFlag; > virFileExists; > virFileFclose; > virFileFdopen; > +virFileFindHugeTLBFS; > virFileFindMountPoint; > virFileFindResource; > virFileFindResourceFull; > diff --git a/src/util/virfile.c b/src/util/virfile.c > index 699b9f8..e1034b7 100644 > --- a/src/util/virfile.c > +++ b/src/util/virfile.c > > +int > +virFileGetHugepageSize(const char *path, > + unsigned long long *size) This ought to be in libvirt_private.sym too > > +int > +virFileGetHugepageSize(const char *path, > + unsigned long long *size) > +{ > + /* XXX implement me :-) */ > + VIR_WARN("Trying to get huge page size on %s is not implemented yet.", > + path); > + *size = 2048; /* Pure guess */ > + return 0; > +} Hmm, seems like we should really report an fatal error here, since I don't think it makes sense to continue QEMU startup in this scenario. > + > +# define PROC_MOUNTS "/proc/mounts" > + > +int > +virFileFindHugeTLBFS(virHugeTLBFSPtr *ret_fs, > + size_t *ret_nfs) > +{ > + int ret = -1; > + FILE *f = NULL; > + struct mntent mb; > + char mntbuf[1024]; > + virHugeTLBFSPtr fs = NULL; > + size_t nfs = 0; > + unsigned long long default_hugepagesz; > + > + if (virFileGetDefaultHugepageSize(&default_hugepagesz) < 0) > + goto cleanup; > + > + if (!(f = setmntent(PROC_MOUNTS, "r"))) { > + virReportSystemError(errno, > + _("Unable to open %s"), > + PROC_MOUNTS); > + goto cleanup; > + } > + > + while (getmntent_r(f, &mb, mntbuf, sizeof(mntbuf))) { > + virHugeTLBFSPtr tmp; > + > + if (STRNEQ(mb.mnt_type, "hugetlbfs")) > + continue; > + > + if (VIR_REALLOC_N(fs, nfs + 1) < 0) > + goto cleanup; > + > + tmp = &fs[nfs]; > + nfs++; Perhaps VIR_EXPAND_N would be nicer ? > + > + if (VIR_STRDUP(tmp->mnt_dir, mb.mnt_dir) < 0) > + goto cleanup; > + > + if (virFileGetHugepageSize(tmp->mnt_dir, &tmp->size) < 0) > + goto cleanup; > + > + tmp->deflt = tmp->size == default_hugepagesz; > + } > + > + *ret_fs = fs; > + *ret_nfs = nfs; > + fs = NULL; > + nfs = 0; > + ret = 0; > + > + cleanup: > + endmntent(f); > + while (nfs) > + VIR_FREE(fs[--nfs].mnt_dir); > + VIR_FREE(fs); > + return ret; > +} > + > +#else > + > +int > +virFileFindHugeTLBFS(virHugeTLBFSPtr *ret_fs, > + size_t *ret_nfs) > +{ > + /* XXX implement me :-) */ > + *ret_fs = NULL; > + *ret_nfs = 0; > + return 0; > +} Again report a fatal error here > +#endif /* ! defined __linux__ && defined HAVE_MNTENT_H && > + defined HAVE_GETMNTENT_R */ Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list