This benefits unprivileged users who lack permissions to raise the `sys.vm.max_map_count' sysctl and/or RLIMIT_DATA resource limit. It appears none of our multithreaded code is calling this, or is doing so while holding appropropriate locks to serialize access to the object database. Unconditionally calling unuse_one_window() before xmmap_gently() revealed no test suite failures: --- a/packfile.c +++ b/packfile.c @@ -98,6 +98,7 @@ static int check_packed_git_idx(const char *path, struct packed_git *p) return error("index file %s is too small", path); } do { + unuse_one_window(p); idx_map = xmmap_gently(NULL, idx_size, PROT_READ, MAP_PRIVATE, fd, 0); } while (idx_map == MAP_FAILED && errno == ENOMEM Signed-off-by: Eric Wong <e@xxxxxxxxx> --- packfile.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packfile.c b/packfile.c index 4bc7fa0f36..2904560f52 100644 --- a/packfile.c +++ b/packfile.c @@ -97,7 +97,11 @@ static int check_packed_git_idx(const char *path, struct packed_git *p) close(fd); return error("index file %s is too small", path); } - idx_map = xmmap(NULL, idx_size, PROT_READ, MAP_PRIVATE, fd, 0); + do { + idx_map = xmmap_gently(NULL, idx_size, PROT_READ, MAP_PRIVATE, + fd, 0); + } while (idx_map == MAP_FAILED && errno == ENOMEM + && unuse_one_window(p)); close(fd); ret = load_idx(path, hashsz, idx_map, idx_size, p);