Author: Remi Meier <[email protected]>
Branch:
Changeset: r1383:a20e5e7e942c
Date: 2014-09-10 16:02 +0200
http://bitbucket.org/pypy/stmgc/changeset/a20e5e7e942c/
Log: use pwrite & mmap instead of extra remap_file_pages call (not sure
if actually better)
diff --git a/c8/stm/core.h b/c8/stm/core.h
--- a/c8/stm/core.h
+++ b/c8/stm/core.h
@@ -32,8 +32,6 @@
#define FIRST_OLD_RM_PAGE (OLD_RM_START / 4096UL)
#define NB_READMARKER_PAGES (FIRST_OBJECT_PAGE - FIRST_READMARKER_PAGE)
-#define TMP_COPY_PAGE 1 /* HACK */
-
enum /* stm_flags */ {
GCFLAG_WRITE_BARRIER = _STM_GCFLAG_WRITE_BARRIER,
GCFLAG_HAS_SHADOW = 0x02,
diff --git a/c8/stm/pagecopy.h b/c8/stm/pagecopy.h
--- a/c8/stm/pagecopy.h
+++ b/c8/stm/pagecopy.h
@@ -1,2 +1,2 @@
-static void pagecopy(void *dest, const void *src); // 4096 bytes
+static void pagecopy(void *dest, const void *src) __attribute__((unused));
// 4096 bytes
diff --git a/c8/stm/pages.c b/c8/stm/pages.c
--- a/c8/stm/pages.c
+++ b/c8/stm/pages.c
@@ -1,8 +1,8 @@
#ifndef _STM_CORE_H_
# error "must be compiled via stmgc.c"
#endif
-#include <signal.h>
+#include <unistd.h>
/************************************************************/
static void setup_pages(void)
@@ -34,21 +34,14 @@
/* assert remappings follow the rule that page N in one segment
can only be remapped to page N in another segment */
- assert(IMPLY(((addr - stm_object_pages) / 4096UL) != TMP_COPY_PAGE,
- ((addr - stm_object_pages) / 4096UL - pgoff) % NB_PAGES ==
0));
+ assert(((addr - stm_object_pages) / 4096UL - pgoff) % NB_PAGES == 0);
-#ifdef USE_REMAP_FILE_PAGES
- int res = remap_file_pages(addr, size, 0, pgoff, 0);
- if (UNLIKELY(res < 0))
- stm_fatalerror("remap_file_pages: %m");
-#else
char *res = mmap(addr, size,
PROT_READ | PROT_WRITE,
(MAP_PAGES_FLAGS & ~MAP_ANONYMOUS) | MAP_FIXED,
stm_object_pages_fd, pgoff * 4096UL);
if (UNLIKELY(res != addr))
stm_fatalerror("mmap (remapping page): %m");
-#endif
}
@@ -115,14 +108,15 @@
attempt to group together many calls to d_remap_file_pages() in
succession) */
uintptr_t pagenum_in_file = NB_PAGES * segnum + pagenum;
- char *tmp_page = stm_object_pages + TMP_COPY_PAGE * 4096UL;
- /* first remap to TMP_PAGE, then copy stuff there (to the underlying
- file page), then remap this file-page hopefully atomically to the
- segnum's virtual page */
- d_remap_file_pages(tmp_page, 4096, pagenum_in_file);
- pagecopy(tmp_page, initialize_from);
+ char *new_page = stm_object_pages + pagenum_in_file * 4096UL;
+
+ /* first write to the file page directly: */
+ ssize_t written = pwrite(stm_object_pages_fd, initialize_from, 4096UL,
+ pagenum_in_file * 4096UL);
+ if (written != 4096)
+ stm_fatalerror("pwrite didn't write the whole page: %zd", written);
+
+ /* now remap virtual page in segment to the new file page */
write_fence();
-
- char *new_page = stm_object_pages + pagenum_in_file * 4096UL;
d_remap_file_pages(new_page, 4096, pagenum_in_file);
}
diff --git a/c8/stm/pages.h b/c8/stm/pages.h
--- a/c8/stm/pages.h
+++ b/c8/stm/pages.h
@@ -21,7 +21,6 @@
#define PAGE_FLAG_START END_NURSERY_PAGE
#define PAGE_FLAG_END NB_PAGES
-#define USE_REMAP_FILE_PAGES
struct page_shared_s {
#if NB_SEGMENTS <= 8
diff --git a/c8/stm/setup.c b/c8/stm/setup.c
--- a/c8/stm/setup.c
+++ b/c8/stm/setup.c
@@ -2,27 +2,11 @@
# error "must be compiled via stmgc.c"
#endif
-#include <signal.h>
-#ifdef USE_REMAP_FILE_PAGES
-static char *setup_mmap(char *reason, int *ignored)
-{
- char *result = mmap(NULL, TOTAL_MEMORY,
- PROT_READ | PROT_WRITE,
- MAP_PAGES_FLAGS, -1, 0);
- if (result == MAP_FAILED)
- stm_fatalerror("%s failed: %m", reason);
-
- return result;
-}
-static void close_fd_mmap(int ignored)
-{
-}
-#else
#include <fcntl.h> /* For O_* constants */
static char *setup_mmap(char *reason, int *map_fd)
{
- char name[128];
+ char name[128] = "/__stmgc_c8__";
/* Create the big shared memory object, and immediately unlink it.
There is a small window where if this process is killed the
@@ -51,7 +35,6 @@
{
close(map_fd);
}
-#endif
static void setup_protection_settings(void)
{
@@ -63,19 +46,13 @@
NULL accesses land. We mprotect it so that accesses fail. */
mprotect(segment_base, 4096, PROT_NONE);
- /* TMP_COPY_PAGE is used for atomic privatization */
- mprotect(segment_base + TMP_COPY_PAGE * 4096UL,
- 4096UL, PROT_READ|PROT_WRITE);
-
/* Pages in range(2, FIRST_READMARKER_PAGE) are never used */
- if (FIRST_READMARKER_PAGE > TMP_COPY_PAGE + 1)
- mprotect(segment_base + (TMP_COPY_PAGE + 1) * 4096,
- (FIRST_READMARKER_PAGE - TMP_COPY_PAGE - 1) * 4096UL,
+ if (FIRST_READMARKER_PAGE > 2)
+ mprotect(segment_base + 2 * 4096,
+ (FIRST_READMARKER_PAGE - 2) * 4096UL,
PROT_NONE);
- /* STM_SEGMENT */
- mprotect(segment_base + ((uintptr_t)STM_SEGMENT / 4096UL) * 4096UL,
- 4096UL, PROT_READ|PROT_WRITE);
+ /* STM_SEGMENT is in page 1 */
}
}
@@ -83,13 +60,11 @@
void stm_setup(void)
{
/* Check that some values are acceptable */
- assert(TMP_COPY_PAGE > 0 && TMP_COPY_PAGE <= 1);
- assert(TMP_COPY_PAGE * 4096 + 4096 <= ((uintptr_t)STM_SEGMENT));
+ assert(4096 <= ((uintptr_t)STM_SEGMENT));
assert((uintptr_t)STM_SEGMENT == (uintptr_t)STM_PSEGMENT);
assert(((uintptr_t)STM_PSEGMENT) + sizeof(*STM_PSEGMENT) <=
FIRST_READMARKER_PAGE*4096);
assert(NB_SEGMENTS <= NB_SEGMENTS_MAX);
- assert(TMP_COPY_PAGE < FIRST_READMARKER_PAGE);
assert(FIRST_READMARKER_PAGE * 4096UL <= READMARKER_START);
assert(READMARKER_START < READMARKER_END);
assert(READMARKER_END <= 4096UL * FIRST_OBJECT_PAGE);
diff --git a/c8/stmgc.h b/c8/stmgc.h
--- a/c8/stmgc.h
+++ b/c8/stmgc.h
@@ -34,7 +34,7 @@
uintptr_t nursery_end;
struct stm_thread_local_s *running_thread;
};
-#define STM_SEGMENT ((stm_segment_info_t *)8192)
+#define STM_SEGMENT ((stm_segment_info_t *)4352)
struct stm_shadowentry_s {
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit