2610 static int eccdev_vma_fault( |
2610 static int eccdev_vma_fault( |
2611 struct vm_area_struct *vma, /**< Virtual memory area. */ |
2611 struct vm_area_struct *vma, /**< Virtual memory area. */ |
2612 struct vm_fault *vmf /**< Fault data. */ |
2612 struct vm_fault *vmf /**< Fault data. */ |
2613 ) |
2613 ) |
2614 { |
2614 { |
|
2615 unsigned long offset = vmf->pgoff << PAGE_SHIFT; |
|
2616 ec_cdev_priv_t *priv = (ec_cdev_priv_t *) vma->vm_private_data; |
2615 struct page *page; |
2617 struct page *page; |
2616 ec_cdev_priv_t *priv = (ec_cdev_priv_t *) vma->vm_private_data; |
2618 |
2617 |
2619 if (offset >= priv->process_data_size) |
2618 if (vmf->pgoff >= priv->process_data_size) |
|
2619 return VM_FAULT_SIGBUS; |
2620 return VM_FAULT_SIGBUS; |
2620 |
2621 |
2621 page = vmalloc_to_page(priv->process_data + vmf->pgoff); |
2622 page = vmalloc_to_page(priv->process_data + offset); |
2622 |
2623 if (!page) |
2623 if (priv->cdev->master->debug_level) |
2624 return VM_FAULT_SIGBUS; |
2624 EC_DBG("Vma fault, address = %p, offset = %lu, page = %p\n", |
|
2625 vmf->virtual_address, vmf->pgoff, page); |
|
2626 |
2625 |
2627 get_page(page); |
2626 get_page(page); |
2628 vmf->page = page; |
2627 vmf->page = page; |
2629 vmf->flags = 0; |
2628 |
|
2629 if (priv->cdev->master->debug_level) |
|
2630 EC_DBG("Vma fault, virtual_address = %p, offset = %lu, page = %p\n", |
|
2631 vmf->virtual_address, offset, page); |
|
2632 |
2630 return 0; |
2633 return 0; |
2631 } |
2634 } |
2632 |
2635 |
2633 #else |
2636 #else |
2634 |
2637 |