[lkml]   [2018]   [Sep]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
SubjectRe: [RFC PATCH v1 00/17] ban the use of _PAGE_XXX flags outside platform specific code
Christophe Leroy <> writes:

> Today flags like for instance _PAGE_RW or _PAGE_USER are used through
> common parts of code.
> Using those directly in common parts of code have proven to lead to
> mistakes or misbehaviour, because their use is not always as trivial
> as one could think.
> For instance, (flags & _PAGE_USER) == 0 isn't enough to tell
> that a page is a kernel page, because some targets are using
> _PAGE_PRIVILEDGED and not _PAGE_USER, so the test has to be
> This has to (bad) consequences:
> - All targets must define every bit, even the unsupported ones,
> leading to a lot of useless #define _PAGE_XXX 0
> - If someone forgets to take into account all possible _PAGE_XXX bits
> for the case, we can get unexpected behaviour on some targets.
> This becomes even more complex when we come to using _PAGE_RW.
> Testing (flags & _PAGE_RW) is not enough to test whether a page
> if writable or not, because:
> - Some targets have _PAGE_RO instead, which has to be unset to tell
> a page is writable
> - Some targets have _PAGE_R and _PAGE_W, in which case
> - Even knowing whether a page is readable is not always trivial because:
> - Some targets requires to check that _PAGE_R is set to ensure page
> is readable
> - Some targets requires to check that _PAGE_NA is not set
> - Some targets requires to check that _PAGE_RO or _PAGE_RW is set
> Etc ....
> In order to work around all those issues and minimise the risks of errors,
> this serie aims at removing all use of _PAGE_XXX flags from powerpc code
> and always use pte_xxx() and pte_mkxxx() accessors instead. Those accessors
> are then defined in target specific parts of the kernel code.

The series is really good. It also helps in code readability. Few things
i am not sure there is a way to reduce the overhead

- access = _PAGE_EXEC;
+ access = pte_val(pte_mkexec(__pte(0)));

Considering we have multiple big endian to little endian coversion there
for book3s 64.

Other thing is __ioremap_at where we do

+ pte_t pte = __pte(flags);

/* Make sure we have the base flags */
- if ((flags & _PAGE_PRESENT) == 0)
+ if (!pte_present(pte))

- err = map_kernel_page(v+i, p+i, flags);
+ err = map_kernel_page(v + i, p + i, pte_val(pte));

But otherwise for the series.

Reviewed-by: Aneesh Kumar K.V <>

 \ /
  Last update: 2018-09-06 12:00    [W:0.224 / U:0.036 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site