diff --git a/ChangeLog b/ChangeLog index b5011930..0b2c85c3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sun Sep 14 16:04:17 2008 Søren Sandmann + + * sysprof/module/sysprof-module.c: Update to work with new + vm_operations interface from 2.6.23. Patch from Chris Wilson. + Wed Jun 4 21:52:17 2008 Søren Sandmann * demangle.c: Apply patch from binutils to demangle local-source diff --git a/module/sysprof-module.c b/module/sysprof-module.c index 81c6b102..9adc53e9 100644 --- a/module/sysprof-module.c +++ b/module/sysprof-module.c @@ -459,6 +459,29 @@ sysprof_open(struct inode *inode, struct file *file) return retval; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)) +static int +sysprof_fault(struct vm_area_struct *vma, struct vm_fault *vmf) +{ + unsigned long area_start; + unsigned long virt; + +#if 0 + printk (KERN_ALERT "fault called: %p (offset: %d) area: %p\n", vmf->virtual_address, addr - vma->vm_start, area); +#endif + + area_start = (unsigned long)area; + + virt = area_start + ((unsigned long)vmf->virtual_address - vma->vm_start); + if (virt > area_start + sizeof (SysprofMmapArea)) + return VM_FAULT_SIGBUS; + + vmf->page = vmalloc_to_page ((void *)virt); + get_page (vmf->page); + + return 0; +} +#else static struct page * sysprof_nopage(struct vm_area_struct *vma, unsigned long addr, int *type) { @@ -486,12 +509,17 @@ sysprof_nopage(struct vm_area_struct *vma, unsigned long addr, int *type) return page_ptr; } +#endif static int sysprof_mmap(struct file *filp, struct vm_area_struct *vma) { static struct vm_operations_struct ops = { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)) + .fault = sysprof_fault, +#else .nopage = sysprof_nopage, +#endif }; if (vma->vm_flags & (VM_WRITE | VM_EXEC))