Re: [PATCH 08/16] sparc64: add the missing pgd_page definition
- Date: Sat, 1 Jun 2019 09:28:54 -0700
- From: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
- Subject: Re: [PATCH 08/16] sparc64: add the missing pgd_page definition
Both sparc64 and sh had this pattern, but now that I look at it more
closely, I think your version is wrong, or at least nonoptimal.
On Sat, Jun 1, 2019 at 12:50 AM Christoph Hellwig <hch@xxxxxx> wrote:
> +#define pgd_page(pgd) virt_to_page(__va(pgd_val(pgd)))
Going through the virtual address is potentially very inefficient, and
might in some cases just be wrong (ie it's definitely wrong for
HIGHMEM style setups).
It would likely be much better to go through the physical address and
use "pfn_to_page()". I realize that we don't have a "pgd to physical",
but neither do we really have a "pgd to virtual", and your
"__va(pgd_val(x))" thing is not at allguaranteed to work. You're
basically assuming that "pgd_val(x)" is the physical address, which is
likely not entirely incorrect, but it should be checked by the
The pgd value could easily have high bits with meaning, which would
also potentially screw up the __va(x) model.
So I thgink this would be better done with
#define pgd_page(pgd) pfn_to_page(pgd_pfn(pgd))
where that "pgd_pfn()" would need to be a new (but likely very
trivial) function. That's what we do for pte_pfn().
IOW, it would likely end up something like
#define pgd_to_pfn(pgd) (pgd_val(x) >> PFN_PGD_SHIFT)