# Copyright 1999-2015 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 EAPI="5" PYTHON_COMPAT=( python2_7 ) inherit eutils multilib toolchain-funcs perl-functions python-any-r1 DESCRIPTION="easy hugepage access" HOMEPAGE="https://github.com/libhugetlbfs/libhugetlbfs" SRC_URI="https://github.com/libhugetlbfs/libhugetlbfs/archive/${PV}.tar.gz -> ${P}.tar.gz" LICENSE="GPL-2" SLOT="0" KEYWORDS="~amd64 ~arm ~arm64 ~ppc ~ppc64 ~s390 ~x86" IUSE="perl static-libs test" DEPEND="test? ( ${PYTHON_DEPS} )" RDEPEND="perl? ( dev-lang/perl:= )" src_prepare() { perl_set_version epatch "${FILESDIR}"/${PN}-2.9-build.patch #332517 epatch "${FILESDIR}"/${PN}-2.20-noexec-stack.patch epatch "${FILESDIR}"/${PN}-2.6-fixup-testsuite.patch sed -i \ -e '/^PREFIX/s:/local::' \ -e '1iBUILDTYPE = NATIVEONLY' \ -e '1iV = 1' \ -e '/gzip.*MANDIR/d' \ -e "/^LIB\(32\)/s:=.*:= $(get_libdir):" \ -e '/^CC\(32\|64\)/s:=.*:= $(CC):' \ -e "/^PMDIR = .*\/perl5\/TLBC/s::PMDIR = ${VENDOR_LIB}\/TLBC:" \ Makefile || die "sed failed" if [ "$(get_libdir)" == "lib64" ]; then sed -i \ -e "/^LIB\(32\)/s:=.*:= lib32:" \ Makefile fi # Tarballs from github don't have the version set. # https://github.com/libhugetlbfs/libhugetlbfs/issues/7 [[ -f version ]] || echo "${PV}" > version } src_compile() { tc-export AR emake CC="$(tc-getCC)" libs tools } src_install() { default use static-libs || rm -f "${ED}"/usr/$(get_libdir)/*.a rm "${ED}"/usr/bin/oprofile* || die if ! use perl ; then rm -r \ "${ED}"/usr/bin/cpupcstat \ "${ED}"/usr/share/man/man8/cpupcstat.8 \ "${ED}/${VENDOR_LIB}" \ || die fi } src_test_alloc_one() { hugeadm="$1" sign="$2" pagesize="$3" pagecount="$4" ${hugeadm} \ --pool-pages-max ${pagesize}:${sign}${pagecount} \ && \ ${hugeadm} \ --pool-pages-min ${pagesize}:${sign}${pagecount} return $? } # die is NOT allowed in this src_test block after the marked point, so that we # can clean up memory allocation. You'll leak at LEAST 64MiB per run otherwise. src_test() { [[ $UID -eq 0 ]] || die "Need FEATURES=-userpriv to run this testsuite" einfo "Building testsuite" emake -j1 tests || die "Failed to build tests" hugeadm='obj/hugeadm' allocated='' rc=0 # the testcases need 64MiB per pagesize. MIN_HUGEPAGE_RAM=$((64*1024*1024)) einfo "Planning allocation" PAGESIZES="$(${hugeadm} --page-sizes-all)" # Need to do this before we can create the mountpoints. for pagesize in ${PAGESIZES} ; do # The kernel depends on the location :-( mkdir -p /var/lib/hugetlbfs/pagesize-${pagesize} addwrite /var/lib/hugetlbfs/pagesize-${pagesize} done addwrite /proc/sys/vm/ addwrite /proc/sys/kernel/shmall addwrite /proc/sys/kernel/shmmax addwrite /proc/sys/kernel/shmmni einfo "Checking HugeTLB mountpoints" ${hugeadm} --create-mounts || die "Failed to set up hugetlb mountpoints." # ----------------------------------------------------- # --------- die is unsafe after this point. ----------- # ----------------------------------------------------- einfo "Starting allocation" for pagesize in ${PAGESIZES} ; do pagecount=$((${MIN_HUGEPAGE_RAM}/${pagesize})) einfo " ${pagecount} @ ${pagesize}" addwrite /var/lib/hugetlbfs/pagesize-${pagesize} src_test_alloc_one "$hugeadm" "+" "${pagesize}" "${pagecount}" rc=$? if [[ $rc -eq 0 ]]; then allocated="${allocated} ${pagesize}:${pagecount}" else eerror "Failed to add ${pagecount} pages of size ${pagesize}" fi done einfo "Allocation status" ${hugeadm} --pool-list if [[ -n "${allocated}" ]]; then # All our allocations worked, so time to run. einfo "Starting tests" cd "${S}"/tests TESTOPTS="-t func" case $ARCH in amd64|ppc64) TESTOPTS="${TESTOPTS} -b 64" ;; x86) TESTOPTS="${TESTOPTS} -b 32" ;; esac # This needs a bit of work to give a nice exit code still. ./run_tests.py ${TESTOPTS} rc=$? else eerror "Failed to make HugeTLB allocations." rc=1 fi einfo "Cleaning up memory" cd "${S}" # Cleanup memory allocation for alloc in ${allocated} ; do pagesize="${alloc/:*}" pagecount="${alloc/*:}" einfo " ${pagecount} @ ${pagesize}" src_test_alloc_one "$hugeadm" "-" "${pagesize}" "${pagecount}" done # --------------------------------------------------------- # --------- die is safe again after this point. ----------- # --------------------------------------------------------- return $rc }