Author: Remi Meier <[email protected]>
Branch: c8-small-uniform
Changeset: r1506:4ce8b3189edc
Date: 2014-11-12 11:29 +0100
http://bitbucket.org/pypy/stmgc/changeset/4ce8b3189edc/
Log: switch allocation to using file pages instead of segment 0
diff --git a/c8/stm/core.h b/c8/stm/core.h
--- a/c8/stm/core.h
+++ b/c8/stm/core.h
@@ -150,7 +150,10 @@
static
#endif
char *stm_object_pages;
-static char *stm_file_pages;
+#ifndef STM_TESTS
+static
+#endif
+ char *stm_file_pages;
static int stm_object_pages_fd;
static stm_thread_local_t *stm_all_thread_locals = NULL;
diff --git a/c8/stm/gcpage.c b/c8/stm/gcpage.c
--- a/c8/stm/gcpage.c
+++ b/c8/stm/gcpage.c
@@ -6,8 +6,8 @@
static void setup_gcpage(void)
{
/* XXXXXXX should use stm_file_pages, no? */
- uninitialized_page_start = stm_object_pages + END_NURSERY_PAGE * 4096UL;
- uninitialized_page_stop = stm_object_pages + NB_PAGES * 4096UL;
+ uninitialized_page_start = stm_file_pages;
+ uninitialized_page_stop = stm_file_pages + NB_SHARED_PAGES * 4096UL;
}
static void teardown_gcpage(void)
@@ -21,8 +21,10 @@
for (i = 0; i < NB_SEGMENTS; i++) {
acquire_privatization_lock(i);
}
- pages_initialize_shared_for(STM_SEGMENT->segment_num,
- (pages_addr - stm_object_pages) / 4096UL, num);
+ pages_initialize_shared_for(
+ STM_SEGMENT->segment_num,
+ get_page_of_file_page((pages_addr - stm_file_pages) / 4096UL),
+ num);
for (i = NB_SEGMENTS-1; i >= 0; i--) {
release_privatization_lock(i);
}
@@ -31,7 +33,7 @@
static int lock_growth_large = 0;
-static char *allocate_outside_nursery_large(uint64_t size)
+static stm_char *allocate_outside_nursery_large(uint64_t size)
{
/* XXX: real allocation */
spinlock_acquire(lock_growth_large);
@@ -51,26 +53,27 @@
stm_fatalerror("uninitialized_page_start changed?");
}
}
- dprintf(("allocate_outside_nursery_large(%lu): %p, seg=%d, page=%lu\n",
- size, addr, get_segment_of_linear_address(addr),
- (addr - get_segment_base(get_segment_of_linear_address(addr))) /
4096UL));
+
+ dprintf(("allocate_outside_nursery_large(%lu): %p, page=%lu\n",
+ size, addr,
+ (uintptr_t)addr / 4096UL + END_NURSERY_PAGE));
spinlock_release(lock_growth_large);
- return addr;
+ return (stm_char*)(addr - stm_file_pages + END_NURSERY_PAGE * 4096UL);
}
object_t *_stm_allocate_old(ssize_t size_rounded_up)
{
/* only for tests xxx but stm_setup_prebuilt() uses this now too */
- char *p = allocate_outside_nursery_large(size_rounded_up);
- memset(p, 0, size_rounded_up);
+ stm_char *p = allocate_outside_nursery_large(size_rounded_up);
+ memset(stm_object_pages + (uintptr_t)p, 0, size_rounded_up);
- object_t *o = (object_t *)(p - stm_object_pages);
+ object_t *o = (object_t *)p;
o->stm_flags = GCFLAG_WRITE_BARRIER;
dprintf(("allocate_old(%lu): %p, seg=%d, page=%lu\n",
size_rounded_up, p,
- get_segment_of_linear_address(p),
- (p - STM_SEGMENT->segment_base) / 4096UL));
+ get_segment_of_linear_address(stm_object_pages + (uintptr_t)p),
+ (uintptr_t)p / 4096UL));
return o;
}
diff --git a/c8/stm/gcpage.h b/c8/stm/gcpage.h
--- a/c8/stm/gcpage.h
+++ b/c8/stm/gcpage.h
@@ -8,4 +8,4 @@
static void setup_gcpage(void);
static void teardown_gcpage(void);
static void setup_N_pages(char *pages_addr, uint64_t num);
-static char *allocate_outside_nursery_large(uint64_t size);
+static stm_char *allocate_outside_nursery_large(uint64_t size);
diff --git a/c8/stm/nursery.c b/c8/stm/nursery.c
--- a/c8/stm/nursery.c
+++ b/c8/stm/nursery.c
@@ -94,13 +94,11 @@
if (size > GC_LAST_SMALL_SIZE) {
/* case 1: object is not small enough.
Ask gcpage.c for an allocation via largemalloc. */
- char *allocated = allocate_outside_nursery_large(size);
- nobj = (object_t *)(allocated - stm_object_pages);
+ nobj = (object_t *)allocate_outside_nursery_large(size);
}
else {
/* case "small enough" */
- char *allocated = allocate_outside_nursery_small(size);
- nobj = (object_t *)(allocated - stm_object_pages);
+ nobj = (object_t *)allocate_outside_nursery_small(size);
}
/* copy the object */
@@ -334,8 +332,7 @@
/* stm_collect(0); */
/* } */
- char *result = allocate_outside_nursery_large(size_rounded_up);
- object_t *o = (object_t *)(result - stm_object_pages);
+ object_t *o = (object_t *)allocate_outside_nursery_large(size_rounded_up);
tree_insert(STM_PSEGMENT->young_outside_nursery, (uintptr_t)o, 0);
@@ -387,8 +384,7 @@
size_t size = stmcb_size_rounded_up((struct object_s *)realobj);
/* always gets outside as a large object for now */
- char *allocated = allocate_outside_nursery_large(size);
- object_t *nobj = (object_t *)(allocated - stm_object_pages);
+ object_t *nobj = (object_t *)allocate_outside_nursery_large(size);
/* Initialize the shadow enough to be considered a valid gc object.
If the original object stays alive at the next minor collection,
diff --git a/c8/stm/pages.h b/c8/stm/pages.h
--- a/c8/stm/pages.h
+++ b/c8/stm/pages.h
@@ -62,6 +62,10 @@
return pagenum - PAGE_FLAG_START;
}
+static inline uintptr_t get_page_of_file_page(uintptr_t file_page)
+{
+ return file_page + END_NURSERY_PAGE;
+}
static inline uint8_t get_page_status_in(long segnum, uintptr_t pagenum)
{
diff --git a/c8/stm/smallmalloc.c b/c8/stm/smallmalloc.c
--- a/c8/stm/smallmalloc.c
+++ b/c8/stm/smallmalloc.c
@@ -3,8 +3,8 @@
#endif
-#define PAGE_SMSIZE_START END_NURSERY_PAGE
-#define PAGE_SMSIZE_END NB_PAGES
+#define PAGE_SMSIZE_START 0
+#define PAGE_SMSIZE_END NB_SHARED_PAGES
typedef struct {
uint8_t sz;
@@ -21,7 +21,7 @@
static fpsz_t *get_fpsz(char *smallpage)
{
- uintptr_t pagenum = (((char *)smallpage) - stm_object_pages) / 4096;
+ uintptr_t pagenum = (((char *)smallpage) - stm_file_pages) / 4096;
assert(PAGE_SMSIZE_START <= pagenum && pagenum < PAGE_SMSIZE_END);
return &full_pages_object_size[pagenum - PAGE_SMSIZE_START];
}
@@ -46,6 +46,7 @@
static void grab_more_free_pages_for_small_allocations(void)
{
+ dprintf(("grab_more_free_pages_for_small_allocation()\n"));
/* Grab GCPAGE_NUM_PAGES pages out of the top addresses. Use the
lock of pages.c to prevent any remapping from occurring under our
feet.
@@ -59,7 +60,7 @@
goto out_of_memory;
uninitialized_page_stop -= decrease_by;
- first_small_uniform_loc = uninitialized_page_stop - stm_object_pages;
+ first_small_uniform_loc = uninitialized_page_stop - stm_file_pages;
/* XXX: */
/* char *base = stm_object_pages + END_NURSERY_PAGE * 4096UL; */
@@ -150,7 +151,7 @@
}
__attribute__((always_inline))
-static inline char *allocate_outside_nursery_small(uint64_t size)
+static inline stm_char *allocate_outside_nursery_small(uint64_t size)
{
OPT_ASSERT((size & 7) == 0);
OPT_ASSERT(16 <= size && size <= GC_LAST_SMALL_SIZE);
@@ -161,16 +162,28 @@
struct small_free_loc_s *result = *fl;
if (UNLIKELY(result == NULL))
- return _allocate_small_slowpath(size);
+ return (stm_char*)
+ (_allocate_small_slowpath(size) - stm_file_pages +
END_NURSERY_PAGE * 4096UL);
*fl = result->next;
- return (char *)result;
+ return (stm_char*)
+ ((char *)result - stm_file_pages + END_NURSERY_PAGE * 4096UL);
}
object_t *_stm_allocate_old_small(ssize_t size_rounded_up)
{
- char *p = allocate_outside_nursery_small(size_rounded_up);
- return (object_t *)(p - stm_object_pages);
+ stm_char *p = allocate_outside_nursery_small(size_rounded_up);
+ memset(stm_object_pages + (uintptr_t)p, 0, size_rounded_up);
+
+ object_t *o = (object_t *)p;
+ o->stm_flags = GCFLAG_WRITE_BARRIER;
+
+ dprintf(("allocate_old_small(%lu): %p, seg=%d, page=%lu\n",
+ size_rounded_up, p,
+ get_segment_of_linear_address(stm_object_pages + (uintptr_t)p),
+ (uintptr_t)p / 4096UL));
+
+ return o;
}
/************************************************************/
@@ -178,8 +191,11 @@
static inline bool _smallmalloc_sweep_keep(char *p)
{
#ifdef STM_TESTS
- if (_stm_smallmalloc_keep != NULL)
- return _stm_smallmalloc_keep(p);
+ if (_stm_smallmalloc_keep != NULL) {
+ // test wants a TLPREFIXd address
+ return _stm_smallmalloc_keep(
+ p - stm_file_pages + (char*)(END_NURSERY_PAGE * 4096UL));
+ }
#endif
abort();
//return smallmalloc_keep_object_at(p);
diff --git a/c8/stm/smallmalloc.h b/c8/stm/smallmalloc.h
--- a/c8/stm/smallmalloc.h
+++ b/c8/stm/smallmalloc.h
@@ -54,7 +54,7 @@
/* Functions
*/
-static inline char *allocate_outside_nursery_small(uint64_t size)
+static inline stm_char *allocate_outside_nursery_small(uint64_t size)
__attribute__((always_inline));
void _stm_smallmalloc_sweep(void);
diff --git a/c8/stmgc.h b/c8/stmgc.h
--- a/c8/stmgc.h
+++ b/c8/stmgc.h
@@ -80,6 +80,7 @@
void _push_obj_to_other_segments(object_t *obj);
char *stm_object_pages;
+char *stm_file_pages;
object_t *_stm_allocate_old_small(ssize_t size_rounded_up);
bool (*_stm_smallmalloc_keep)(char *data);
void _stm_smallmalloc_sweep(void);
diff --git a/c8/test/support.py b/c8/test/support.py
--- a/c8/test/support.py
+++ b/c8/test/support.py
@@ -34,6 +34,7 @@
} stm_thread_local_t;
char *stm_object_pages;
+char *stm_file_pages;
void stm_read(object_t *obj);
/*void stm_write(object_t *obj); use _checked_stm_write() instead */
diff --git a/c8/test/test_smallmalloc.py b/c8/test/test_smallmalloc.py
--- a/c8/test/test_smallmalloc.py
+++ b/c8/test/test_smallmalloc.py
@@ -12,7 +12,7 @@
BaseTest.setup_method(self, method)
@ffi.callback("bool(char *)")
def keep(data):
- p = ffi.cast("object_t *", data - lib.stm_object_pages)
+ p = ffi.cast("object_t *", data)
self.has_been_asked_for.append(p)
return p in self.keep_me
lib._stm_smallmalloc_keep = keep
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit