runshell LD_HWCAP_MASK=0 optimisation

This commit is contained in:
Joey Hess 2020-08-03 14:34:15 -04:00
parent e62817c00d
commit 88e5ebcda7
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
6 changed files with 68 additions and 13 deletions

View file

@ -24,7 +24,7 @@ import Utility.Path
import Utility.FileMode
import Utility.CopyFile
mklibs :: FilePath -> a -> IO ()
mklibs :: FilePath -> a -> IO Bool
mklibs top _installedbins = do
fs <- dirContentsRecursive top
exes <- filterM checkExe fs
@ -48,6 +48,19 @@ mklibs top _installedbins = do
let linker = Prelude.head linkers
mapM_ (installLinkerShim top linker) exes
return (any hwcaplibdir libdirs)
where
-- hwcap lib dirs are things like foo/tls and foo/x86.
-- Hard to know if a directory is, so this is a heuristic
-- looking for things that are certianly not. If this heuristic
-- fails, a minor optimisation will not happen, but there will be
-- no bad results.
hwcaplibdir d = not $ or
[ "lib" == takeFileName d
-- eg, "lib/x86_64-linux-gnu"
, "-linux-" `isInfixOf` takeFileName d
]
{- If there are two libdirs that are the same except one is in
- usr/lib and the other is in lib/, move the contents of the usr/lib one
- into the lib/ one. This reduces the number of directories the linker

View file

@ -31,8 +31,10 @@ import qualified Data.Set as S
type LibMap = M.Map FilePath String
mklibs :: FilePath -> M.Map FilePath FilePath -> IO ()
mklibs appbase installedbins = mklibs' appbase installedbins [] [] M.empty
mklibs :: FilePath -> M.Map FilePath FilePath -> IO Bool
mklibs appbase installedbins = do
mklibs' appbase installedbins [] [] M.empty
return True
{- Recursively find and install libs, until nothing new to install is found. -}
mklibs' :: FilePath -> M.Map FilePath FilePath -> [FilePath] -> [(FilePath, FilePath)] -> LibMap -> IO ()

View file

@ -152,13 +152,22 @@ installLocales _ = return ()
installLocales topdir = cp "/usr/share/i18n" (topdir </> "i18n")
#endif
installWrapper :: FilePath -> FilePath -> IO ()
installSkel :: FilePath -> FilePath -> IO ()
#ifdef darwin_HOST_OS
installWrapper topdir basedir = do
installSkel topdir basedir = do
removeDirectoryRecursive basedir
createDirectoryIfMissing True (takeDirectory basedir)
unlessM (boolSystem "cp" [Param "-R", File "standalone/osx/git-annex.app", File basedir]) $
error "cp failed"
#else
installSkel topdir _basedir = do
removeDirectoryRecursive topdir
unlessM (boolSystem "cp" [Param "-R", File "standalone/linux/skel", File topdir]) $
error "cp failed"
#endif
installSkelRest :: FilePath -> FilePath -> Bool -> IO ()
#ifdef darwin_HOST_OS
installSkelRest topdir basedir _hwcaplibs = do
plist <- lines <$> readFile "standalone/osx/Info.plist.template"
version <- getVersion
writeFile (basedir </> "Contents" </> "Info.plist")
@ -166,11 +175,7 @@ installWrapper topdir basedir = do
where
expandversion v l = replace "GIT_ANNEX_VERSION" v l
#else
installWrapper topdir _basedir = do
removeDirectoryRecursive topdir
createDirectoryIfMissing True (takeDirectory topdir)
unlessM (boolSystem "cp" [Param "-R", File "standalone/linux/skel", File topdir]) $
error "cp failed"
installSkelRest topdir _basedir hwcaplibs = do
runshell <- lines <$> readFile "standalone/linux/skel/runshell"
-- GIT_ANNEX_PACKAGE_INSTALL can be set by a distributor and
-- runshell will be modified
@ -180,6 +185,12 @@ installWrapper topdir _basedir = do
modifyFileMode (topdir </> "runshell") (addModes executeModes)
where
expandrunshell (Just gapi) l@"GIT_ANNEX_PACKAGE_INSTALL=" = l ++ gapi
-- This is an optimisation, that avoids the linker looking in
-- several directories for hwcap optimised libs, when there are
-- none.
expandrunshell _ l@"LD_HWCAP_MASK=" = l ++ if not hwcaplibs
then "0"
else ""
expandrunshell _ l = l
#endif
@ -203,11 +214,12 @@ main :: IO ()
main = getArgs >>= go
where
go (topdir:basedir:[]) = do
installWrapper topdir basedir
installSkel topdir basedir
installGitAnnex topdir
installedbins <- installBundledPrograms topdir
installGitLibs topdir
installMagic topdir
installLocales topdir
mklibs topdir installedbins
hwcaplibs <- mklibs topdir installedbins
installSkelRest topdir basedir hwcaplibs
go _ = error "specify topdir and basedir"

View file

@ -61,3 +61,5 @@ git annex build: 8.20200617+git192-g5849bd634-1~ndall+1
[[!meta author=yoh]]
[[!tag projects/datalad]]
> [[done]] --[[Joey]]

View file

@ -0,0 +1,23 @@
[[!comment format=mdwn
username="joey"
subject="""comment 19"""
date="2020-08-03T18:16:50Z"
content="""
Implemented the `LD_HWCAP_MASK=0` optimisation, which left only these:
strace -f ./git-annex version 2>&1 | grep ENOENT | grep openat
openat(AT_FDCWD, "/home/joey/src/git-annex/tmp/git-annex.linux//lib/x86_64-linux-gnu/tls/x86_64/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/joey/src/git-annex/tmp/git-annex.linux//lib/x86_64-linux-gnu/tls/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/joey/src/git-annex/tmp/git-annex.linux//lib/x86_64-linux-gnu/x86_64/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[pid 697752] openat(AT_FDCWD, "/home/joey/src/git-annex/tmp/git-annex.linux//lib/x86_64-linux-gnu/tls/x86_64/libpcre2-8.so.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[pid 697752] openat(AT_FDCWD, "/home/joey/src/git-annex/tmp/git-annex.linux//lib/x86_64-linux-gnu/tls/libpcre2-8.so.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
[pid 697752] openat(AT_FDCWD, "/home/joey/src/git-annex/tmp/git-annex.linux//lib/x86_64-linux-gnu/x86_64/libpcre2-8.so.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
There are more failed opens now for locale files for commands like
grep when running it than there are for libraries. So, no need to
consider further prelinking.
I think that rewriting runshell in C would be the
logical next choice, but dunno if it would speed it up by enough to be
worth the effort. So I'm going to close this now.
"""]]

View file

@ -241,6 +241,9 @@ else
cmd=sh
fi
LD_HWCAP_MASK=
export LD_HWCAP_MASK
if [ -n "${orig_IFS}" ]; then
IFS="${orig_IFS}"
export IFS