From: David Hildenbrand <david@redhat.com>
To: hev <r@hev.cc>, Peter Xu <peterx@redhat.com>
Cc: Anatoly Pugachev <matorola@gmail.com>,
Thorsten Leemhuis <regressions@leemhuis.info>,
Sparc kernel list <sparclinux@vger.kernel.org>,
linux-mm <linux-mm@kvack.org>
Subject: Re: Test case for "mm/thp: carry over dirty bit when thp splits on pmd"
Date: Mon, 21 Nov 2022 20:57:43 +0100 [thread overview]
Message-ID: <79cf9e73-440c-5ff0-856f-3df6c13061ef@redhat.com> (raw)
In-Reply-To: <CAHirt9i8iLCP3_ppEL5kO2XLVAg0sno0GdzdKyzk7DSMTJF0tA@mail.gmail.com>
On 19.11.22 15:06, hev wrote:
> Hi, Peter,
>
> On Fri, Nov 18, 2022 at 2:29 AM Peter Xu <peterx@redhat.com> wrote:
>>
>> On Thu, Nov 17, 2022 at 10:29:57AM +0800, hev wrote:
>>> Hi Peter,
>>
>> Hi, Hev,
>>
>>>
>>> On Thu, Nov 17, 2022 at 12:25 AM Peter Xu <peterx@redhat.com> wrote:
>>>>
>>>> On Wed, Nov 16, 2022 at 01:45:15PM +0300, Anatoly Pugachev wrote:
>>>>> On Wed, Nov 16, 2022 at 11:49 AM hev <r@hev.cc> wrote:
>>>>>>
>>>>>> Hello Peter,
>>>>
>>>> Hi, Hev,
>>>>
>>>> Thanks for letting me know.
>>>>
>>>>>>
>>>>>> I see a random crash issue on the LoongArch system, that is caused by
>>>>>> commit 0ccf7f1 ("mm/thp: carry over dirty bit when thp splits on
>>>>>> pmd").
>>>>>>
>>>>>> Now, the thing is already resolved. The root cause is arch's mkdirty
>>>>>> is set hardware writable bit in unconditional. That breaks
>>>>>> write-protect and then breaks COW.
>>>>
>>>> Could you help explain how that happened?
>>>>
>>>> I'm taking example of loongarch here:
>>>>
>>>> static inline pte_t pte_mkdirty(pte_t pte)
>>>> {
>>>> pte_val(pte) |= (_PAGE_DIRTY | _PAGE_MODIFIED);
>>>> return pte;
>>>> }
>>>>
>>>> #define _PAGE_MODIFIED (_ULCAST_(1) << _PAGE_MODIFIED_SHIFT)
>>>> #define _PAGE_MODIFIED_SHIFT 9
>>>
>>> _PAGE_MODIFIED is a software dirty bit
>>>
>>>> #define _PAGE_DIRTY (_ULCAST_(1) << _PAGE_DIRTY_SHIFT)
>>>> #define _PAGE_DIRTY_SHIFT 1
>>>
>>> _PAGE_DIRTY is a hardware writable bit (bad naming), meaning that mmu
>>> allows write memory without any exception raised.
>>
>> (I just missed this email before I reply to the other one, I should have
>> read this one first..)
>>
>> I see. This surprises me a bit, as I can't quickly tell how it'll always
>> work with the generic mm code.
>>
>> Say, is there a quick answer on why _PAGE_DIRTY is set here rather than
>> pte_mkwrite()? Because AFAIU that's where the mm wants to grant write
>> permission to a page table entry as the API, no?
>>
>>>
>>>>
>>>> I don't see when write bit is set, which is bit 8 instead:
>>>>
>>>> #define _PAGE_WRITE (_ULCAST_(1) << _PAGE_WRITE_SHIFT)
>>>> #define _PAGE_WRITE_SHIFT 8
>>>
>>> _PAGE_WRITE is a software writable bit (not hardware).
>>>
>>> As David said, In __split_huge_pmd_locked, the VMA does not include VM_WRITE,
>>>
>>> entry = maybe_mkwrite(entry, vma);
>>>
>>> so the pte does not include software writable bit (_PAGE_WRITE).
>>
>> Are you sure? In your test case you mapped with RW, IIUC it means even
>> after the fork() VM_WRITE is set on both sides?
>
> Sorry, I was wrong.
>
> In this case, both VMAs are writable, the pte's writable bit is
> cleared by pte_wrprotect. So if pte_mkdirty sets hardware writable bit
> unconditionally, then there will be no way to catch writes to
> implement COW.
>
> I will try to explain how it works about pte write, dirty and
> write-protect on LoongArch in the LoongArch mailing-list.
Just to ask again,
is code like
maybe_mkwrite(pte_mkdirty(entry), vma);
Like we have in copy_present_page(), wp_page_reuse(), wp_page_copy() ...
broken on LoongArch of the VMA lacks VM_WRITE?
That would need *real* fixing, no hacks around that in other code areas.
--
Thanks,
David / dhildenb
next prev parent reply other threads:[~2022-11-21 19:59 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CAHirt9gr7oL87co3y1hCs3Ux4utzFP5oj6GFOFMZuJR2Vv8+rA@mail.gmail.com>
2022-11-16 10:45 ` Test case for "mm/thp: carry over dirty bit when thp splits on pmd" Anatoly Pugachev
2022-11-16 11:28 ` David Hildenbrand
2022-11-16 16:25 ` Peter Xu
2022-11-17 2:29 ` hev
2022-11-17 18:28 ` Peter Xu
2022-11-19 14:06 ` hev
2022-11-21 19:57 ` David Hildenbrand [this message]
2022-11-25 11:15 ` hev
2022-11-25 11:17 ` David Hildenbrand
2022-11-25 11:35 ` hev
2022-11-21 18:55 ` Peter Xu
2022-11-25 11:38 ` hev
2022-11-25 18:42 ` Peter Xu
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=79cf9e73-440c-5ff0-856f-3df6c13061ef@redhat.com \
--to=david@redhat.com \
--cc=linux-mm@kvack.org \
--cc=matorola@gmail.com \
--cc=peterx@redhat.com \
--cc=r@hev.cc \
--cc=regressions@leemhuis.info \
--cc=sparclinux@vger.kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.