245 |
247 |
246 /** Page fault callback for a virtual memory area. |
248 /** Page fault callback for a virtual memory area. |
247 * |
249 * |
248 * Called at the first access on a virtual-memory area retrieved with |
250 * Called at the first access on a virtual-memory area retrieved with |
249 * ecdev_mmap(). |
251 * ecdev_mmap(). |
|
252 * |
|
253 * \return Zero on success, otherwise a negative error code. |
250 */ |
254 */ |
251 static int eccdev_vma_fault( |
255 static int eccdev_vma_fault( |
252 struct vm_area_struct *vma, /**< Virtual memory area. */ |
256 struct vm_area_struct *vma, /**< Virtual memory area. */ |
253 struct vm_fault *vmf /**< Fault data. */ |
257 struct vm_fault *vmf /**< Fault data. */ |
254 ) |
258 ) |
255 { |
259 { |
256 unsigned long offset = vmf->pgoff << PAGE_SHIFT; |
260 unsigned long offset = vmf->pgoff << PAGE_SHIFT; |
257 ec_cdev_priv_t *priv = (ec_cdev_priv_t *) vma->vm_private_data; |
261 ec_cdev_priv_t *priv = (ec_cdev_priv_t *) vma->vm_private_data; |
258 struct page *page; |
262 struct page *page; |
259 |
263 |
260 if (offset >= priv->ctx.process_data_size) |
264 if (offset >= priv->ctx.process_data_size) { |
261 return VM_FAULT_SIGBUS; |
265 return VM_FAULT_SIGBUS; |
|
266 } |
262 |
267 |
263 page = vmalloc_to_page(priv->ctx.process_data + offset); |
268 page = vmalloc_to_page(priv->ctx.process_data + offset); |
264 if (!page) |
269 if (!page) { |
265 return VM_FAULT_SIGBUS; |
270 return VM_FAULT_SIGBUS; |
|
271 } |
266 |
272 |
267 get_page(page); |
273 get_page(page); |
268 vmf->page = page; |
274 vmf->page = page; |
269 |
275 |
270 EC_MASTER_DBG(priv->cdev->master, 1, "Vma fault, virtual_address = %p," |
276 EC_MASTER_DBG(priv->cdev->master, 1, "Vma fault, virtual_address = %p," |