Lines Matching defs:area

41 static const char* const kSlabAreaName = "slab area";
177 AllocateArea(Area* area, uint32 flags)
180 fArea(area),
188 out.Print("slab memory manager alloc area: flags: %#" B_PRIx32
200 AddArea(Area* area)
203 fArea(area)
210 out.Print("slab memory manager add area: %p", fArea);
220 FreeArea(Area* area, bool areaRemoved, uint32 flags)
223 fArea(area),
232 out.Print("slab memory manager free area: %p%s, flags: %#" B_PRIx32,
432 rw_lock_init(&sAreaTableLock, "slab memory manager area table");
450 // Allocate one area immediately. Otherwise, we might try to allocate before
451 // post-area initialization but after page initialization, during which time
454 Area* area = NULL;
455 _AllocateArea(0, area);
456 _AddArea(area);
467 // is necessary since creating the actual area involves memory allocations,
474 Area* area = it.Next();) {
475 if (area->vmArea == NULL) {
476 _ConvertEarlyArea(area);
490 Area* area = sFreeAreas;
491 _ConvertEarlyArea(area);
492 _UnmapFreeChunksEarly(area);
496 Area* area = it.Next();) {
497 _UnmapFreeChunksEarly(area);
504 "Dump information on a given slab area",
505 "[ -c ] <area>\n"
506 "Dump information on a given slab area specified by its base "
508 "If \"-c\" is given, the chunks of all meta chunks area printed as "
523 "If \"-c\" is given, the chunks of all meta chunks area printed as "
554 Area* area = metaChunk->GetArea();
558 error = _MapChunk(area->vmArea, chunkAddress, chunkSize, 0, flags);
562 _FreeChunk(area, metaChunk, chunk, chunkAddress, true, flags);
570 _pages, int(metaChunk - area->metaChunks),
583 // get the area and the meta chunk
584 Area* area = _AreaForAddress((addr_t)pages);
585 MetaChunk* metaChunk = &area->metaChunks[
603 _FreeChunk(area, metaChunk, chunk, (addr_t)pages, false, flags);
626 // Allocate as an area.
635 area_id area = create_area_etc(VMAddressSpace::KernelID(),
643 status_t result = area >= 0 ? B_OK : area;
674 Area* area = metaChunk->GetArea();
678 error = _MapChunk(area->vmArea, chunkAddress, size, 0, flags);
683 _FreeChunk(area, metaChunk, chunk + i, chunkAddress, true, flags);
696 _pages, int(metaChunk - area->metaChunks),
715 // get the area
719 Area* area = sAreaTable.Lookup(areaBase);
722 if (area == NULL) {
723 // Probably a large allocation. Look up the VM area.
726 VMArea* area = addressSpace->LookupArea((addr_t)pages);
729 if (area != NULL && (addr_t)pages == area->Base())
730 delete_area(area->id);
732 panic("freeing unknown block %p from area %p", pages, area);
737 MetaChunk* metaChunk = &area->metaChunks[
758 _UnmapChunk(area->vmArea, (addr_t)pages, size, flags);
764 _FreeChunk(area, metaChunk, chunk + i, (addr_t)pages, true, flags);
784 // get the area
786 Area* area = sAreaTable.Lookup(_AreaBaseAddressForAddress((addr_t)address));
789 if (area == NULL) {
792 VMArea* area = addressSpace->LookupArea((addr_t)address);
793 if (area != NULL && (addr_t)address == area->Base())
794 _size = area->Size();
802 MetaChunk* metaChunk = &area->metaChunks[
825 // get the area
827 Area* area = sAreaTable.Lookup(_AreaBaseAddressForAddress((addr_t)address));
830 if (area == NULL)
833 MetaChunk* metaChunk = &area->metaChunks[
855 // least one area to use in situations when we aren't allowed to
862 Area* area;
863 if (_AllocateArea(0, area) != B_OK)
866 _PushFreeArea(area);
887 Area* area = it.Next();) {
889 MetaChunk* metaChunk = area->metaChunks + i;
925 // get the area
927 Area* area = sAreaTable.Lookup(areaBase);
929 if (area == NULL)
932 MetaChunk* metaChunk = &area->metaChunks[
979 // We can't create an area with this limitation and we must not wait for
984 // We need to allocate a new area. Wait, if someone else is trying to do
1011 allocationEntry->condition.Init(metaChunkList, "wait for slab area");
1014 Area* area;
1015 status_t error = _AllocateArea(flags, area);
1024 // meantime. We can free the area in this case.
1026 _FreeArea(area, true, flags);
1030 _AddArea(area);
1083 ", area: %p, meta chunk: %" B_PRIdSSIZE "\n", remainingChunks,
1176 MemoryManager::_FreeChunk(Area* area, MetaChunk* metaChunk, Chunk* chunk,
1182 _UnmapChunk(area->vmArea, chunkAddress, metaChunk->chunkSize, flags);
1208 if (metaChunk == area->metaChunks)
1213 // free the area, if it is unused now
1214 ASSERT(area->usedMetaChunkCount > 0);
1215 if (--area->usedMetaChunkCount == 0) {
1216 _FreeArea(area, false, flags);
1260 Area* area = metaChunk->GetArea();
1262 if (metaChunk == area->metaChunks) {
1266 metaChunk->chunkBase = area->BaseAddress() + unusableSize;
1286 MemoryManager::_AddArea(Area* area)
1288 T(AddArea(area));
1290 // add the area to the hash table
1292 sAreaTable.InsertUnchecked(area);
1295 // add the area's meta chunks to the free lists
1296 sFreeShortMetaChunks.Add(&area->metaChunks[0]);
1298 sFreeCompleteMetaChunks.Add(&area->metaChunks[i]);
1313 Area* area;
1317 // create an area
1328 area = _AreaForAddress((addr_t)areaBase);
1335 (addr_t)area, (addr_t)areaBase + SLAB_AREA_SIZE - 1);
1338 status_t error = _MapChunk(vmArea, (addr_t)area, kAreaAdminSize,
1346 dprintf("slab memory manager: created area %p (%" B_PRId32 ")\n", area,
1357 area = _AreaForAddress((addr_t)areaBase);
1359 TRACE("MemoryManager::_AllocateArea(): allocated early area %p\n",
1360 area);
1363 // init the area structure
1364 area->vmArea = vmArea;
1365 area->reserved_memory_for_mapping = pagesNeededToMap * B_PAGE_SIZE;
1366 area->usedMetaChunkCount = 0;
1367 area->fullyMapped = vmArea == NULL;
1371 MetaChunk* metaChunk = area->metaChunks + i;
1383 _area = area;
1385 T(AllocateArea(area, flags));
1392 MemoryManager::_FreeArea(Area* area, bool areaRemoved, uint32 flags)
1394 TRACE("MemoryManager::_FreeArea(%p, %#" B_PRIx32 ")\n", area, flags);
1396 T(FreeArea(area, areaRemoved, flags));
1398 ASSERT(area->usedMetaChunkCount == 0);
1401 // remove the area's meta chunks from the free lists
1402 ASSERT(area->metaChunks[0].usedChunkCount == 0);
1403 sFreeShortMetaChunks.Remove(&area->metaChunks[0]);
1406 ASSERT(area->metaChunks[i].usedChunkCount == 0);
1407 sFreeCompleteMetaChunks.Remove(&area->metaChunks[i]);
1410 // remove the area from the hash table
1412 sAreaTable.RemoveUnchecked(area);
1418 _PushFreeArea(area);
1422 if (area->vmArea == NULL || (flags & CACHE_DONT_LOCK_KERNEL_SPACE) != 0) {
1424 // delete the area now.
1425 _PushFreeArea(area);
1432 dprintf("slab memory manager: deleting area %p (%" B_PRId32 ")\n", area,
1433 area->vmArea->id);
1435 size_t memoryToUnreserve = area->reserved_memory_for_mapping;
1436 delete_area(area->vmArea->id);
1562 MemoryManager::_UnmapFreeChunksEarly(Area* area)
1564 if (!area->fullyMapped)
1567 TRACE("MemoryManager::_UnmapFreeChunksEarly(%p)\n", area);
1571 _UnmapChunk(area->vmArea, area->BaseAddress(), SLAB_AREA_STRUCT_OFFSET,
1576 MetaChunk* metaChunk = area->metaChunks + i;
1580 _UnmapChunk(area->vmArea, (addr_t)area + kAreaAdminSize,
1583 _UnmapChunk(area->vmArea,
1584 area->BaseAddress() + i * SLAB_CHUNK_SIZE_LARGE,
1591 _UnmapChunk(area->vmArea, _ChunkAddress(metaChunk, chunk),
1597 addr_t unusedStart = (addr_t)area + kAreaAdminSize;
1599 _UnmapChunk(area->vmArea, unusedStart,
1606 area->fullyMapped = false;
1611 MemoryManager::_ConvertEarlyArea(Area* area)
1613 void* address = (void*)area->BaseAddress();
1620 area->vmArea = VMAreas::Lookup(areaID);
1655 Area* area = metaChunk->GetArea();
1656 int32 metaChunkIndex = metaChunk - area->metaChunks;
1682 addr_t expectedBase = area->BaseAddress()
1774 B_PRINTF_POINTER_WIDTH, "area", B_PRINTF_POINTER_WIDTH, "base");
1779 Area* area = it.Next();) {
1781 MetaChunk* metaChunk = area->metaChunks + i;
1800 B_PRIuSIZE "\n", area, i, k, (void*)chunkAddress,
1897 Area* area = _AreaForAddress(address);
1900 if ((addr_t)address >= (addr_t)area->metaChunks
1902 < (addr_t)(area->metaChunks + SLAB_META_CHUNKS_PER_AREA)) {
1905 metaChunk = area->metaChunks
1970 Area* area = _AreaForAddress((addr_t)address);
1973 MetaChunk* metaChunk = area->metaChunks + k;
1985 B_PRINTF_POINTER_WIDTH, "base", B_PRINTF_POINTER_WIDTH, "area");
1995 Area* area = it.Next();) {
2006 MetaChunk* metaChunk = area->metaChunks + i;
2026 area, area->vmArea, area->usedMetaChunkCount,
2037 kprintf("%d free area%s:\n", sFreeAreaCount,
2039 for (Area* area = sFreeAreas; area != NULL; area = area->next) {
2041 kprintf("%p %p\n", area, area->vmArea);