Removed the TRACEPFAULT macro, as it's not really that useful.
Fixed some warnings with debug output enabled. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@9370 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
8593dcc214
commit
8cab02c5ce
@ -47,13 +47,6 @@
|
|||||||
# define TRACE(x) ;
|
# define TRACE(x) ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TRACE_PFAULT 0
|
|
||||||
#if TRACE_PFAULT
|
|
||||||
# define TRACEPFAULT dprintf("in pfault at line %d\n", __LINE__)
|
|
||||||
#else
|
|
||||||
# define TRACEPFAULT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define ROUNDUP(a, b) (((a) + ((b)-1)) & ~((b)-1))
|
#define ROUNDUP(a, b) (((a) + ((b)-1)) & ~((b)-1))
|
||||||
#define ROUNDOWN(a, b) (((a) / (b)) * (b))
|
#define ROUNDOWN(a, b) (((a) / (b)) * (b))
|
||||||
|
|
||||||
@ -1940,7 +1933,7 @@ vm_page_fault(addr_t address, addr_t fault_address, bool is_write, bool is_user,
|
|||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
TRACE(("vm_page_fault: page fault at 0x%x, ip 0x%x\n", address, fault_address));
|
TRACE(("vm_page_fault: page fault at 0x%lx, ip 0x%lx\n", address, fault_address));
|
||||||
|
|
||||||
*newip = 0;
|
*newip = 0;
|
||||||
|
|
||||||
@ -1986,8 +1979,8 @@ vm_soft_fault(addr_t originalAddress, bool isWrite, bool isUser)
|
|||||||
int change_count;
|
int change_count;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
TRACE(("vm_soft_fault: thid 0x%x address 0x%x, isWrite %d, isUser %d\n",
|
TRACE(("vm_soft_fault: thid 0x%lx address 0x%lx, isWrite %d, isUser %d\n",
|
||||||
thread_get_current_thread_id(), address, isWrite, isUser));
|
thread_get_current_thread_id(), originalAddress, isWrite, isUser));
|
||||||
|
|
||||||
address = ROUNDOWN(originalAddress, PAGE_SIZE);
|
address = ROUNDOWN(originalAddress, PAGE_SIZE);
|
||||||
|
|
||||||
@ -2040,8 +2033,6 @@ vm_soft_fault(addr_t originalAddress, bool isWrite, bool isUser)
|
|||||||
// We have the area, it was a valid access, so let's try to resolve the page fault now.
|
// We have the area, it was a valid access, so let's try to resolve the page fault now.
|
||||||
// At first, the top most cache from the area is investigated
|
// At first, the top most cache from the area is investigated
|
||||||
|
|
||||||
TRACEPFAULT;
|
|
||||||
|
|
||||||
top_cache_ref = region->cache_ref;
|
top_cache_ref = region->cache_ref;
|
||||||
cache_offset = address - region->base + region->cache_offset;
|
cache_offset = address - region->base + region->cache_offset;
|
||||||
vm_cache_acquire_ref(top_cache_ref, true);
|
vm_cache_acquire_ref(top_cache_ref, true);
|
||||||
@ -2062,8 +2053,6 @@ vm_soft_fault(addr_t originalAddress, bool isWrite, bool isUser)
|
|||||||
// The top most cache has no fault handler, so let's see if the cache or its sources
|
// The top most cache has no fault handler, so let's see if the cache or its sources
|
||||||
// already have the page we're searching for (we're going from top to bottom)
|
// already have the page we're searching for (we're going from top to bottom)
|
||||||
|
|
||||||
TRACEPFAULT;
|
|
||||||
|
|
||||||
dummy_page.state = PAGE_STATE_INACTIVE;
|
dummy_page.state = PAGE_STATE_INACTIVE;
|
||||||
dummy_page.type = PAGE_TYPE_DUMMY;
|
dummy_page.type = PAGE_TYPE_DUMMY;
|
||||||
|
|
||||||
@ -2071,8 +2060,6 @@ vm_soft_fault(addr_t originalAddress, bool isWrite, bool isUser)
|
|||||||
for (cache_ref = top_cache_ref; cache_ref; cache_ref = (cache_ref->cache->source) ? cache_ref->cache->source->ref : NULL) {
|
for (cache_ref = top_cache_ref; cache_ref; cache_ref = (cache_ref->cache->source) ? cache_ref->cache->source->ref : NULL) {
|
||||||
mutex_lock(&cache_ref->lock);
|
mutex_lock(&cache_ref->lock);
|
||||||
|
|
||||||
TRACEPFAULT;
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
page = vm_cache_lookup_page(cache_ref, cache_offset);
|
page = vm_cache_lookup_page(cache_ref, cache_offset);
|
||||||
if (page != NULL && page->state != PAGE_STATE_BUSY) {
|
if (page != NULL && page->state != PAGE_STATE_BUSY) {
|
||||||
@ -2084,8 +2071,6 @@ vm_soft_fault(addr_t originalAddress, bool isWrite, bool isUser)
|
|||||||
if (page == NULL)
|
if (page == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
TRACEPFAULT;
|
|
||||||
|
|
||||||
// page must be busy
|
// page must be busy
|
||||||
// ToDo: don't wait forever!
|
// ToDo: don't wait forever!
|
||||||
mutex_unlock(&cache_ref->lock);
|
mutex_unlock(&cache_ref->lock);
|
||||||
@ -2093,15 +2078,11 @@ vm_soft_fault(addr_t originalAddress, bool isWrite, bool isUser)
|
|||||||
mutex_lock(&cache_ref->lock);
|
mutex_lock(&cache_ref->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACEPFAULT;
|
|
||||||
|
|
||||||
if (page != NULL)
|
if (page != NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// The current cache does not contain the page we're looking for
|
// The current cache does not contain the page we're looking for
|
||||||
|
|
||||||
TRACEPFAULT;
|
|
||||||
|
|
||||||
// If we're at the top most cache, insert the dummy page here to keep other threads
|
// If we're at the top most cache, insert the dummy page here to keep other threads
|
||||||
// from faulting on the same address and chasing us up the cache chain
|
// from faulting on the same address and chasing us up the cache chain
|
||||||
if (cache_ref == top_cache_ref) {
|
if (cache_ref == top_cache_ref) {
|
||||||
@ -2117,8 +2098,6 @@ vm_soft_fault(addr_t originalAddress, bool isWrite, bool isUser)
|
|||||||
|
|
||||||
vec.iov_len = bytesRead = B_PAGE_SIZE;
|
vec.iov_len = bytesRead = B_PAGE_SIZE;
|
||||||
|
|
||||||
TRACEPFAULT;
|
|
||||||
|
|
||||||
mutex_unlock(&cache_ref->lock);
|
mutex_unlock(&cache_ref->lock);
|
||||||
|
|
||||||
page = vm_page_allocate_page(PAGE_STATE_FREE);
|
page = vm_page_allocate_page(PAGE_STATE_FREE);
|
||||||
@ -2139,11 +2118,8 @@ vm_soft_fault(addr_t originalAddress, bool isWrite, bool isUser)
|
|||||||
}
|
}
|
||||||
mutex_unlock(&cache_ref->lock);
|
mutex_unlock(&cache_ref->lock);
|
||||||
last_cache_ref = cache_ref;
|
last_cache_ref = cache_ref;
|
||||||
TRACEPFAULT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACEPFAULT;
|
|
||||||
|
|
||||||
if (!cache_ref) {
|
if (!cache_ref) {
|
||||||
// We rolled off the end of the cache chain, so we need to decide which
|
// We rolled off the end of the cache chain, so we need to decide which
|
||||||
// cache will get the new page we're about to create.
|
// cache will get the new page we're about to create.
|
||||||
@ -2153,8 +2129,6 @@ vm_soft_fault(addr_t originalAddress, bool isWrite, bool isUser)
|
|||||||
// top most cache may have direct write access.
|
// top most cache may have direct write access.
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACEPFAULT;
|
|
||||||
|
|
||||||
if (page == NULL) {
|
if (page == NULL) {
|
||||||
// we still haven't found a page, so we allocate a clean one
|
// we still haven't found a page, so we allocate a clean one
|
||||||
page = vm_page_allocate_page(PAGE_STATE_CLEAR);
|
page = vm_page_allocate_page(PAGE_STATE_CLEAR);
|
||||||
@ -2186,14 +2160,13 @@ vm_soft_fault(addr_t originalAddress, bool isWrite, bool isUser)
|
|||||||
// We now have the page and a cache it belongs to - we now need to make
|
// We now have the page and a cache it belongs to - we now need to make
|
||||||
// sure that the area's cache can access it, too, and sees the correct data
|
// sure that the area's cache can access it, too, and sees the correct data
|
||||||
|
|
||||||
TRACEPFAULT;
|
|
||||||
|
|
||||||
if (page->cache != top_cache_ref->cache && isWrite) {
|
if (page->cache != top_cache_ref->cache && isWrite) {
|
||||||
// now we have a page that has the data we want, but in the wrong cache object
|
// now we have a page that has the data we want, but in the wrong cache object
|
||||||
// so we need to copy it and stick it into the top cache
|
// so we need to copy it and stick it into the top cache
|
||||||
vm_page *src_page = page;
|
vm_page *src_page = page;
|
||||||
void *src, *dest;
|
void *src, *dest;
|
||||||
|
|
||||||
|
TRACE(("get new page, copy it, and put it into the topmost cache\n"));
|
||||||
page = vm_page_allocate_page(PAGE_STATE_FREE);
|
page = vm_page_allocate_page(PAGE_STATE_FREE);
|
||||||
|
|
||||||
// try to get a mapping for the src and dest page so we can copy it
|
// try to get a mapping for the src and dest page so we can copy it
|
||||||
@ -2238,8 +2211,6 @@ vm_soft_fault(addr_t originalAddress, bool isWrite, bool isUser)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACEPFAULT;
|
|
||||||
|
|
||||||
err = 0;
|
err = 0;
|
||||||
acquire_sem_etc(map->sem, READ_COUNT, 0, 0);
|
acquire_sem_etc(map->sem, READ_COUNT, 0, 0);
|
||||||
if (change_count != map->change_count) {
|
if (change_count != map->change_count) {
|
||||||
@ -2253,8 +2224,6 @@ vm_soft_fault(addr_t originalAddress, bool isWrite, bool isUser)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACEPFAULT;
|
|
||||||
|
|
||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
// All went fine, all there is left to do is to map the page into the address space
|
// All went fine, all there is left to do is to map the page into the address space
|
||||||
|
|
||||||
@ -2271,12 +2240,8 @@ vm_soft_fault(addr_t originalAddress, bool isWrite, bool isUser)
|
|||||||
(*aspace->translation_map.ops->unlock)(&aspace->translation_map);
|
(*aspace->translation_map.ops->unlock)(&aspace->translation_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACEPFAULT;
|
|
||||||
|
|
||||||
release_sem_etc(map->sem, READ_COUNT, 0);
|
release_sem_etc(map->sem, READ_COUNT, 0);
|
||||||
|
|
||||||
TRACEPFAULT;
|
|
||||||
|
|
||||||
if (dummy_page.state == PAGE_STATE_BUSY) {
|
if (dummy_page.state == PAGE_STATE_BUSY) {
|
||||||
// We still have the dummy page in the cache - that happens if we didn't need
|
// We still have the dummy page in the cache - that happens if we didn't need
|
||||||
// to allocate a new page before, but could use one in another cache
|
// to allocate a new page before, but could use one in another cache
|
||||||
@ -2287,15 +2252,11 @@ vm_soft_fault(addr_t originalAddress, bool isWrite, bool isUser)
|
|||||||
dummy_page.state = PAGE_STATE_INACTIVE;
|
dummy_page.state = PAGE_STATE_INACTIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACEPFAULT;
|
|
||||||
|
|
||||||
vm_page_set_state(page, PAGE_STATE_ACTIVE);
|
vm_page_set_state(page, PAGE_STATE_ACTIVE);
|
||||||
|
|
||||||
vm_cache_release_ref(top_cache_ref);
|
vm_cache_release_ref(top_cache_ref);
|
||||||
vm_put_aspace(aspace);
|
vm_put_aspace(aspace);
|
||||||
|
|
||||||
TRACEPFAULT;
|
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user