Re: [PATCH 03/19] read-cache: allow to keep mmap'd memory after reading

2 messages, 2 authors, 2016-06-15 · open the first message on its own page

Re: [PATCH 03/19] read-cache: allow to keep mmap'd memory after reading

From: Junio C Hamano <hidden>
Date: 2016-06-15 23:08:41

David Turner [off-list ref] writes:
From: Nguyễn Thái Ngọc Duy <redacted>

Signed-off-by: Nguyễn Thái Ngọc Duy <redacted>
---
As usual in Duy's patches, this one seriously lacks "why".  And also
makes the reader wonder if the memory region is ever unmapped() and
if so under what condition.
quoted hunk
diff --git a/cache.h b/cache.h
index 7e01403..c43ef3d 100644
--- a/cache.h
+++ b/cache.h
@@ -333,11 +333,14 @@ struct index_state {
 	struct split_index *split_index;
 	struct cache_time timestamp;
 	unsigned name_hash_initialized : 1,
+		 keep_mmap : 1,
 		 initialized : 1;
 	struct hashmap name_hash;
 	struct hashmap dir_hash;
 	unsigned char sha1[20];
 	struct untracked_cache *untracked;
+	void *mmap;
+	size_t mmap_size;
 };
 
 extern struct index_state the_index;
diff --git a/read-cache.c b/read-cache.c
index 16cc487..7e387e9 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -1574,6 +1574,10 @@ int do_read_index(struct index_state *istate, const char *path, int must_exist)
 	mmap = xmmap(NULL, mmap_size, PROT_READ, MAP_PRIVATE, fd, 0);
 	if (mmap == MAP_FAILED)
 		die_errno("unable to map index file");
+	if (istate->keep_mmap) {
+		istate->mmap = mmap;
+		istate->mmap_size = mmap_size;
+	}
 	close(fd);
 
 	hdr = mmap;
@@ -1626,10 +1630,12 @@ int do_read_index(struct index_state *istate, const char *path, int must_exist)
 		src_offset += 8;
 		src_offset += extsize;
 	}
-	munmap(mmap, mmap_size);
+	if (!istate->keep_mmap)
+		munmap(mmap, mmap_size);
 	return istate->cache_nr;
 
 unmap:
+	istate->mmap = NULL;
 	munmap(mmap, mmap_size);
 	die("index file corrupt");
 }
@@ -1655,6 +1661,7 @@ int read_index_from(struct index_state *istate, const char *path)
 		discard_index(split_index->base);
 	else
 		split_index->base = xcalloc(1, sizeof(*split_index->base));
+	split_index->base->keep_mmap = istate->keep_mmap;
 	ret = do_read_index(split_index->base,
 			    git_path("sharedindex.%s",
 				     sha1_to_hex(split_index->base_sha1)), 1);
@@ -1698,6 +1705,10 @@ int discard_index(struct index_state *istate)
 	free(istate->cache);
 	istate->cache = NULL;
 	istate->cache_alloc = 0;
+	if (istate->keep_mmap && istate->mmap) {
+		munmap(istate->mmap, istate->mmap_size);
+		istate->mmap = NULL;
+	}
 	discard_split_index(istate);
 	free_untracked_cache(istate->untracked);
 	istate->untracked = NULL;

Re: [PATCH 03/19] read-cache: allow to keep mmap'd memory after reading

From: David Turner <hidden>
Date: 2016-06-15 23:08:41

On Wed, 2016-03-09 at 15:02 -0800, Junio C Hamano wrote:
David Turner [off-list ref] writes:
quoted
From: Nguyễn Thái Ngọc Duy <redacted>

Signed-off-by: Nguyễn Thái Ngọc Duy <redacted>
---
As usual in Duy's patches, this one seriously lacks "why".  And also
makes the reader wonder if the memory region is ever unmapped() and
if so under what condition.
How about this:

Later, we will introduce git index-helper to share this memory with
other git processes.

Since the memory will be shared, it will never be unmapped (although
the kernel may of course choose to page it out).
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help