Skip to content

Commit 7aee1ec

Browse files
committed
Fix hugepages memory allocation issues.
When mmap() fails, it returns MAP_FAILED. If the mmap() with hugepages fails, call mmap() again without hugepages. Signed-off-by: ShinYee <[email protected]>
1 parent 9fa5ff1 commit 7aee1ec

File tree

3 files changed

+64
-12
lines changed

3 files changed

+64
-12
lines changed

SLIDE/Layer.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,12 @@ class Layer
5555
void* ptr = mmap(NULL, size,
5656
PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB,
5757
-1, 0);
58-
if (ptr == NULL)
58+
if (ptr == MAP_FAILED){
59+
ptr = mmap(NULL, size,
60+
PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS,
61+
-1, 0);
62+
}
63+
if (ptr == MAP_FAILED)
5964
std::cout << "mmap fail! No new layer!" << std::endl;
6065
return ptr;};
6166
void operator delete(void * pointer){munmap(pointer, sizeof(Layer));};

SLIDE/Network.h

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,19 @@ class Network
2828
~Network();
2929
void * operator new(size_t size){
3030
cout << "new Network" << endl;
31-
return mmap(NULL, size,
32-
PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB,
33-
-1, 0);};
31+
void* ptr = mmap(NULL, size,
32+
PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB,
33+
-1, 0);
34+
if (ptr == MAP_FAILED){
35+
ptr = mmap(NULL, size,
36+
PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS,
37+
-1, 0);
38+
}
39+
if (ptr == MAP_FAILED){
40+
std::cout << "mmap failed at Network." << std::endl;
41+
}
42+
return ptr;
43+
}
3444
void operator delete(void * pointer){munmap(pointer, sizeof(Network));};
3545
};
3646

SLIDE/Node.h

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,35 @@ struct train {
1919
int _ActiveinputIds;
2020

2121
void * operator new(size_t size){
22-
return mmap(NULL, size,
22+
void* ptr = mmap(NULL, size,
2323
PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB,
24-
-1, 0);};
24+
-1, 0);
25+
if (ptr == MAP_FAILED){
26+
ptr = mmap(NULL, size,
27+
PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS,
28+
-1, 0);
29+
}
30+
if (ptr == MAP_FAILED){
31+
std::cout << "mmap failed at train." << std::endl;
32+
}
33+
return ptr;
34+
}
2535
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value){return operator new (size);};
2636
void* operator new (std::size_t size, void* ptr){return operator new (size);};
2737
void* operator new[] (std::size_t size){
2838
void* ptr = mmap(NULL, size,
2939
PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_HUGE_1GB,
3040
-1, 0);
31-
if (ptr == NULL)
41+
if (ptr == MAP_FAILED){
42+
ptr = mmap(NULL, size,
43+
PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS,
44+
-1, 0);
45+
}
46+
if (ptr == MAP_FAILED){
3247
std::cout << "mmap fail! No train array!" << std::endl;
33-
return ptr;};
48+
}
49+
return ptr;
50+
}
3451
void* operator new[] (std::size_t size, const std::nothrow_t& nothrow_value){return operator new (size);};
3552
void* operator new[] (std::size_t size, void* ptr){return operator new (size);};
3653

@@ -86,16 +103,36 @@ class Node
86103

87104
void * operator new(size_t size){
88105
std::cout << "new Node" << std::endl;
89-
return mmap(NULL, size,
106+
void* ptr = mmap(NULL, size,
90107
PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_HUGE_1GB,
91-
-1, 0);};
108+
-1, 0);
109+
if (ptr == MAP_FAILED){
110+
ptr = mmap(NULL, size,
111+
PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS,
112+
-1, 0);
113+
}
114+
if (ptr == MAP_FAILED){
115+
std::cout << "mmap failed at Node." << std::endl;
116+
}
117+
return ptr;
118+
}
92119
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value){return operator new (size);};
93120
void* operator new (std::size_t size, void* ptr){return operator new (size);};
94121
void* operator new[] (std::size_t size){
95122
std::cout << "new Node array" << std::endl;
96-
return mmap(NULL, size,
123+
void* ptr = mmap(NULL, size,
97124
PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_HUGE_1GB,
98-
-1, 0);};
125+
-1, 0);
126+
if (ptr == MAP_FAILED){
127+
ptr = mmap(NULL, size,
128+
PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS,
129+
-1, 0);
130+
}
131+
if (ptr == MAP_FAILED){
132+
std::cout << "mmap failed at Node array." << std::endl;
133+
}
134+
return ptr;
135+
}
99136
void* operator new[] (std::size_t size, const std::nothrow_t& nothrow_value){return operator new (size);};
100137
void* operator new[] (std::size_t size, void* ptr){return operator new (size);};
101138

0 commit comments

Comments
 (0)