From: Nicholas Piggin <npiggin@gmail.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: "Anton Blanchard" <anton@ozlabs.org>,
linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-mm@kvack.org, linuxppc-dev@lists.ozlabs.org,
"Andy Lutomirski" <luto@kernel.org>,
"Randy\
Dunlap" <rdunlap@infradead.org>
Subject: Re: [PATCH v4 1/4] lazy tlb: introduce lazy mm refcount helper functions
Date: Tue, 08 Jun 2021 14:11:04 +1000 [thread overview]
Message-ID: <1623125298.bx63h3mopj.astroid@bobo.none> (raw)
In-Reply-To: <20210607184805.eddf8eb26b80e8af85d5777e@linux-foundation.org>
Excerpts from Andrew Morton's message of June 8, 2021 11:48 am:
> On Tue, 08 Jun 2021 11:39:56 +1000 Nicholas Piggin <npiggin@gmail.com> wrote:
>
>> > Looks like a functional change. What's happening here?
>>
>> That's kthread_use_mm being clever about the lazy tlb mm. If it happened
>> that the kthread had inherited a the lazy tlb mm that happens to be the
>> one we want to use here, then we already have a refcount to it via the
>> lazy tlb ref.
>>
>> So then it doesn't have to touch the refcount, but rather just converts
>> it from the lazy tlb ref to the returned reference. If the lazy tlb mm
>> doesn't get a reference, we can't do that.
>
> Please cover this in the changelog and perhaps a code comment.
>
Yeah fair enough, I'll even throw in a bug fix as well (your nose was right,
and it was too clever for me by half...)
Thanks,
Nick
--
Fix a refcounting bug in kthread_use_mm (the mm reference is increased
unconditionally now, but the lazy tlb refcount is still only dropped only
if mm != active_mm).
And an update for the changelog:
If a kernel thread's current lazy tlb mm happens to be the one it wants to
use, then kthread_use_mm() cleverly transfers the mm refcount from the
lazy tlb mm reference to the returned reference. If the lazy tlb mm
reference is no longer identical to a normal reference, this trick does not
work, so that is changed to be explicit about the two references.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
kernel/kthread.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/kernel/kthread.c b/kernel/kthread.c
index b70e28431a01..5e9797b2d06e 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -1314,6 +1314,11 @@ void kthread_use_mm(struct mm_struct *mm)
WARN_ON_ONCE(!(tsk->flags & PF_KTHREAD));
WARN_ON_ONCE(tsk->mm);
+ /*
+ * It's possible that tsk->active_mm == mm here, but we must
+ * still mmgrab(mm) and mmdrop_lazy_tlb(active_mm), because lazy
+ * mm may not have its own refcount (see mmgrab/drop_lazy_tlb()).
+ */
mmgrab(mm);
task_lock(tsk);
@@ -1338,12 +1343,9 @@ void kthread_use_mm(struct mm_struct *mm)
* memory barrier after storing to tsk->mm, before accessing
* user-space memory. A full memory barrier for membarrier
* {PRIVATE,GLOBAL}_EXPEDITED is implicitly provided by
- * mmdrop(), or explicitly with smp_mb().
+ * mmdrop_lazy_tlb().
*/
- if (active_mm != mm)
- mmdrop_lazy_tlb(active_mm);
- else
- smp_mb();
+ mmdrop_lazy_tlb(active_mm);
to_kthread(tsk)->oldfs = force_uaccess_begin();
}
--
2.23.0
WARNING: multiple messages have this Message-ID (diff)
From: Nicholas Piggin <npiggin@gmail.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-arch@vger.kernel.org,
"Randy\
Dunlap" <rdunlap@infradead.org>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
"Andy Lutomirski" <luto@kernel.org>,
linuxppc-dev@lists.ozlabs.org
Subject: Re: [PATCH v4 1/4] lazy tlb: introduce lazy mm refcount helper functions
Date: Tue, 08 Jun 2021 14:11:04 +1000 [thread overview]
Message-ID: <1623125298.bx63h3mopj.astroid@bobo.none> (raw)
In-Reply-To: <20210607184805.eddf8eb26b80e8af85d5777e@linux-foundation.org>
Excerpts from Andrew Morton's message of June 8, 2021 11:48 am:
> On Tue, 08 Jun 2021 11:39:56 +1000 Nicholas Piggin <npiggin@gmail.com> wrote:
>
>> > Looks like a functional change. What's happening here?
>>
>> That's kthread_use_mm being clever about the lazy tlb mm. If it happened
>> that the kthread had inherited a the lazy tlb mm that happens to be the
>> one we want to use here, then we already have a refcount to it via the
>> lazy tlb ref.
>>
>> So then it doesn't have to touch the refcount, but rather just converts
>> it from the lazy tlb ref to the returned reference. If the lazy tlb mm
>> doesn't get a reference, we can't do that.
>
> Please cover this in the changelog and perhaps a code comment.
>
Yeah fair enough, I'll even throw in a bug fix as well (your nose was right,
and it was too clever for me by half...)
Thanks,
Nick
--
Fix a refcounting bug in kthread_use_mm (the mm reference is increased
unconditionally now, but the lazy tlb refcount is still only dropped only
if mm != active_mm).
And an update for the changelog:
If a kernel thread's current lazy tlb mm happens to be the one it wants to
use, then kthread_use_mm() cleverly transfers the mm refcount from the
lazy tlb mm reference to the returned reference. If the lazy tlb mm
reference is no longer identical to a normal reference, this trick does not
work, so that is changed to be explicit about the two references.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
kernel/kthread.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/kernel/kthread.c b/kernel/kthread.c
index b70e28431a01..5e9797b2d06e 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -1314,6 +1314,11 @@ void kthread_use_mm(struct mm_struct *mm)
WARN_ON_ONCE(!(tsk->flags & PF_KTHREAD));
WARN_ON_ONCE(tsk->mm);
+ /*
+ * It's possible that tsk->active_mm == mm here, but we must
+ * still mmgrab(mm) and mmdrop_lazy_tlb(active_mm), because lazy
+ * mm may not have its own refcount (see mmgrab/drop_lazy_tlb()).
+ */
mmgrab(mm);
task_lock(tsk);
@@ -1338,12 +1343,9 @@ void kthread_use_mm(struct mm_struct *mm)
* memory barrier after storing to tsk->mm, before accessing
* user-space memory. A full memory barrier for membarrier
* {PRIVATE,GLOBAL}_EXPEDITED is implicitly provided by
- * mmdrop(), or explicitly with smp_mb().
+ * mmdrop_lazy_tlb().
*/
- if (active_mm != mm)
- mmdrop_lazy_tlb(active_mm);
- else
- smp_mb();
+ mmdrop_lazy_tlb(active_mm);
to_kthread(tsk)->oldfs = force_uaccess_begin();
}
--
2.23.0
next prev parent reply other threads:[~2021-06-08 4:11 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-05 1:42 [PATCH v4 0/4] shoot lazy tlbs Nicholas Piggin
2021-06-05 1:42 ` Nicholas Piggin
2021-06-05 1:42 ` [PATCH v4 1/4] lazy tlb: introduce lazy mm refcount helper functions Nicholas Piggin
2021-06-05 1:42 ` Nicholas Piggin
2021-06-07 23:49 ` Andrew Morton
2021-06-07 23:49 ` Andrew Morton
2021-06-08 1:39 ` Nicholas Piggin
2021-06-08 1:39 ` Nicholas Piggin
2021-06-08 1:48 ` Andrew Morton
2021-06-08 1:48 ` Andrew Morton
2021-06-08 4:11 ` Nicholas Piggin [this message]
2021-06-08 4:11 ` Nicholas Piggin
2021-06-05 1:42 ` [PATCH v4 2/4] lazy tlb: allow lazy tlb mm refcounting to be configurable Nicholas Piggin
2021-06-05 1:42 ` Nicholas Piggin
2021-06-08 3:11 ` Nicholas Piggin
2021-06-08 3:11 ` Nicholas Piggin
2021-06-08 16:20 ` Andy Lutomirski
2021-06-08 16:20 ` Andy Lutomirski
2021-06-14 0:45 ` Nicholas Piggin
2021-06-14 0:45 ` Nicholas Piggin
2021-06-14 3:52 ` Andy Lutomirski
2021-06-14 3:52 ` Andy Lutomirski
2021-06-14 4:14 ` Nicholas Piggin
2021-06-14 4:14 ` Nicholas Piggin
2021-06-14 4:47 ` Nicholas Piggin
2021-06-14 4:47 ` Nicholas Piggin
2021-06-14 5:21 ` Nicholas Piggin
2021-06-14 5:21 ` Nicholas Piggin
2021-06-14 16:20 ` Andy Lutomirski
2021-06-14 16:20 ` Andy Lutomirski
2021-06-15 0:55 ` Nicholas Piggin
2021-06-15 0:55 ` Nicholas Piggin
2021-06-16 0:14 ` Andy Lutomirski
2021-06-16 0:14 ` Andy Lutomirski
2021-06-16 1:02 ` Nicholas Piggin
2021-06-16 1:02 ` Nicholas Piggin
2021-06-17 0:32 ` Nicholas Piggin
2021-06-17 0:32 ` Nicholas Piggin
2021-06-05 1:42 ` [PATCH v4 3/4] lazy tlb: shoot lazies, a non-refcounting lazy tlb option Nicholas Piggin
2021-06-05 1:42 ` Nicholas Piggin
2021-06-08 3:15 ` Nicholas Piggin
2021-06-08 3:15 ` Nicholas Piggin
2021-06-05 1:42 ` [PATCH v4 4/4] powerpc/64s: enable MMU_LAZY_TLB_SHOOTDOWN Nicholas Piggin
2021-06-05 1:42 ` Nicholas Piggin
2021-06-07 23:52 ` Andrew Morton
2021-06-07 23:52 ` Andrew Morton
2021-06-08 2:13 ` Nicholas Piggin
2021-06-08 2:13 ` Nicholas Piggin
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=1623125298.bx63h3mopj.astroid@bobo.none \
--to=npiggin@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=anton@ozlabs.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=luto@kernel.org \
--cc=rdunlap@infradead.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.