diff options
author | jdike <jdike> | 2004-04-07 20:45:47 +0000 |
---|---|---|
committer | jdike <jdike> | 2004-04-07 20:45:47 +0000 |
commit | 98ec7b5936dd520887dadda29b5974aca4253a27 (patch) | |
tree | 5e8372c5c7e46ca3a078bba154e76fb281bb4715 | |
parent | bee6e6cdbde5d895b2bdf5de9ac941a9d74afeef (diff) | |
download | uml-history-98ec7b5936dd520887dadda29b5974aca4253a27.tar.gz |
Added some debugging.
Gracefully handle the case where a map request happens for a page that's already
correctly mapped.
-rw-r--r-- | arch/um/kernel/physmem.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/arch/um/kernel/physmem.c b/arch/um/kernel/physmem.c index 5509c58..04badf5 100644 --- a/arch/um/kernel/physmem.c +++ b/arch/um/kernel/physmem.c @@ -100,14 +100,19 @@ int physmem_subst_mapping(void *virt, int fd, __u64 offset, int w) unsigned long phys; int err; + phys = __pa(virt); + desc = find_virtmem_hash(&virtmem_hash, (void *) virt); + if(desc != NULL){ + if((virt != desc->virt) || (fd != desc->fd) || + (offset != desc->offset)) + panic("Address 0x%p is already substituted\n", virt); + return(0); + } + fd_maps = descriptor_mapping(fd); if(fd_maps == NULL) return(-ENOMEM); - phys = __pa(virt); - if(find_virtmem_hash(&virtmem_hash, virt) != NULL) - panic("Address 0x%p is already substituted\n", virt); - err = -ENOMEM; desc = kmalloc(sizeof(*desc), GFP_ATOMIC); if(desc == NULL) @@ -178,6 +183,9 @@ void physmem_forget_descriptor(int fd) if(desc == NULL) return; + if(!list_empty(&desc->pages)) + printk("Still have mapped pages on fd %d\n", fd); + list_for_each_safe(ele, next, &desc->pages){ page = list_entry(ele, struct phys_desc, list); offset = page->offset; @@ -210,9 +218,16 @@ void arch_free_page(struct page *page, int order) } } -int is_remapped(void *virt) +int is_remapped(const void *virt, int fd, __u64 offset) { - return(find_virtmem_hash(&virtmem_hash, virt) != NULL); + struct phys_desc *desc; + + desc = find_virtmem_hash(&virtmem_hash, (void *) virt); + if(desc == NULL) + return(0); + if(offset != desc->offset) + printk("offset mismatch\n"); + return(find_virtmem_hash(&virtmem_hash, (void *) virt) != NULL); } /* Changed during early boot */ |