* Added "swap" debugger command printing some info on the swap space.
* Fixed lock leak in Write(). * Fixed bug in _Commit(): swap_space_reserve() was fed with the wrong value (could even be negative). * swap_free_page_swap_space(): Removed incrementing of sAvailSwapSpace. The function is only supposed to deallocate swap space, not to unreserve it. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27071 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
5c8d420b7c
commit
c9b064de56
@ -135,6 +135,37 @@ static mutex sAvailSwapSpaceLock;
|
|||||||
static object_cache *sSwapBlockCache;
|
static object_cache *sSwapBlockCache;
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
dump_swap_info(int argc, char** argv)
|
||||||
|
{
|
||||||
|
swap_addr_t totalSwapPages = 0;
|
||||||
|
swap_addr_t usedSwapPages = 0;
|
||||||
|
|
||||||
|
kprintf("swap files:\n");
|
||||||
|
|
||||||
|
for (SwapFileList::Iterator it = sSwapFileList.GetIterator();
|
||||||
|
swap_file* file = it.Next();) {
|
||||||
|
swap_addr_t total = file->last_slot - file->first_slot;
|
||||||
|
kprintf(" vnode: %p, pages: total: %lu, used: %lu\n",
|
||||||
|
file->vnode, total, file->used);
|
||||||
|
|
||||||
|
totalSwapPages += total;
|
||||||
|
usedSwapPages += file->used;
|
||||||
|
}
|
||||||
|
|
||||||
|
kprintf("\n");
|
||||||
|
kprintf("swap space in pages:\n");
|
||||||
|
kprintf("total: %9lu\n", totalSwapPages);
|
||||||
|
kprintf("available: %9llu\n", sAvailSwapSpace / B_PAGE_SIZE);
|
||||||
|
kprintf("reserved: %9llu\n",
|
||||||
|
totalSwapPages - sAvailSwapSpace / B_PAGE_SIZE);
|
||||||
|
kprintf("used: %9lu\n", usedSwapPages);
|
||||||
|
kprintf("free: %9lu\n", totalSwapPages - usedSwapPages);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static swap_addr_t
|
static swap_addr_t
|
||||||
swap_slot_alloc(uint32 count)
|
swap_slot_alloc(uint32 count)
|
||||||
{
|
{
|
||||||
@ -388,7 +419,8 @@ VMAnonymousCache::Write(off_t offset, const iovec *vecs, size_t count,
|
|||||||
{
|
{
|
||||||
off_t pageIndex = offset >> PAGE_SHIFT;
|
off_t pageIndex = offset >> PAGE_SHIFT;
|
||||||
|
|
||||||
Lock();
|
AutoLocker<VMCache> locker(this);
|
||||||
|
|
||||||
for (uint32 i = 0; i < count; i++) {
|
for (uint32 i = 0; i < count; i++) {
|
||||||
swap_addr_t slotIndex = _SwapBlockGetAddress(pageIndex + i);
|
swap_addr_t slotIndex = _SwapBlockGetAddress(pageIndex + i);
|
||||||
if (slotIndex != SWAP_SLOT_NONE) {
|
if (slotIndex != SWAP_SLOT_NONE) {
|
||||||
@ -402,7 +434,7 @@ VMAnonymousCache::Write(off_t offset, const iovec *vecs, size_t count,
|
|||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|
||||||
fAllocatedSwapSize += count * B_PAGE_SIZE;
|
fAllocatedSwapSize += count * B_PAGE_SIZE;
|
||||||
Unlock();
|
locker.Unlock();
|
||||||
|
|
||||||
uint32 n = count;
|
uint32 n = count;
|
||||||
for (uint32 i = 0; i < count; i += n) {
|
for (uint32 i = 0; i < count; i += n) {
|
||||||
@ -420,9 +452,9 @@ VMAnonymousCache::Write(off_t offset, const iovec *vecs, size_t count,
|
|||||||
status_t status = vfs_write_pages(swapFile->vnode, NULL, pos, vecs + i,
|
status_t status = vfs_write_pages(swapFile->vnode, NULL, pos, vecs + i,
|
||||||
n, flags, _numBytes);
|
n, flags, _numBytes);
|
||||||
if (status != B_OK) {
|
if (status != B_OK) {
|
||||||
Lock();
|
locker.Lock();
|
||||||
fAllocatedSwapSize -= n * B_PAGE_SIZE;
|
fAllocatedSwapSize -= n * B_PAGE_SIZE;
|
||||||
Unlock();
|
locker.Unlock();
|
||||||
|
|
||||||
swap_slot_dealloc(slotIndex, n);
|
swap_slot_dealloc(slotIndex, n);
|
||||||
return status;
|
return status;
|
||||||
@ -625,7 +657,7 @@ VMAnonymousCache::_Commit(off_t size)
|
|||||||
// we always try to reserve as much as possible of the final commitment
|
// we always try to reserve as much as possible of the final commitment
|
||||||
// in the swap space.
|
// in the swap space.
|
||||||
if (size > fCommittedSwapSize) {
|
if (size > fCommittedSwapSize) {
|
||||||
fCommittedSwapSize += swap_space_reserve(size - committed_size);
|
fCommittedSwapSize += swap_space_reserve(size - fCommittedSwapSize);
|
||||||
committed_size = fCommittedSwapSize + committedMemory;
|
committed_size = fCommittedSwapSize + committedMemory;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -797,6 +829,11 @@ swap_init(void)
|
|||||||
// init available swap space
|
// init available swap space
|
||||||
mutex_init(&sAvailSwapSpaceLock, "avail swap space");
|
mutex_init(&sAvailSwapSpaceLock, "avail swap space");
|
||||||
sAvailSwapSpace = 0;
|
sAvailSwapSpace = 0;
|
||||||
|
|
||||||
|
add_debugger_command_etc("swap", &dump_swap_info,
|
||||||
|
"Print infos about the swap usage",
|
||||||
|
"\n"
|
||||||
|
"Print infos about the swap usage.\n", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -860,10 +897,6 @@ swap_free_page_swap_space(vm_page *page)
|
|||||||
cache->fAllocatedSwapSize -= B_PAGE_SIZE;
|
cache->fAllocatedSwapSize -= B_PAGE_SIZE;
|
||||||
cache->_SwapBlockFree(page->cache_offset, 1);
|
cache->_SwapBlockFree(page->cache_offset, 1);
|
||||||
|
|
||||||
mutex_lock(&sAvailSwapSpaceLock);
|
|
||||||
sAvailSwapSpace += B_PAGE_SIZE;
|
|
||||||
mutex_unlock(&sAvailSwapSpaceLock);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user