From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> To: cgroups@vger.kernel.org, linux-mm@kvack.org Cc: "Andrew Morton" <akpm@linux-foundation.org>, "Johannes Weiner" <hannes@cmpxchg.org>, "Michal Hocko" <mhocko@kernel.org>, "Michal Koutný" <mkoutny@suse.com>, "Peter Zijlstra" <peterz@infradead.org>, "Thomas Gleixner" <tglx@linutronix.de>, "Vladimir Davydov" <vdavydov.dev@gmail.com>, "Waiman Long" <longman@redhat.com>, "Sebastian Andrzej Siewior" <bigeasy@linutronix.de>, "Michal Hocko" <mhocko@suse.com> Subject: [PATCH v5 6/6] mm/memcg: Disable migration instead of preemption in drain_all_stock(). Date: Sat, 26 Feb 2022 21:41:44 +0100 [thread overview] Message-ID: <20220226204144.1008339-7-bigeasy@linutronix.de> (raw) In-Reply-To: <20220226204144.1008339-1-bigeasy@linutronix.de> Before the for-each-CPU loop, preemption is disabled so that so that drain_local_stock() can be invoked directly instead of scheduling a worker. Ensuring that drain_local_stock() completed on the local CPU is not correctness problem. It _could_ be that the charging path will be forced to reclaim memory because cached charges are still waiting for their draining. Disabling preemption before invoking drain_local_stock() is problematic on PREEMPT_RT due to the sleeping locks involved. To ensure that no CPU migrations happens across for_each_online_cpu() it is enouhg to use migrate_disable() which disables migration and keeps context preemptible to a sleeping lock can be acquired. A race with CPU hotplug is not a problem because pcp data is not going away. In the worst case we just schedule draining of an empty stock. Use migrate_disable() instead of get_cpu() around the for_each_online_cpu() loop. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Acked-by: Michal Hocko <mhocko@suse.com> --- mm/memcontrol.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 6439b0089d392..89664d8094bc0 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -2300,7 +2300,8 @@ static void drain_all_stock(struct mem_cgroup *root_memcg) * as well as workers from this path always operate on the local * per-cpu data. CPU up doesn't touch memcg_stock at all. */ - curcpu = get_cpu(); + migrate_disable(); + curcpu = smp_processor_id(); for_each_online_cpu(cpu) { struct memcg_stock_pcp *stock = &per_cpu(memcg_stock, cpu); struct mem_cgroup *memcg; @@ -2323,7 +2324,7 @@ static void drain_all_stock(struct mem_cgroup *root_memcg) schedule_work_on(cpu, &stock->work); } } - put_cpu(); + migrate_enable(); mutex_unlock(&percpu_charge_mutex); } -- 2.35.1
WARNING: multiple messages have this Message-ID (diff)
From: Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org> To: cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org Cc: "Andrew Morton" <akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>, "Johannes Weiner" <hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org>, "Michal Hocko" <mhocko-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>, "Michal Koutný" <mkoutny-IBi9RG/b67k@public.gmane.org>, "Peter Zijlstra" <peterz-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>, "Thomas Gleixner" <tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>, "Vladimir Davydov" <vdavydov.dev-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>, "Waiman Long" <longman-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>, "Sebastian Andrzej Siewior" <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>, "Michal Hocko" <mhocko-IBi9RG/b67k@public.gmane.org> Subject: [PATCH v5 6/6] mm/memcg: Disable migration instead of preemption in drain_all_stock(). Date: Sat, 26 Feb 2022 21:41:44 +0100 [thread overview] Message-ID: <20220226204144.1008339-7-bigeasy@linutronix.de> (raw) In-Reply-To: <20220226204144.1008339-1-bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org> Before the for-each-CPU loop, preemption is disabled so that so that drain_local_stock() can be invoked directly instead of scheduling a worker. Ensuring that drain_local_stock() completed on the local CPU is not correctness problem. It _could_ be that the charging path will be forced to reclaim memory because cached charges are still waiting for their draining. Disabling preemption before invoking drain_local_stock() is problematic on PREEMPT_RT due to the sleeping locks involved. To ensure that no CPU migrations happens across for_each_online_cpu() it is enouhg to use migrate_disable() which disables migration and keeps context preemptible to a sleeping lock can be acquired. A race with CPU hotplug is not a problem because pcp data is not going away. In the worst case we just schedule draining of an empty stock. Use migrate_disable() instead of get_cpu() around the for_each_online_cpu() loop. Signed-off-by: Sebastian Andrzej Siewior <bigeasy-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org> Acked-by: Michal Hocko <mhocko-IBi9RG/b67k@public.gmane.org> --- mm/memcontrol.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 6439b0089d392..89664d8094bc0 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -2300,7 +2300,8 @@ static void drain_all_stock(struct mem_cgroup *root_memcg) * as well as workers from this path always operate on the local * per-cpu data. CPU up doesn't touch memcg_stock at all. */ - curcpu = get_cpu(); + migrate_disable(); + curcpu = smp_processor_id(); for_each_online_cpu(cpu) { struct memcg_stock_pcp *stock = &per_cpu(memcg_stock, cpu); struct mem_cgroup *memcg; @@ -2323,7 +2324,7 @@ static void drain_all_stock(struct mem_cgroup *root_memcg) schedule_work_on(cpu, &stock->work); } } - put_cpu(); + migrate_enable(); mutex_unlock(&percpu_charge_mutex); } -- 2.35.1
next prev parent reply other threads:[~2022-02-26 20:42 UTC|newest] Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-02-26 20:41 [PATCH v5 0/6] mm/memcg: Address PREEMPT_RT problems instead of disabling it Sebastian Andrzej Siewior 2022-02-26 20:41 ` Sebastian Andrzej Siewior 2022-02-26 20:41 ` [PATCH v5 1/6] mm/memcg: Revert ("mm/memcg: optimize user context object stock access") Sebastian Andrzej Siewior 2022-02-26 20:41 ` Sebastian Andrzej Siewior 2022-02-26 20:41 ` [PATCH v5 2/6] mm/memcg: Disable threshold event handlers on PREEMPT_RT Sebastian Andrzej Siewior 2022-02-26 20:41 ` Sebastian Andrzej Siewior 2023-03-01 18:23 ` Valentin Schneider 2023-03-01 18:23 ` Valentin Schneider 2023-03-02 7:45 ` Michal Hocko 2023-03-02 7:45 ` Michal Hocko 2023-03-02 10:18 ` Valentin Schneider 2023-03-02 10:18 ` Valentin Schneider 2023-03-02 11:24 ` Michal Hocko 2023-03-02 11:24 ` Michal Hocko 2023-03-02 12:30 ` Valentin Schneider 2023-03-02 12:30 ` Valentin Schneider 2023-03-02 12:56 ` Michal Hocko 2023-03-02 12:56 ` Michal Hocko 2023-03-02 14:34 ` Valentin Schneider 2023-03-02 14:34 ` Valentin Schneider 2023-03-02 19:52 ` Valentin Schneider 2023-03-02 19:52 ` Valentin Schneider 2022-02-26 20:41 ` [PATCH v5 3/6] mm/memcg: Protect per-CPU counter by disabling preemption on PREEMPT_RT where needed Sebastian Andrzej Siewior 2022-02-26 20:41 ` Sebastian Andrzej Siewior 2022-02-28 8:05 ` Michal Hocko 2022-02-28 8:05 ` Michal Hocko 2022-02-28 11:08 ` Sebastian Andrzej Siewior 2022-02-28 11:08 ` Sebastian Andrzej Siewior 2022-02-28 11:23 ` Michal Hocko 2022-02-28 11:23 ` Michal Hocko 2022-02-28 12:35 ` Sebastian Andrzej Siewior 2022-02-28 12:35 ` Sebastian Andrzej Siewior 2022-02-26 20:41 ` [PATCH v5 4/6] mm/memcg: Opencode the inner part of obj_cgroup_uncharge_pages() in drain_obj_stock() Sebastian Andrzej Siewior 2022-02-26 20:41 ` Sebastian Andrzej Siewior 2022-02-26 20:41 ` [PATCH v5 5/6] mm/memcg: Protect memcg_stock with a local_lock_t Sebastian Andrzej Siewior 2022-02-26 20:41 ` Sebastian Andrzej Siewior 2022-02-28 8:06 ` Michal Hocko 2022-02-28 8:06 ` Michal Hocko 2022-02-26 20:41 ` Sebastian Andrzej Siewior [this message] 2022-02-26 20:41 ` [PATCH v5 6/6] mm/memcg: Disable migration instead of preemption in drain_all_stock() Sebastian Andrzej Siewior -- strict thread matches above, loose matches on Subject: below -- 2022-02-21 18:25 [PATCH v4 0/6] mm/memcg: Address PREEMPT_RT problems instead of disabling it Sebastian Andrzej Siewior 2022-02-21 18:25 ` [PATCH v4 6/6] mm/memcg: Disable migration instead of preemption in drain_all_stock() Sebastian Andrzej Siewior 2022-02-22 9:56 ` Michal Hocko 2022-02-25 20:13 ` [PATCH v5 " Sebastian Andrzej Siewior 2022-02-25 20:13 ` Sebastian Andrzej Siewior
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=20220226204144.1008339-7-bigeasy@linutronix.de \ --to=bigeasy@linutronix.de \ --cc=akpm@linux-foundation.org \ --cc=cgroups@vger.kernel.org \ --cc=hannes@cmpxchg.org \ --cc=linux-mm@kvack.org \ --cc=longman@redhat.com \ --cc=mhocko@kernel.org \ --cc=mhocko@suse.com \ --cc=mkoutny@suse.com \ --cc=peterz@infradead.org \ --cc=tglx@linutronix.de \ --cc=vdavydov.dev@gmail.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: linkBe 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.