Skip to content

Commit a9120c3

Browse files
committed
define offset of first page instead of alignment
1 parent 864aebd commit a9120c3

File tree

4 files changed

+18
-21
lines changed

4 files changed

+18
-21
lines changed

src/MemoryBankManager.cxx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ int MemoryBankManager::addBank(std::shared_ptr<MemoryBank> bankPtr, std::string
2828
}
2929

3030

31-
std::shared_ptr<MemoryPagesPool> MemoryBankManager::getPagedPool(size_t pageSize, size_t pageNumber, std::string bankName, size_t pageAlign, size_t blockAlign){
31+
std::shared_ptr<MemoryPagesPool> MemoryBankManager::getPagedPool(size_t pageSize, size_t pageNumber, std::string bankName, size_t firstPageOffset, size_t blockAlign){
3232

3333
void *baseAddress=nullptr; // base address of bank from which the block is taken
3434
size_t offset=0; // offset of new block (relative to baseAddress)
@@ -95,7 +95,7 @@ std::shared_ptr<MemoryPagesPool> MemoryBankManager::getPagedPool(size_t pageSiz
9595
// end of locked block
9696

9797
// create pool of pages from new block
98-
return std::make_shared<MemoryPagesPool>(pageSize,pageNumber,&(((char *)baseAddress)[offset]),blockSize,nullptr,pageAlign);
98+
return std::make_shared<MemoryPagesPool>(pageSize,pageNumber,&(((char *)baseAddress)[offset]),blockSize,nullptr,firstPageOffset);
9999
}
100100

101101
// a global MemoryBankManager instance

src/MemoryBankManager.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ class MemoryBankManager {
2727
// - pageSize: size of one page (in bytes)
2828
// - pageNumber: number of pages requested
2929
// - bankName: name of the bank from which to create the pool. If not specified, using the first bank.
30-
// - pageAlign: alignment of first page in pool
31-
// - blockAlign: alignment of beginning of big memory block from which pool is created
30+
// - firstPageOffset: to control alignment of first page in pool. With zero, start from beginning of big block.
31+
// - blockAlign: alignment of beginning of big memory block from which pool is created. Pool will start at a multiple of this value.
3232
// NB: trivial implementation, once a region from a bank has been used, it can not be reused after the corresponding pool of pages has been release
3333
// ... don't want to deal with fragmentation etc
34-
std::shared_ptr<MemoryPagesPool> getPagedPool(size_t pageSize, size_t pageNumber, std::string bankName="", size_t pageAlign=0, size_t blockAlign=0);
34+
std::shared_ptr<MemoryPagesPool> getPagedPool(size_t pageSize, size_t pageNumber, std::string bankName="", size_t firstPageOffset=0, size_t blockAlign=0);
3535

3636
// a struct to define a memory range
3737
struct memoryRange {

src/MemoryPagesPool.cxx

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include "MemoryPagesPool.h"
22

3-
MemoryPagesPool::MemoryPagesPool(size_t vPageSize, size_t vNumberOfPages, void *vBaseAddress, size_t vBaseSize, ReleaseCallback vCallback, size_t pageAlign) {
3+
MemoryPagesPool::MemoryPagesPool(size_t vPageSize, size_t vNumberOfPages, void *vBaseAddress, size_t vBaseSize, ReleaseCallback vCallback, size_t firstPageOffset) {
44
// initialize members from parameters
55
pageSize=vPageSize;
66
numberOfPages=vNumberOfPages;
@@ -13,25 +13,21 @@ MemoryPagesPool::MemoryPagesPool(size_t vPageSize, size_t vNumberOfPages, void *
1313
baseBlockSize=pageSize * numberOfPages;
1414
}
1515

16-
// compute offset of first page to ensure aligned as requested
17-
size_t offsetFirstPage=0;
18-
if (pageAlign) {
19-
size_t bytesExcess=((size_t)vBaseAddress) % pageAlign;
20-
if (bytesExcess) {
21-
offsetFirstPage=pageAlign-bytesExcess;
22-
}
16+
// check validity of parameters
17+
if ((firstPageOffset>=vBaseSize)||(vBaseSize==0)||(vNumberOfPages==0)||(vPageSize==0)||(baseBlockSize==0)) {
18+
throw __LINE__;
2319
}
24-
20+
2521
// if necessary, reduce number of pages to fit in available space
26-
size_t sizeNeeded=pageSize * numberOfPages + offsetFirstPage;
27-
if (sizeNeeded>baseBlockSize) {
28-
numberOfPages=(baseBlockSize-offsetFirstPage)/pageSize;
22+
size_t sizeNeeded=pageSize * numberOfPages + firstPageOffset;
23+
if (sizeNeeded>baseBlockSize) {
24+
numberOfPages=(baseBlockSize-firstPageOffset)/pageSize;
2925
}
3026

3127
// create a fifo and store list of pages available
3228
pagesAvailable=std::make_unique<AliceO2::Common::Fifo<void *>>(numberOfPages);
3329
for (size_t i=0; i<numberOfPages; i++) {
34-
void *ptr=&((char *)baseBlockAddress)[offsetFirstPage+i*pageSize];
30+
void *ptr=&((char *)baseBlockAddress)[firstPageOffset+i*pageSize];
3531
pagesAvailable->push(ptr);
3632
}
3733
}

src/MemoryPagesPool.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@ class MemoryPagesPool {
2727
// - size of each page (in bytes)
2828
// - number of pages in the pool
2929
// - base address of memory block where to create the pages
30-
// - size of memory block in bytes (if zero, assuming it is big enough for page number * page size)
30+
// - size of memory block in bytes (if zero, assuming it is big enough for page number * page size - not taking into account firstPageOffset is set)
3131
// - a release callback to be called at destruction time
32-
// - page align is for alignment of 1st page (all pages are created contiguous)
33-
MemoryPagesPool(size_t pageSize, size_t numberOfPages, void *baseAddress, size_t baseSize=0, ReleaseCallback callback=nullptr, size_t pageAlign=0);
32+
// - firstPageOffset is the offset of first page from base address. This is to control alignment. All pages are created contiguous from this point.
33+
// If non-zero, this may reduce number of pages created compared to request (as to fit in base size)
34+
MemoryPagesPool(size_t pageSize, size_t numberOfPages, void *baseAddress, size_t baseSize=0, ReleaseCallback callback=nullptr, size_t firstPageOffset=0);
3435

3536
// destructor
3637
~MemoryPagesPool();

0 commit comments

Comments
 (0)