Logged In: NO

Maybe SuSE 8 is using an -aa kernel. I tried with latest
-aa kernels and the resulting module compiles but does not
load with a unresolved symbol.

With this patch it compiles and loads under 2.4.19-pre8aa2.
But now every GL application (even glxinfo) segfaults using
latest cvs XFree, even with 2.4.19-pre8 kernel and stock drm
module...

My card is a radeon 7500 and the mainboard is a VIA based
Aopen KT133.

diff -urN drm_proc.h drm_proc.h
--- drm_proc.h Fri May 3 20:24:03 2002
+++ drm_proc.h Sat May 4 14:21:47 2002
@@ -449,7 +449,7 @@
for (i = vma->vm_start; i < vma->vm_end; i
+= PAGE_SIZE) {
pgd = pgd_offset(vma->vm_mm, i);
pmd = pmd_offset(pgd, i);
- pte = pte_offset(pmd, i);
+ pte = pte_offset_atomic(pmd, i);
if (pte_present(*pte)) {
address = __pa(pte_page(*pte))
+ (i & (PAGE_SIZE-1));
@@ -465,6 +465,7 @@
} else {
DRM_PROC_PRINT("
0x%08lx\n", i);
}
+ pte_kunmap(pte);
}
#endif
}
diff -urN drm_scatter.h drm_scatter.h
--- drm_scatter.h Tue Jan 22 18:53:28 2002
+++ drm_scatter.h Sat May 4 14:21:47 2002
@@ -66,9 +66,6 @@
drm_scatter_gather_t request;
drm_sg_mem_t *entry;
unsigned long pages, i, j;
- pgd_t *pgd;
- pmd_t *pmd;
- pte_t *pte;

DRM_DEBUG( "%s\n", __FUNCTION__ );

@@ -135,21 +132,10 @@
DRM_DEBUG( "sg alloc virtual = %p\n", entry->virtual );

for ( i = entry->handle, j = 0 ; j < pages ; i +=
PAGE_SIZE, j++ ) {
- pgd = pgd_offset_k( i );
- if ( !pgd_present( *pgd ) )
+ entry->pagelist[j] = vmalloc_to_page((void *)i);
+ if (!entry->pagelist[j])
goto failed;
-
- pmd = pmd_offset( pgd, i );
- if ( !pmd_present( *pmd ) )
- goto failed;
-
- pte = pte_offset( pmd, i );
- if ( !pte_present( *pte ) )
- goto failed;
-
- entry->pagelist[j] = pte_page( *pte );
-
- SetPageReserved( entry->pagelist[j] );
+ SetPageReserved(entry->pagelist[j]);
}

request.handle = entry->handle;
diff -urN drm_vm.h drm_vm.h
--- drm_vm.h Fri May 3 20:24:03 2002
+++ drm_vm.h Sat May 4 14:21:47 2002
@@ -152,9 +152,6 @@
#endif
unsigned long offset;
unsigned long i;
- pgd_t *pgd;
- pmd_t *pmd;
- pte_t *pte;
struct page *page;

if (address > vma->vm_end) return NOPAGE_SIGBUS; /*
Disallow mremap */
@@ -162,17 +159,9 @@

offset = address - vma->vm_start;
i = (unsigned long)map->handle + offset;
- /* We have to walk page tables here because we need
large SAREA's, and
- * they need to be virtually contiguous in kernel space.
- */
- pgd = pgd_offset_k( i );
- if( !pgd_present( *pgd ) ) return NOPAGE_OOM;
- pmd = pmd_offset( pgd, i );
- if( !pmd_present( *pmd ) ) return NOPAGE_OOM;
- pte = pte_offset( pmd, i );
- if( !pte_present( *pte ) ) return NOPAGE_OOM;
-
- page = pte_page(*pte);
+ page = vmalloc_to_page((void *)i);
+ if (!page)
+ return NOPAGE_OOM;
get_page(page);

DRM_DEBUG("shm_nopage 0x%lx\n", address);