Re: Calculating kernel logical address ..

Daniel Phillips
2002-09-07T07:05:56Z

On Friday 06 September 2002 19:13, Imran Badr wrote:
> > adr = user_address;
> > pgd_offset(current->mm, adr);
> >
> > if (!pgd_none(*pgd)) {
> > pmd = pmd_offset(pgd, adr);
> > if (!pmd_none(*pmd)) {
> > ptep = pte_offset(pmd, adr);
> > pte = *ptep;
> > if(pte_present(pte)) {
> > kaddr = (unsigned long) page_address(pte_page(pte));
> > kaddr |= (adr & (PAGE_SIZE - 1));
> > }
> > }
> > }
> >
> > Will this code always give me correct kernel logical address?
>
> I was wondering if the code which I am using, will always give me addresses
> no matter whether HIGHMEM is defined in kernel configuration or not.

On second thought, this code does have problems with highmem. The page in
question was never kmapped, so no kernel address was assigned if the page
was a high memory page. Besides that, there are other other changes to
page address that imply it can't be used with a high memory page. So the
above code isn't generic.

> I
> belive that it should not be problem because I am mmap'ing kmalloc'ed memory
> which always returns mapped memory. But whats happeing in my lab is
> different. If I define HIGHMEM in kernel configuration and install 2GB of
> memory in my server then I see a crash in the kernel where I try to access
> kaddr calculated bu above code. Any idea?

Because of what I just said.

> The problem with your suggestion is that at the point where user gives me an
> address for DMA, I do not know what kmalloc_buffer and vma->vm_start values
> are. Also, if there are more than one processes accessing the driver, then
> how am I going to keep track of all mmap'ed memory.

--
Daniel