Re: [RESEND PATCH V3 2/2] riscv: add RISC-V Svpbmt extension supports

From: Christoph Hellwig
Date: Mon Oct 25 2021 - 02:56:22 EST


On Mon, Oct 25, 2021 at 12:06:07PM +0800, wefu@xxxxxxxxxx wrote:
> static inline pmd_t *pud_pgtable(pud_t pud)
> {
> - return (pmd_t *)pfn_to_virt(pud_val(pud) >> _PAGE_PFN_SHIFT);
> + return (pmd_t *)pfn_to_virt((pud_val(pud) & _PAGE_CHG_MASK)
> + >> _PAGE_PFN_SHIFT);
> }
>
> static inline struct page *pud_page(pud_t pud)
> {
> - return pfn_to_page(pud_val(pud) >> _PAGE_PFN_SHIFT);
> + return pfn_to_page((pud_val(pud) & _PAGE_CHG_MASK)
> + >> _PAGE_PFN_SHIFT);

> static inline unsigned long _pmd_pfn(pmd_t pmd)
> {
> - return pmd_val(pmd) >> _PAGE_PFN_SHIFT;
> + return (pmd_val(pmd) & _PAGE_CHG_MASK) >> _PAGE_PFN_SHIFT;
> }

The "(pud_val(pud) & _PAGE_CHG_MASK) >> _PAGE_PFN_SHIFT" expression begs
for readable and well-documented helper.

> +#define _SVPBMT_PMA ((unsigned long)0x0 << 61)
> +#define _SVPBMT_NC ((unsigned long)0x1 << 61)
> +#define _SVPBMT_IO ((unsigned long)0x2 << 61)

0UL << 61
1UL << 61
...

> +#define _SVPBMT_MASK (_SVPBMT_PMA | _SVPBMT_NC | _SVPBMT_IO)
> +
> +extern struct __riscv_svpbmt_struct {
> + unsigned long mask;
> + unsigned long mt_pma;
> + unsigned long mt_nc;
> + unsigned long mt_io;
> +} __riscv_svpbmt;
> +
> +#define _PAGE_MT_MASK __riscv_svpbmt.mask
> +#define _PAGE_MT_PMA __riscv_svpbmt.mt_pma
> +#define _PAGE_MT_NC __riscv_svpbmt.mt_nc
> +#define _PAGE_MT_IO __riscv_svpbmt.mt_io

Using a struct over individual variables seems a little odd here.

Also why not use the standard names for these _PAGE bits used by
most other architectures?

> - return (unsigned long)pfn_to_virt(pmd_val(pmd) >> _PAGE_PFN_SHIFT);
> + return (unsigned long)pfn_to_virt((pmd_val(pmd) & _PAGE_CHG_MASK) >> _PAGE_PFN_SHIFT);

Overly long line, could use a helper. Btw, what is the point in having
this _PAGE_PFN_SHIFT macro to start with?