Skip to content

Commit 76cea6c

Browse files
committed
Squeeze more performance out of memory manager
1 parent 63065cd commit 76cea6c

File tree

4 files changed

+18
-29
lines changed

4 files changed

+18
-29
lines changed

libc/intrin/maps.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ void __maps_unlock(void);
5252
void __maps_add(struct Map *);
5353
void __maps_free(struct Map *);
5454
struct Map *__maps_alloc(void);
55-
struct Map *__maps_ceil(const char *);
5655
struct Map *__maps_floor(const char *);
5756
void __maps_stack(char *, int, int, size_t, int, intptr_t);
5857
int __maps_compare(const struct Tree *, const struct Tree *);

libc/intrin/mmap.c

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -88,19 +88,9 @@ privileged optimizespeed struct Map *__maps_floor(const char *addr) {
8888
return 0;
8989
}
9090

91-
struct Map *__maps_ceil(const char *addr) {
92-
struct Tree *node;
93-
if ((node = tree_ceil(__maps.maps, addr, __maps_search)))
94-
return MAP_TREE_CONTAINER(node);
95-
return 0;
96-
}
97-
9891
static bool __maps_overlaps(const char *addr, size_t size, int pagesz) {
99-
ASSERT(!((uintptr_t)addr & (getgransize() - 1)) && size);
100-
struct Map *map, *ceil, *floor;
101-
floor = __maps_floor(addr);
102-
ceil = __maps_ceil(addr + size);
103-
for (map = floor; map && map != ceil; map = __maps_next(map))
92+
struct Map *map, *floor = __maps_floor(addr);
93+
for (map = floor; map && map->addr <= addr + size; map = __maps_next(map))
10494
if (MAX(addr, map->addr) <
10595
MIN(addr + PGUP(size), map->addr + PGUP(map->size)))
10696
return true;
@@ -138,11 +128,9 @@ static int __muntrack(char *addr, size_t size, int pagesz,
138128
int rc = 0;
139129
struct Map *map;
140130
struct Map *next;
141-
struct Map *ceil;
142131
struct Map *floor;
143132
floor = __maps_floor(addr);
144-
ceil = __maps_ceil(addr + size);
145-
for (map = floor; map && map != ceil; map = next) {
133+
for (map = floor; map && map->addr <= addr + size; map = next) {
146134
next = __maps_next(map);
147135
char *map_addr = map->addr;
148136
size_t map_size = map->size;
@@ -252,10 +240,10 @@ static void __maps_insert(struct Map *map) {
252240
int prot = map->prot & ~(MAP_FIXED | MAP_FIXED_NOREPLACE);
253241
int flags = map->flags;
254242
bool coalesced = false;
255-
struct Map *floor, *ceil, *other, *last = 0;
256-
floor = __maps_floor(map->addr);
257-
ceil = __maps_ceil(map->addr + map->size);
258-
for (other = floor; other; last = other, other = __maps_next(other)) {
243+
struct Map *floor, *other, *last = 0;
244+
for (other = floor = __maps_floor(map->addr);
245+
other && other->addr <= map->addr + map->size;
246+
last = other, other = __maps_next(other)) {
259247
if (prot == other->prot && flags == other->flags) {
260248
if (!coalesced) {
261249
if (map->addr == other->addr + other->size) {
@@ -282,8 +270,6 @@ static void __maps_insert(struct Map *map) {
282270
__maps_check();
283271
}
284272
}
285-
if (other == ceil)
286-
break;
287273
}
288274
if (coalesced)
289275
return;
@@ -683,10 +669,16 @@ static void *__mremap(char *old_addr, size_t old_size, size_t new_size,
683669
int pagesz = getpagesize();
684670
int gransz = getgransize();
685671

686-
// demand kernel support
672+
// kernel support
687673
if (!IsLinux() && !IsNetbsd())
688674
return (void *)enosys();
689675

676+
// it is not needed
677+
if (new_size <= old_size)
678+
if (!(flags & MREMAP_FIXED))
679+
if (flags & MREMAP_MAYMOVE)
680+
flags &= ~MREMAP_MAYMOVE;
681+
690682
// we support these flags
691683
if (flags & ~(MREMAP_MAYMOVE | MREMAP_FIXED))
692684
return (void *)einval();

libc/intrin/mprotect.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,9 @@ int __mprotect(char *addr, size_t size, int prot) {
7474
__maps_unlock();
7575
return edeadlk();
7676
}
77-
struct Map *map, *ceil, *floor;
77+
struct Map *map, *floor;
7878
floor = __maps_floor(addr);
79-
ceil = __maps_ceil(addr + size);
80-
for (map = floor; map && map != ceil; map = __maps_next(map)) {
79+
for (map = floor; map && map->addr <= addr + size; map = __maps_next(map)) {
8180
char *map_addr = map->addr;
8281
size_t map_size = map->size;
8382
char *beg = MAX(addr, map_addr);

libc/intrin/msync-nt.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,9 @@ textwindows int sys_msync_nt(char *addr, size_t size, int flags) {
3737
if (__maps_lock()) {
3838
rc = edeadlk();
3939
} else {
40-
struct Map *map, *ceil, *floor;
40+
struct Map *map, *floor;
4141
floor = __maps_floor(addr);
42-
ceil = __maps_ceil(addr + size);
43-
for (map = floor; map && map != ceil; map = __maps_next(map)) {
42+
for (map = floor; map && map->addr <= addr + size; map = __maps_next(map)) {
4443
char *beg = MAX(addr, map->addr);
4544
char *end = MIN(addr + size, map->addr + map->size);
4645
if (beg < end)

0 commit comments

Comments
 (0)