Ok, I basically got the latest minion.de (2003/07/13) to look as
follow:
----------------------------------
diff -urpN NVIDIA_kernel-1.0-4363/nv-linux.h
NVIDIA_kernel-1.0-4363.highpmd-fixup/nv-linux.h
--- NVIDIA_kernel-1.0-4363/nv-linux.h 2003-07-14 12:42:00.000000000
+0200
+++ NVIDIA_kernel-1.0-4363.highpmd-fixup/nv-linux.h 2003-07-14
13:38:02.000000000 +0200
@@ -228,14 +228,14 @@
#if defined(pmd_offset_map)
#define NV_PMD_OFFSET(address, pgd, pmd) \
- { \
- pmd_t *pmd__ = pmd_offset_map(pgd, address); \
- pmd = *pmd__; \
- pmd_unmap(pgd__); \
- }
+ pmd = pmd_offset_map(pgd, address)
+#define NV_PMD_UNMAP(pmd) \
+ pmd_unmap(pmd)
#else
#define NV_PMD_OFFSET(address, pgd, pmd) \
- pmd = *pmd_offset(pgd, address)
+ pmd = pmd_offset(pgd, address)
+#define NV_PMD_UNMAP(pmd) \
+ nop()
#endif
#define NV_PAGE_ALIGN(addr) ( ((addr) + PAGE_SIZE - 1) /
PAGE_SIZE)
diff -urpN NVIDIA_kernel-1.0-4363/nv.c
NVIDIA_kernel-1.0-4363.highpmd-fixup/nv.c
--- NVIDIA_kernel-1.0-4363/nv.c 2003-07-14 12:42:00.000000000 +0200
+++ NVIDIA_kernel-1.0-4363.highpmd-fixup/nv.c 2003-07-14
13:38:43.000000000 +0200
@@ -2087,7 +2087,7 @@ unsigned long
nv_get_phys_address(unsigned long address)
{
pgd_t *pgd;
- pmd_t pmd;
+ pmd_t *pmd;
pte_t pte;
#if defined(NVCPU_IA64)
@@ -2110,10 +2110,14 @@ nv_get_phys_address(unsigned long addres
NV_PMD_OFFSET(address, pgd, pmd);
- if (pmd_none(pmd))
+ if (pmd_none(*pmd)) {
+ NV_PMD_UNMAP(pmd);
goto failed;
+ }
+
+ NV_PTE_OFFSET(address, pmd, pte);
- NV_PTE_OFFSET(address, &pmd, pte);
+ NV_PMD_UNMAP(pmd);
if (!pte_present(pte))
goto failed;
----------------------------------
so that it will not use a copy of 'pmd' that was already
unmapped.
Question now - what about:
--------------------- nv-linux.h ----------------------
#if defined(pte_offset_atomic)
#define NV_PTE_OFFSET(addres, pmd, pte) \
{ \
pte_t *pte__ = pte_offset_atomic(pmd, address); \
pte = *pte__; \
pte_kunmap(pte__); \
}
#elif defined(pte_offset)
#define NV_PTE_OFFSET(addres, pmd, pte) \
pte = *pte_offset(pmd, address)
#else
#define NV_PTE_OFFSET(addres, pmd, pte) \
{ \
pte_t *pte__ = pte_offset_map(pmd, address); \
pte = *pte__; \
pte_unmap(pte__); \
}
#endif
-------------------------------------------------------
I cannot think that it is safe as well to use an copy
of an unmapped pte ?? Should this be fixed as well ?
Thanks,
-- Martin Schlemmer
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/