From: Coelacanthus <coelacanthushex@gmail.com>
To: Andrew Bresticker <abrestic@rivosinc.com>,
Palmer Dabbelt <palmer@dabbelt.com>
Cc: Paul Walmsley <paul.walmsley@sifive.com>,
Atish Patra <atishp@atishpatra.org>, dram <dramforever@live.com>,
Ruizhe Pan <c141028@gmail.com>,
linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2] riscv: Make mmap() with PROT_WRITE imply PROT_READ
Date: Fri, 9 Sep 2022 19:42:01 +0800 [thread overview]
Message-ID: <dfd6cfd9-5985-030f-4c77-f9037dcebe90@gmail.com> (raw)
In-Reply-To: <2f5059f6-b024-1ee8-b961-5aa0b4e4c116@gmail.com>
[-- Attachment #1.1.1.1: Type: text/plain, Size: 4073 bytes --]
On 2022/9/9 11:01, Celeste Liu wrote:
> On 2022/9/9 02:50, Andrew Bresticker wrote:
>> Commit 2139619bcad7 ("riscv: mmap with PROT_WRITE but no PROT_READ is
>> invalid") made mmap() return EINVAL if PROT_WRITE was set wihtout
>> PROT_READ with the justification that a write-only PTE is considered a
>> reserved PTE permission bit pattern in the privileged spec. This check
>> is unnecessary since RISC-V defines its protection_map such that PROT_WRITE
>> maps to the same PTE permissions as PROT_WRITE|PROT_READ, and it is
>> inconsistent with other architectures that don't support write-only PTEs,
>> creating a potential software portability issue. Just remove the check
>> altogether and let PROT_WRITE imply PROT_READ as is the case on other
>> architectures.
>>
>> Note that this also allows PROT_WRITE|PROT_EXEC mappings which were
>> disallowed prior to the aforementioned commit; PROT_READ is implied in
>> such mappings as well.
>>
>> Fixes: 2139619bcad7 ("riscv: mmap with PROT_WRITE but no PROT_READ is invalid")
>> Signed-off-by: Andrew Bresticker <abrestic@rivosinc.com>
>> ---
>> v1 -> v2: Update access_error() to account for write-implies-read
>> ---
>> arch/riscv/kernel/sys_riscv.c | 3 ---
>> arch/riscv/mm/fault.c | 3 ++-
>> 2 files changed, 2 insertions(+), 4 deletions(-)
>>
>> diff --git a/arch/riscv/kernel/sys_riscv.c b/arch/riscv/kernel/sys_riscv.c
>> index 571556bb9261..5d3f2fbeb33c 100644
>> --- a/arch/riscv/kernel/sys_riscv.c
>> +++ b/arch/riscv/kernel/sys_riscv.c
>> @@ -18,9 +18,6 @@ static long riscv_sys_mmap(unsigned long addr, unsigned long len,
>> if (unlikely(offset & (~PAGE_MASK >> page_shift_offset)))
>> return -EINVAL;
>>
>> - if (unlikely((prot & PROT_WRITE) && !(prot & PROT_READ)))
>> - return -EINVAL;
>> -
>> return ksys_mmap_pgoff(addr, len, prot, flags, fd,
>> offset >> (PAGE_SHIFT - page_shift_offset));
>> }
>> diff --git a/arch/riscv/mm/fault.c b/arch/riscv/mm/fault.c
>> index f2fbd1400b7c..d86f7cebd4a7 100644
>> --- a/arch/riscv/mm/fault.c
>> +++ b/arch/riscv/mm/fault.c
>> @@ -184,7 +184,8 @@ static inline bool access_error(unsigned long cause, struct vm_area_struct *vma)
>> }
>> break;
>> case EXC_LOAD_PAGE_FAULT:
>> - if (!(vma->vm_flags & VM_READ)) {
>> + /* Write implies read */
>> + if (!(vma->vm_flags & (VM_READ | VM_WRITE))) {
>> return true;
>> }
>> break;
>
> Hi, this did solve the problem and achieved consistency between
> architectures, but I have a question.
>
> Such a change specifies behavior for a state that should not exist,
> and if, in the future, RISC-V spec specifies a different behavior
> for that state (I mean, RVI itself has a history of not caring about
> downstream, like Zicsr and Zifencei), it will create inconsistencies,
> which is bad.
>
> If we reject the "write but not read" state, the user gets the most direct
> response: the state is not allowed so that they do not and cannot rely
> on the behavior of the state. This will bring better time consistency
> to the application if the spec specifies the behavior in the future.
> But it lost architecture consistency.
>
> How do you think this situation should be handled properly?
>
> Yours,
> Celeste Liu
Oops!
I found a mistake in my previous understanding: PTE permission!=vma permission.
So your modification makes sense, no matter how we handle the mapping of input
permissions to PTEs, as long as we don't use the reserved permission combinations,
the behavior is reasonable and also independent of the architecture's definition
of PTEs.
But I think this mapping relationship should be well documented. If we have
such a mapping behavior in all architectures, then we should change this line in
the mmap documentation
On some hardware architectures (e.g., i386), PROT_WRITE implies PROT_READ.
to apply all architectures. According to my read about code, all the vm_get_page_prot
will do the protection_map mapping to have this feature.
Yours,
Celeste Liu
[-- Attachment #1.1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 8045 bytes --]
[-- Attachment #1.2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
[-- Attachment #2: Type: text/plain, Size: 161 bytes --]
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
next prev parent reply other threads:[~2022-09-09 11:42 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-08 17:01 [PATCH] riscv: Allow PROT_WRITE-only mmap() Andrew Bresticker
2022-09-08 17:21 ` SS JieJi
2022-09-08 17:28 ` SS JieJi
2022-09-08 18:14 ` Andrew Bresticker
2022-09-08 18:50 ` [PATCH v2] riscv: Make mmap() with PROT_WRITE imply PROT_READ Andrew Bresticker
2022-09-08 18:56 ` SS JieJi
2022-09-08 19:18 ` Andrew Bresticker
2022-09-09 3:01 ` Celeste Liu
2022-09-09 11:42 ` Coelacanthus [this message]
2022-09-09 15:16 ` Andrew Bresticker
2022-09-09 15:45 ` Celeste Liu
2022-09-09 18:52 ` Atish Patra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=dfd6cfd9-5985-030f-4c77-f9037dcebe90@gmail.com \
--to=coelacanthushex@gmail.com \
--cc=abrestic@rivosinc.com \
--cc=atishp@atishpatra.org \
--cc=c141028@gmail.com \
--cc=dramforever@live.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox