Messages in this thread | | | Date | Mon, 29 Apr 2002 10:50:05 -0700 | From | "Martin J. Bligh" <> | Subject | Re: Bug: Discontigmem virt_to_page() [Alpha,ARM,Mips64?] |
| |
>> page = virt_to_page(__va(phys_addr)); >> >> ... >> >> __va() is defined, on Alpha, to be: >> >> # define __va(x) ((void *)((unsigned long) (x) + PAGE_OFFSET)) >> >> ... >> >> Now, what happens if 'kaddr' is below PAGE_OFFSET (because the user has >> opened /dev/mem and mapped some random bit of physical memory space)?
But we generated kaddr by using __va, as above? If the user mapped /dev/mem and created a second possible answer for a P->V mapping, that seems irrelevant, as long as __va always returns the "primary" mapping into kernel virtual address space.
I'd agree we're lacking some error checking here (maybe virt_to_page should be an inline that checks that kaddr really is a kernel virtual address), but I can't see a real practical problem in the scenario you describe. As other people seem to be able to, maybe I'm missing something ;-)
I'm not sure if your arch is a 32-bit or 64-bit arch, but I see more of a problem in this code if we do "page = virt_to_page(__va(phys_addr));" on a physaddr that's in HIGHMEM on a 32 bit arch, in which we get garbage from the wrapping, and Daniel's "page = phys_to_page(phys_addr);" makes infintely more sense.
Martin.
- 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/
| |