Hi, folks,
as Ross mentioned four days ago, nopfn has gone from the kernel tree.
Therefore we need to adapt drm_vm.c to use fault instead.
What do you think about the attached patch?
Cheers, Johannes
>From ba506005a6e7f7beaaedad7919eebf44b6e6db5b Mon Sep 17 00:00:00 2001
From: Johannes Engel <[EMAIL PROTECTED]>
Date: Tue, 29 Jul 2008 18:02:50 +0100
Subject: [PATCH 1/1] Replace nopfn by fault
This is necessary since kernel 2.6.27 will ship whithout nopfn
Signed-off-by: Johannes Engel <[EMAIL PROTECTED]>
---
linux-core/drm_vm.c | 27 ++++++++++++++-------------
1 files changed, 14 insertions(+), 13 deletions(-)
diff --git a/linux-core/drm_vm.c b/linux-core/drm_vm.c
index 6618c0a..ffe7d8a 100644
--- a/linux-core/drm_vm.c
+++ b/linux-core/drm_vm.c
@@ -699,8 +699,8 @@ EXPORT_SYMBOL(drm_mmap);
*/
#ifdef DRM_FULL_MM_COMPAT
-static unsigned long drm_bo_vm_nopfn(struct vm_area_struct *vma,
- unsigned long address)
+static int drm_bo_vm_fault(struct vm_area_struct *vma,
+ struct vm_fault *vmf)
{
struct drm_buffer_object *bo = (struct drm_buffer_object *) vma->vm_private_data;
unsigned long page_offset;
@@ -708,29 +708,30 @@ static unsigned long drm_bo_vm_nopfn(struct vm_area_struct *vma,
struct drm_ttm *ttm;
struct drm_device *dev;
unsigned long pfn;
+ unsigned long address = (unsigned long)vmf->virtual_address;
int err;
unsigned long bus_base;
unsigned long bus_offset;
unsigned long bus_size;
- unsigned long ret = NOPFN_REFAULT;
+ int ret = VM_FAULT_NOPAGE;
if (address > vma->vm_end)
- return NOPFN_SIGBUS;
+ return VM_FAULT_SIGBUS;
dev = bo->dev;
err = drm_bo_read_lock(&dev->bm.bm_lock, 1);
if (err)
- return NOPFN_REFAULT;
+ return VM_FAULT_NOPAGE;
err = mutex_lock_interruptible(&bo->mutex);
if (err) {
drm_bo_read_unlock(&dev->bm.bm_lock);
- return NOPFN_REFAULT;
+ return VM_FAULT_NOPAGE;
}
err = drm_bo_wait(bo, 0, 1, 0, 1);
if (err) {
- ret = (err != -EAGAIN) ? NOPFN_SIGBUS : NOPFN_REFAULT;
+ ret = (err != -EAGAIN) ? VM_FAULT_SIGBUS : VM_FAULT_NOPAGE;
bo->priv_flags &= ~_DRM_BO_FLAG_UNLOCKED;
goto out_unlock;
}
@@ -748,7 +749,7 @@ static unsigned long drm_bo_vm_nopfn(struct vm_area_struct *vma,
DRM_BO_FLAG_FORCE_MAPPABLE;
err = drm_bo_move_buffer(bo, new_flags, 0, 0);
if (err) {
- ret = (err != -EAGAIN) ? NOPFN_SIGBUS : NOPFN_REFAULT;
+ ret = (err != -EAGAIN) ? VM_FAULT_SIGBUS : VM_FAULT_NOPAGE;
goto out_unlock;
}
}
@@ -757,11 +758,11 @@ static unsigned long drm_bo_vm_nopfn(struct vm_area_struct *vma,
&bus_size);
if (err) {
- ret = NOPFN_SIGBUS;
+ ret = VM_FAULT_SIGBUS;
goto out_unlock;
}
- page_offset = (address - vma->vm_start) >> PAGE_SHIFT;
+ page_offset = 0 >> PAGE_SHIFT;
if (bus_size) {
struct drm_mem_type_manager *man = &dev->bm.man[bo->mem.mem_type];
@@ -774,7 +775,7 @@ static unsigned long drm_bo_vm_nopfn(struct vm_area_struct *vma,
drm_ttm_fixup_caching(ttm);
page = drm_ttm_get_page(ttm, page_offset);
if (!page) {
- ret = NOPFN_OOM;
+ ret = VM_FAULT_OOM;
goto out_unlock;
}
pfn = page_to_pfn(page);
@@ -785,7 +786,7 @@ static unsigned long drm_bo_vm_nopfn(struct vm_area_struct *vma,
err = vm_insert_pfn(vma, address, pfn);
if (err) {
- ret = (err != -EAGAIN) ? NOPFN_OOM : NOPFN_REFAULT;
+ ret = (err != -EAGAIN) ? VM_FAULT_OOM : VM_FAULT_NOPAGE;
goto out_unlock;
}
out_unlock:
@@ -849,7 +850,7 @@ static void drm_bo_vm_close(struct vm_area_struct *vma)
static struct vm_operations_struct drm_bo_vm_ops = {
#ifdef DRM_FULL_MM_COMPAT
- .nopfn = drm_bo_vm_nopfn,
+ .fault = drm_bo_vm_fault,
#else
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
.nopfn = drm_bo_vm_nopfn,
--
1.5.4.5
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
--
_______________________________________________
Dri-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel