про память ничего сказать не могу, а вот по оптимизации можно предложить:
заменить
if( pcbuf->m_arrBlock[ii].sysAdr == NULL )
на
if(unlikely(pcbuf->m_arrBlock[ii].sysAdr == NULL)),
а
if(m_arrBlock[ii].sysAdr != NULL)
можно на
if(likely(m_arrBlock[ii].sysAdr != NULL))
или тоже unlikely.
:)
не очень понял вопрос.
mmap делается? или память теряется просто после
allocate/deallocate? вроде не должно быть на
первый взгляд.
spin_lock(&init_mm.page_table_lock) абсолютно
не нужен. память принадлежит вам, никто ее видеть
не может, можете играться с PG_reserved без всяких
блокировок.
mmap делается без проблем. Я предполагаю, что память теряется после
allocate/deallocate. Но как проверить это не знаю? Еще может на правильную мысль наведет тот факт, что памяти выделяется не так много. На машине с 256 Мб (RAM) выделяется только 98 Мб. Причем от размера блока m_blkSize объем не завист.
Спасибо за помощь. Кстати а что делают unlikely/likely можете пояснить, или где посмотреть? Я впервые о них слышу.
> Кстати а что делают unlikely/likely можете пояснить, или где
> посмотреть? Я впервые о них слышу.
Впервые - это очень интересно:) потому как они на каждом углу в ядре.
Когда я стал смотреть исходники, я постоянно на них натыкался,
в результате чего и стал искать, что же это такое.
Находятся в include/linux/compiler.h
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
Это расширения gcc, которые позволяют предсказать компилятору
ветку перехода.
Есть небольшое пояснение тут:
http://thep.physik.uni-mainz.de/pipermail/ginac-devel/2001-September/000329.html
но что-то сейчас недоступен этот линк.
Ну, в любом случае, info gcc на предмет __builtin_expect :)
> mmap делается без проблем.
тогда я думаю (хотя я очень невнимательно читал приведенный код)
что проблема где-то там. скажем, неправильное манипулирование
page->_count. вы можете это легко проверить, впрочем. вызывайте
allocate/deallocate (без реального использования) и смотрите,
течет ли память.
поищите на этом форуме по PageReserved, подобные проблемы уже
обсуждались.