Added VM cache kernel tracing.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25715 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -37,6 +37,7 @@
|
|||||||
#define TCP_TRACING 0
|
#define TCP_TRACING 0
|
||||||
#define TEAM_TRACING 0
|
#define TEAM_TRACING 0
|
||||||
#define USER_MALLOC_TRACING 0
|
#define USER_MALLOC_TRACING 0
|
||||||
|
#define VM_CACHE_TRACING 0
|
||||||
#define WAIT_FOR_OBJECTS_TRACING 0
|
#define WAIT_FOR_OBJECTS_TRACING 0
|
||||||
|
|
||||||
#endif // ENABLE_TRACING
|
#endif // ENABLE_TRACING
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
#include <kernel.h>
|
#include <kernel.h>
|
||||||
#include <lock.h>
|
#include <lock.h>
|
||||||
#include <smp.h>
|
#include <smp.h>
|
||||||
|
#include <tracing.h>
|
||||||
#include <util/khash.h>
|
#include <util/khash.h>
|
||||||
#include <util/AutoLock.h>
|
#include <util/AutoLock.h>
|
||||||
#include <vm.h>
|
#include <vm.h>
|
||||||
@@ -49,6 +50,198 @@ struct page_lookup_key {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#if VM_CACHE_TRACING
|
||||||
|
|
||||||
|
namespace VMCacheTracing {
|
||||||
|
|
||||||
|
class VMCacheTraceEntry : public AbstractTraceEntry {
|
||||||
|
public:
|
||||||
|
VMCacheTraceEntry(vm_cache* cache)
|
||||||
|
:
|
||||||
|
fCache(cache)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
vm_cache* fCache;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Create : public VMCacheTraceEntry {
|
||||||
|
public:
|
||||||
|
Create(vm_cache* cache, vm_store* store)
|
||||||
|
:
|
||||||
|
VMCacheTraceEntry(cache),
|
||||||
|
fStore(store)
|
||||||
|
{
|
||||||
|
Initialized();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void AddDump(TraceOutput& out)
|
||||||
|
{
|
||||||
|
out.Print("vm cache create: store: %p -> cache: %p", fStore,
|
||||||
|
fCache);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
vm_store* fStore;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Delete : public VMCacheTraceEntry {
|
||||||
|
public:
|
||||||
|
Delete(vm_cache* cache)
|
||||||
|
:
|
||||||
|
VMCacheTraceEntry(cache)
|
||||||
|
{
|
||||||
|
Initialized();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void AddDump(TraceOutput& out)
|
||||||
|
{
|
||||||
|
out.Print("vm cache delete: cache: %p", fCache);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class SetMinimalCommitment : public VMCacheTraceEntry {
|
||||||
|
public:
|
||||||
|
SetMinimalCommitment(vm_cache* cache, off_t commitment)
|
||||||
|
:
|
||||||
|
VMCacheTraceEntry(cache),
|
||||||
|
fOldCommitment(cache->store->committed_size),
|
||||||
|
fCommitment(commitment)
|
||||||
|
{
|
||||||
|
Initialized();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void AddDump(TraceOutput& out)
|
||||||
|
{
|
||||||
|
out.Print("vm cache set min commitment: cache: %p, "
|
||||||
|
"commitment: %lld -> %lld", fCache, fOldCommitment,
|
||||||
|
fCommitment);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
off_t fOldCommitment;
|
||||||
|
off_t fCommitment;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Resize : public VMCacheTraceEntry {
|
||||||
|
public:
|
||||||
|
Resize(vm_cache* cache, off_t size)
|
||||||
|
:
|
||||||
|
VMCacheTraceEntry(cache),
|
||||||
|
fOldSize(cache->virtual_size),
|
||||||
|
fSize(size)
|
||||||
|
{
|
||||||
|
Initialized();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void AddDump(TraceOutput& out)
|
||||||
|
{
|
||||||
|
out.Print("vm cache resize: cache: %p, size: %lld -> %lld", fCache,
|
||||||
|
fOldSize, fSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
off_t fOldSize;
|
||||||
|
off_t fSize;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class AddConsumer : public VMCacheTraceEntry {
|
||||||
|
public:
|
||||||
|
AddConsumer(vm_cache* cache, vm_cache* consumer)
|
||||||
|
:
|
||||||
|
VMCacheTraceEntry(cache),
|
||||||
|
fConsumer(consumer)
|
||||||
|
{
|
||||||
|
Initialized();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void AddDump(TraceOutput& out)
|
||||||
|
{
|
||||||
|
out.Print("vm cache add consumer: cache: %p, consumer: %p", fCache,
|
||||||
|
fConsumer);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
vm_cache* fConsumer;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class RemoveConsumer : public VMCacheTraceEntry {
|
||||||
|
public:
|
||||||
|
RemoveConsumer(vm_cache* cache, vm_cache* consumer)
|
||||||
|
:
|
||||||
|
VMCacheTraceEntry(cache),
|
||||||
|
fConsumer(consumer)
|
||||||
|
{
|
||||||
|
Initialized();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void AddDump(TraceOutput& out)
|
||||||
|
{
|
||||||
|
out.Print("vm cache remove consumer: cache: %p, consumer: %p",
|
||||||
|
fCache, fConsumer);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
vm_cache* fConsumer;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class InsertArea : public VMCacheTraceEntry {
|
||||||
|
public:
|
||||||
|
InsertArea(vm_cache* cache, vm_area* area)
|
||||||
|
:
|
||||||
|
VMCacheTraceEntry(cache),
|
||||||
|
fArea(area)
|
||||||
|
{
|
||||||
|
Initialized();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void AddDump(TraceOutput& out)
|
||||||
|
{
|
||||||
|
out.Print("vm cache insert area: cache: %p, area: %p", fCache,
|
||||||
|
fArea);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
vm_area* fArea;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class RemoveArea : public VMCacheTraceEntry {
|
||||||
|
public:
|
||||||
|
RemoveArea(vm_cache* cache, vm_area* area)
|
||||||
|
:
|
||||||
|
VMCacheTraceEntry(cache),
|
||||||
|
fArea(area)
|
||||||
|
{
|
||||||
|
Initialized();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void AddDump(TraceOutput& out)
|
||||||
|
{
|
||||||
|
out.Print("vm cache remove area: cache: %p, area: %p", fCache,
|
||||||
|
fArea);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
vm_area* fArea;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace VMCacheTracing
|
||||||
|
|
||||||
|
# define T(x) new(std::nothrow) VMCacheTracing::x;
|
||||||
|
#else
|
||||||
|
# define T(x) ;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
page_compare_func(void* _p, const void* _key)
|
page_compare_func(void* _p, const void* _key)
|
||||||
{
|
{
|
||||||
@@ -108,6 +301,8 @@ delete_cache(vm_cache* cache)
|
|||||||
if (!list_is_empty(&cache->consumers))
|
if (!list_is_empty(&cache->consumers))
|
||||||
panic("cache %p to be deleted still has consumers", cache);
|
panic("cache %p to be deleted still has consumers", cache);
|
||||||
|
|
||||||
|
T(Delete(cache));
|
||||||
|
|
||||||
#if DEBUG_CACHE_LIST
|
#if DEBUG_CACHE_LIST
|
||||||
int state = disable_interrupts();
|
int state = disable_interrupts();
|
||||||
acquire_spinlock(&sDebugCacheListLock);
|
acquire_spinlock(&sDebugCacheListLock);
|
||||||
@@ -226,6 +421,8 @@ vm_cache_create(vm_store* store)
|
|||||||
cache->store = store;
|
cache->store = store;
|
||||||
store->cache = cache;
|
store->cache = cache;
|
||||||
|
|
||||||
|
T(Create(cache, store));
|
||||||
|
|
||||||
return cache;
|
return cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -440,6 +637,8 @@ vm_cache_set_minimal_commitment_locked(vm_cache* cache, off_t commitment)
|
|||||||
cache, commitment));
|
cache, commitment));
|
||||||
ASSERT_LOCKED_MUTEX(&cache->lock);
|
ASSERT_LOCKED_MUTEX(&cache->lock);
|
||||||
|
|
||||||
|
T(SetMinimalCommitment(cache, commitment));
|
||||||
|
|
||||||
vm_store* store = cache->store;
|
vm_store* store = cache->store;
|
||||||
status_t status = B_OK;
|
status_t status = B_OK;
|
||||||
|
|
||||||
@@ -473,6 +672,8 @@ vm_cache_resize(vm_cache* cache, off_t newSize)
|
|||||||
cache, newSize, cache->virtual_size));
|
cache, newSize, cache->virtual_size));
|
||||||
ASSERT_LOCKED_MUTEX(&cache->lock);
|
ASSERT_LOCKED_MUTEX(&cache->lock);
|
||||||
|
|
||||||
|
T(Resize(cache, newSize));
|
||||||
|
|
||||||
status_t status = cache->store->ops->commit(cache->store, newSize);
|
status_t status = cache->store->ops->commit(cache->store, newSize);
|
||||||
if (status != B_OK)
|
if (status != B_OK)
|
||||||
return status;
|
return status;
|
||||||
@@ -536,6 +737,8 @@ vm_cache_remove_consumer(vm_cache* cache, vm_cache* consumer)
|
|||||||
TRACE(("remove consumer vm cache %p from cache %p\n", consumer, cache));
|
TRACE(("remove consumer vm cache %p from cache %p\n", consumer, cache));
|
||||||
ASSERT_LOCKED_MUTEX(&consumer->lock);
|
ASSERT_LOCKED_MUTEX(&consumer->lock);
|
||||||
|
|
||||||
|
T(RemoveConsumer(cache, consumer));
|
||||||
|
|
||||||
// Remove the store ref before locking the cache. Otherwise we'd call into
|
// Remove the store ref before locking the cache. Otherwise we'd call into
|
||||||
// the VFS while holding the cache lock, which would reverse the usual
|
// the VFS while holding the cache lock, which would reverse the usual
|
||||||
// locking order.
|
// locking order.
|
||||||
@@ -679,6 +882,8 @@ vm_cache_add_consumer_locked(vm_cache* cache, vm_cache* consumer)
|
|||||||
ASSERT_LOCKED_MUTEX(&cache->lock);
|
ASSERT_LOCKED_MUTEX(&cache->lock);
|
||||||
ASSERT_LOCKED_MUTEX(&consumer->lock);
|
ASSERT_LOCKED_MUTEX(&consumer->lock);
|
||||||
|
|
||||||
|
T(AddConsumer(cache, consumer));
|
||||||
|
|
||||||
consumer->source = cache;
|
consumer->source = cache;
|
||||||
list_add_item(&cache->consumers, consumer);
|
list_add_item(&cache->consumers, consumer);
|
||||||
|
|
||||||
@@ -698,6 +903,8 @@ vm_cache_insert_area_locked(vm_cache* cache, vm_area* area)
|
|||||||
TRACE(("vm_cache_insert_area_locked(cache %p, area %p)\n", cache, area));
|
TRACE(("vm_cache_insert_area_locked(cache %p, area %p)\n", cache, area));
|
||||||
ASSERT_LOCKED_MUTEX(&cache->lock);
|
ASSERT_LOCKED_MUTEX(&cache->lock);
|
||||||
|
|
||||||
|
T(InsertArea(cache, area));
|
||||||
|
|
||||||
area->cache_next = cache->areas;
|
area->cache_next = cache->areas;
|
||||||
if (area->cache_next)
|
if (area->cache_next)
|
||||||
area->cache_next->cache_prev = area;
|
area->cache_next->cache_prev = area;
|
||||||
@@ -716,6 +923,8 @@ vm_cache_remove_area(vm_cache* cache, vm_area* area)
|
|||||||
{
|
{
|
||||||
TRACE(("vm_cache_remove_area(cache %p, area %p)\n", cache, area));
|
TRACE(("vm_cache_remove_area(cache %p, area %p)\n", cache, area));
|
||||||
|
|
||||||
|
T(RemoveArea(cache, area));
|
||||||
|
|
||||||
MutexLocker locker(cache->lock);
|
MutexLocker locker(cache->lock);
|
||||||
|
|
||||||
if (area->cache_prev)
|
if (area->cache_prev)
|
||||||
|
|||||||
Reference in New Issue
Block a user