[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <YXZU/3/YmRGFrOXK@infradead.org>
Date: Sun, 24 Oct 2021 23:55:59 -0700
From: Christoph Hellwig <hch@...radead.org>
To: wefu@...hat.com
Cc: anup.patel@....com, atish.patra@....com, palmerdabbelt@...gle.com,
guoren@...nel.org, christoph.muellner@...ll.eu,
philipp.tomsich@...ll.eu, hch@....de, liush@...winnertech.com,
lazyparser@...il.com, drew@...gleboard.org,
linux-riscv@...ts.infradead.org, linux-kernel@...r.kernel.org,
taiten.peng@...onical.com, aniket.ponkshe@...onical.com,
heinrich.schuchardt@...onical.com, gordan.markus@...onical.com,
guoren@...ux.alibaba.com, arnd@...db.de, wens@...e.org,
maxime@...no.tech, dlustig@...dia.com, gfavor@...tanamicro.com,
andrea.mondelli@...wei.com, behrensj@....edu, xinhaoqu@...wei.com,
huffman@...ence.com, mick@....forth.gr,
allen.baum@...erantotech.com, jscheid@...tanamicro.com,
rtrauben@...il.com
Subject: Re: [RESEND PATCH V3 2/2] riscv: add RISC-V Svpbmt extension supports
On Mon, Oct 25, 2021 at 12:06:07PM +0800, wefu@...hat.com 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?
Powered by blists - more mailing lists