Received: by 2002:a25:c205:0:0:0:0:0 with SMTP id s5csp3910993ybf; Tue, 3 Mar 2020 15:37:17 -0800 (PST) X-Google-Smtp-Source: ADFU+vu9hNkVB8x9EFCroCFs41yZTYinhz8CHuY8tXAhMAkzbVaPJriO4pjioUWLjdxAp1gWWMUb X-Received: by 2002:a05:6830:2102:: with SMTP id i2mr244527otc.123.1583278637233; Tue, 03 Mar 2020 15:37:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1583278637; cv=none; d=google.com; s=arc-20160816; b=OdLGKJpqF5j+Z47xV2jBT14DMm9uV/ugXD5nXuc8t4JNqXOB+gUyZqdIBZjiH1YdnE 415CHkPi7vjmzFKztOQEqiT53PVMQ2N+wL4JyAKBOdWMGqAJKkCp8HFMlR5S/Sjb30Pc DRAQmn7DZgg/Cqo109VT5k2J4loaqRE/CHKEjXWn80tGATpDHWSPS3KrTDqWYl2M8lmC WCmYNBCsGTHdIOnohklyLO9nQ0PhQ7p4yt+QnzrDBoiUwnd+OtmNf3mYpm5yaVfxSlhQ iaHhZQABiO6UjJcsHl/TEduGHpfEmgHqbuksfGmpv59nenNXzDBdg+uHOrlRQY55fSPa 2YUQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:subject :smtp-origin-cluster:cc:to:smtp-origin-hostname:from :smtp-origin-hostprefix:dkim-signature; bh=v54f4hvtEpOMZZj7Wq4+S30Pdqx6OVy19TrOKQ69H14=; b=cjbsVFzy0zmNl6X6HpzVyWsRdEVrGM1BAP2Y9Ss+VoD7LvoXQApUocT52k6VWxizgY FrgFQNVOpyyYCwrHq7sS0bTh4b2ebAadf0TbWoWQLR0xS6IpEV4Ud/Ikx1AU44BelVQo 2slWK+Q5Wvvo287Z5vmGgeK1r7JRkZctE4FQJczGjDWWABag8Ebc18BW+NnGBGIc8oiz xFJeH7R7fwr2/QuKXpRtOkksbnD2ml9CTZw79R3IincXwOrbZdEPOjPzLOax9grI9WMp IKK/Aqp/HDSNfBhIYqXoeT0jO70SjKBxfYGVPPZVZzr3V1hxjfZPSsBI8kOq/Np2U+TI w+tQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@fb.com header.s=facebook header.b=ZLUPAVrV; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=fb.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t15si74045oth.176.2020.03.03.15.37.05; Tue, 03 Mar 2020 15:37:17 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@fb.com header.s=facebook header.b=ZLUPAVrV; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=fb.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728447AbgCCXgC (ORCPT + 99 others); Tue, 3 Mar 2020 18:36:02 -0500 Received: from mx0a-00082601.pphosted.com ([67.231.145.42]:28352 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727942AbgCCXgC (ORCPT ); Tue, 3 Mar 2020 18:36:02 -0500 Received: from pps.filterd (m0148461.ppops.net [127.0.0.1]) by mx0a-00082601.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 023NSvXY032631 for ; Tue, 3 Mar 2020 15:36:01 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fb.com; h=from : to : cc : subject : date : message-id : mime-version : content-type; s=facebook; bh=v54f4hvtEpOMZZj7Wq4+S30Pdqx6OVy19TrOKQ69H14=; b=ZLUPAVrVrvWOH07Sei5a8edivsFuryHz/mhmicFdCuYVrgEFGEAv1Bq9Y5CgWrF9qdIX 3dB4VtAD0jC46moXjUuSGBtdKnWX3hCKSrhp8L/uuf8SR2tiNb9z7Ou50fgWt1oex0CO zxOxx13KFNf01gbbyi1P3olovII8Feslg8Q= Received: from mail.thefacebook.com ([163.114.132.120]) by mx0a-00082601.pphosted.com with ESMTP id 2yhpfwkttv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Tue, 03 Mar 2020 15:36:01 -0800 Received: from intmgw001.06.prn3.facebook.com (2620:10d:c085:108::8) by mail.thefacebook.com (2620:10d:c085:21d::4) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1779.2; Tue, 3 Mar 2020 15:36:01 -0800 Received: by devvm2643.prn2.facebook.com (Postfix, from userid 111017) id 971CA2FA13176; Tue, 3 Mar 2020 15:35:51 -0800 (PST) Smtp-Origin-Hostprefix: devvm From: Roman Gushchin Smtp-Origin-Hostname: devvm2643.prn2.facebook.com To: Andrew Morton CC: Johannes Weiner , Michal Hocko , , , , Bharata B Rao , Roman Gushchin , Smtp-Origin-Cluster: prn2c23 Subject: [PATCH] mm: fork: fix kernel_stack memcg stats for various stack implementations Date: Tue, 3 Mar 2020 15:35:50 -0800 Message-ID: <20200303233550.251375-1-guro@fb.com> X-Mailer: git-send-email 2.17.1 X-FB-Internal: Safe MIME-Version: 1.0 Content-Type: text/plain X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138,18.0.572 definitions=2020-03-03_08:2020-03-03,2020-03-03 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 impostorscore=0 mlxscore=0 clxscore=1015 priorityscore=1501 lowpriorityscore=0 spamscore=0 adultscore=0 phishscore=0 bulkscore=0 mlxlogscore=999 malwarescore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2001150001 definitions=main-2003030154 X-FB-Internal: deliver Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Depending on CONFIG_VMAP_STACK and the THREAD_SIZE / PAGE_SIZE ratio the space for task stacks can be allocated using __vmalloc_node_range(), alloc_pages_node() and kmem_cache_alloc_node(). In the first and the second cases page->mem_cgroup pointer is set, but in the third it's not: memcg membership of a slab page should be determined using the memcg_from_slab_page() function, which looks at page->slab_cache->memcg_params.memcg . In this case, using mod_memcg_page_state() (as in account_kernel_stack()) is incorrect: page->mem_cgroup pointer is NULL even for pages charged to a non-root memory cgroup. It can lead to kernel_stack per-memcg counters permanently showing 0 on some architectures (depending on the configuration). In order to fix it, let's introduce a mod_memcg_obj_state() helper, which takes a pointer to a kernel object as a first argument, uses mem_cgroup_from_obj() to get a RCU-protected memcg pointer and calls mod_memcg_state(). It allows to handle all possible configurations (CONFIG_VMAP_STACK and various THREAD_SIZE/PAGE_SIZE values) without spilling any memcg/kmem specifics into fork.c . Note: this patch has been first posted as a part of the new slab controller patchset. This is a slightly updated version: the fixes tag has been added and the commit log was extended by the advice of Johannes Weiner. Because it's a fix that makes sense by itself, I'm re-posting it as a standalone patch. Fixes: 4d96ba353075 ("mm: memcg/slab: stop setting page->mem_cgroup pointer for slab pages") Signed-off-by: Roman Gushchin Cc: stable@vger.kernel.org --- include/linux/memcontrol.h | 5 +++++ kernel/fork.c | 4 ++-- mm/memcontrol.c | 11 +++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 3253d5de8243..817ea1d93e0e 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -695,6 +695,7 @@ static inline unsigned long lruvec_page_state_local(struct lruvec *lruvec, void __mod_lruvec_state(struct lruvec *lruvec, enum node_stat_item idx, int val); void __mod_lruvec_slab_state(void *p, enum node_stat_item idx, int val); +void mod_memcg_obj_state(void *p, int idx, int val); static inline void mod_lruvec_state(struct lruvec *lruvec, enum node_stat_item idx, int val) @@ -1129,6 +1130,10 @@ static inline void __mod_lruvec_slab_state(void *p, enum node_stat_item idx, __mod_node_page_state(page_pgdat(page), idx, val); } +static inline void mod_memcg_obj_state(void *p, int idx, int val) +{ +} + static inline unsigned long mem_cgroup_soft_limit_reclaim(pg_data_t *pgdat, int order, gfp_t gfp_mask, diff --git a/kernel/fork.c b/kernel/fork.c index a1f2f5205a61..bdc5004effa4 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -404,8 +404,8 @@ static void account_kernel_stack(struct task_struct *tsk, int account) mod_zone_page_state(page_zone(first_page), NR_KERNEL_STACK_KB, THREAD_SIZE / 1024 * account); - mod_memcg_page_state(first_page, MEMCG_KERNEL_STACK_KB, - account * (THREAD_SIZE / 1024)); + mod_memcg_obj_state(stack, MEMCG_KERNEL_STACK_KB, + account * (THREAD_SIZE / 1024)); } } diff --git a/mm/memcontrol.c b/mm/memcontrol.c index d1ae46838af1..6514df549433 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -776,6 +776,17 @@ void __mod_lruvec_slab_state(void *p, enum node_stat_item idx, int val) rcu_read_unlock(); } +void mod_memcg_obj_state(void *p, int idx, int val) +{ + struct mem_cgroup *memcg; + + rcu_read_lock(); + memcg = mem_cgroup_from_obj(p); + if (memcg) + mod_memcg_state(memcg, idx, val); + rcu_read_unlock(); +} + /** * __count_memcg_events - account VM events in a cgroup * @memcg: the memory cgroup -- 2.24.1