From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E51E0C33CB1 for ; Thu, 16 Jan 2020 16:19:16 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 8B26E206D5 for ; Thu, 16 Jan 2020 16:19:16 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=fb.com header.i=@fb.com header.b="CN50phY7"; dkim=pass (1024-bit key) header.d=fb.onmicrosoft.com header.i=@fb.onmicrosoft.com header.b="adqFBSTw" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8B26E206D5 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=fb.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 2B2728E007E; Thu, 16 Jan 2020 11:19:16 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 23C788E003F; Thu, 16 Jan 2020 11:19:16 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0DDA18E007E; Thu, 16 Jan 2020 11:19:16 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0250.hostedemail.com [216.40.44.250]) by kanga.kvack.org (Postfix) with ESMTP id E58D68E003F for ; Thu, 16 Jan 2020 11:19:15 -0500 (EST) Received: from smtpin05.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with SMTP id 9BD6A180AD817 for ; Thu, 16 Jan 2020 16:19:15 +0000 (UTC) X-FDA: 76384007070.05.cent99_50b815aef9400 X-HE-Tag: cent99_50b815aef9400 X-Filterd-Recvd-Size: 14279 Received: from mx0b-00082601.pphosted.com (mx0b-00082601.pphosted.com [67.231.153.30]) by imf31.hostedemail.com (Postfix) with ESMTP for ; Thu, 16 Jan 2020 16:19:14 +0000 (UTC) Received: from pps.filterd (m0109331.ppops.net [127.0.0.1]) by mx0a-00082601.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 00GG9Q7D025413; Thu, 16 Jan 2020 08:19:12 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fb.com; h=from : to : cc : subject : date : message-id : references : in-reply-to : content-type : content-id : content-transfer-encoding : mime-version; s=facebook; bh=DJVgZle/1cNdMP+D/fdNrnOBqko22uad31sMDEyWPFY=; b=CN50phY76GhwJlXC5jaZmda3HCGIS9vZfzUWiPAUHl+BDwrVjxW+gpVPs5ROnDvG0yER x+SfiFA1YrcP4SHioCqf+382FR4qDoPIdnlG7FeNGMxI4GhnLsiPgDdY8scuefCT5mDm DWXDgxBgKutAe/XfUhPlX310uF9BJsDlfqo= Received: from maileast.thefacebook.com ([163.114.130.16]) by mx0a-00082601.pphosted.com with ESMTP id 2xjg38akbk-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT); Thu, 16 Jan 2020 08:19:11 -0800 Received: from NAM10-MW2-obe.outbound.protection.outlook.com (100.104.31.183) by o365-in.thefacebook.com (100.104.36.101) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Thu, 16 Jan 2020 08:19:11 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=f2QSJGAw2q/I4exd1OM4aojCcT0aaL81KsZfX4XihXNlSUvkshYT4xXjGesHIUU4y98lhNKKmvD+tu8UtFdYDZcKQ/yP9owvA1+z+2gXUocDHP9x8P0U8bstakAnoJALOpbTzJeFA8Jsy8Txc6F9GEuEow+ykfQlHR+HkR19mn4mrF7r7U52DuNZm2YcZ36MJgSQtNUsdM6HsNQ+1e6RtAm96VN2xDuh+I4sXnrWdIjMe8tiaetqHSLJOMCMOaAQXEBcfEhxkcSlC8RsbsGKdbif6ptI6jSQ8GYGcNWhhCq/Wke9MfhUrQ1VcoE2PPSBDdJi1eHZDjyPWElWB56aqA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=DJVgZle/1cNdMP+D/fdNrnOBqko22uad31sMDEyWPFY=; b=hoKDphx8Bp6mdkdR7WFI4d+WRqRPPVDvUFgshIx16CpJ+cRZk+pOwqSAXf24OFXXMyf5MTk7uurEWrgHaNwfzrl6taH/zyMJCVMvYPfWEiPoEuBF2EkHuQhOQp65sv7b96I7lugOd+68rWAvmDBQ7G236h2QGdFrzvMGKewqhrZ74d8DdoLnQuXvN9uRlcjf5U/KZ5vbIMilBeiS+rYzMOjC/g4jJXz7vs8/BIN8uGtQIK+CUFT9huwnMI6q98BzGm2nRwSrN7Mvk+M3QrPK7YwnaNmvST9FfCx7da+AKCNiGPpcboQd45PThJT9Hg4rIUH4sSNHhDtLLAnokYEOGg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=fb.com; dmarc=pass action=none header.from=fb.com; dkim=pass header.d=fb.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fb.onmicrosoft.com; s=selector2-fb-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=DJVgZle/1cNdMP+D/fdNrnOBqko22uad31sMDEyWPFY=; b=adqFBSTwI7dJAm16/j8dxC74PkbToUEeF6tQMCSX/D1f43Qazlrxp91/12KStwfqD0juLsrOwqSHAn2ycCEuXgyRMLs++zQvbZsx1fq30iKidDSmRuGZneLHNIiSAK6IWYiulkx3BtkujcaVEj1NXhvmsdm5rDef9Y1uBVWtMMQ= Received: from BYAPR15MB2631.namprd15.prod.outlook.com (20.179.155.147) by BYAPR15MB2727.namprd15.prod.outlook.com (20.179.158.83) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2623.8; Thu, 16 Jan 2020 16:19:09 +0000 Received: from BYAPR15MB2631.namprd15.prod.outlook.com ([fe80::ccb6:a331:77d8:d308]) by BYAPR15MB2631.namprd15.prod.outlook.com ([fe80::ccb6:a331:77d8:d308%7]) with mapi id 15.20.2623.018; Thu, 16 Jan 2020 16:19:09 +0000 Received: from tower.DHCP.thefacebook.com (2620:10d:c090:200::2:8d3) by MWHPR01CA0025.prod.exchangelabs.com (2603:10b6:300:101::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2644.18 via Frontend Transport; Thu, 16 Jan 2020 16:19:08 +0000 From: Roman Gushchin To: Michal Hocko , Yafang Shao CC: "dchinner@redhat.com" , "akpm@linux-foundation.org" , "linux-mm@kvack.org" Subject: Re: [PATCH] mm: verify page type before getting memcg from it Thread-Topic: [PATCH] mm: verify page type before getting memcg from it Thread-Index: AQHVzHcCB4TUBqN5IkWxcnDBbjY9Z6ftcIwAgAAH3AA= Date: Thu, 16 Jan 2020 16:19:09 +0000 Message-ID: <20200116161904.GA14228@tower.DHCP.thefacebook.com> References: <1579183811-1898-1-git-send-email-laoar.shao@gmail.com> <20200116155056.GA19428@dhcp22.suse.cz> In-Reply-To: <20200116155056.GA19428@dhcp22.suse.cz> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: MWHPR01CA0025.prod.exchangelabs.com (2603:10b6:300:101::11) To BYAPR15MB2631.namprd15.prod.outlook.com (2603:10b6:a03:150::19) x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [2620:10d:c090:200::2:8d3] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 99f0dd6e-0eb5-4f79-59eb-08d79a9fd0fa x-ms-traffictypediagnostic: BYAPR15MB2727: x-microsoft-antispam-prvs: x-fb-source: Internal x-ms-oob-tlc-oobclassifiers: OLM:4714; x-forefront-prvs: 02843AA9E0 x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(346002)(376002)(366004)(39860400002)(396003)(136003)(189003)(199004)(53546011)(110136005)(478600001)(966005)(1076003)(316002)(4326008)(6506007)(186003)(5660300002)(86362001)(54906003)(66556008)(7696005)(16526019)(2906002)(33656002)(55016002)(52116002)(81166006)(71200400001)(9686003)(81156014)(8936002)(15650500001)(8676002)(66446008)(66476007)(66946007)(64756008);DIR:OUT;SFP:1102;SCL:1;SRVR:BYAPR15MB2727;H:BYAPR15MB2631.namprd15.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;MX:1;A:1; received-spf: None (protection.outlook.com: fb.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: Baz2u8R7UpQ3V2vrLR8lYljYwfAFB2sIzsy2K/QD0Z2vgadGs7chuMWS5RPlkXSRg5V4bfBYiDjwPV3vkMcwIq4C0B8ZNaNO6Dcz8Hr+pLchUsGcT/sbhDjoMicFzOWtUv7R8jgVphvVRqS49GhMElbEH3YmoAOGxIN3XTONZn86KQIGlf29pBTOYBU24MruJLHg2BWFepvOWIn3P4lwEyz4BdjP8LeruDOWNKZiENxKvfcpJUxsiYT1GF4L3grCg1HD7HZSmEu3v0VQ2q6kr5U9CGCZEIVAVmDz5RqPdOdz4nPdw98+7ZXDrmKk8u7nSQaMF14G996IzYLzKmVxZRJY75hkVwEd2b7qi+yCtDyNToLWO/leJgUDgID97ji5MbFzK5Y/WZBltwEG76+XEqami5uNNtHHX+cLy9dpLlxmSYsvoWz3wUvJjqavf4AwuGm37R/t9Mf6gByENpl/lwIfMSYiAwsGS2umY2vzUnk= x-ms-exchange-transport-forked: True Content-Type: text/plain; charset="us-ascii" Content-ID: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-MS-Exchange-CrossTenant-Network-Message-Id: 99f0dd6e-0eb5-4f79-59eb-08d79a9fd0fa X-MS-Exchange-CrossTenant-originalarrivaltime: 16 Jan 2020 16:19:09.4409 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 8ae927fe-1255-47a7-a2af-5f3a069daaa2 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: vpzROwnGImjiYlZggWf4LCmNcWrT3Pe6rcPHp01eE7hOq57selgoltkwCwMvJvnH X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR15MB2727 X-OriginatorOrg: fb.com X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138,18.0.572 definitions=2020-01-16_05:2020-01-16,2020-01-16 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 suspectscore=0 clxscore=1015 lowpriorityscore=0 spamscore=0 adultscore=0 malwarescore=0 priorityscore=1501 phishscore=0 impostorscore=0 mlxlogscore=999 bulkscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-1910280000 definitions=main-2001160133 X-FB-Internal: deliver X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Thu, Jan 16, 2020 at 04:50:56PM +0100, Michal Hocko wrote: > [Cc Roman] Thanks! >=20 > On Thu 16-01-20 09:10:11, Yafang Shao wrote: > > Per disccusion with Dave[1], we always assume we only ever put objects = from > > memcg associated slab pages in the list_lru. In list_lru_from_kmem() it > > calls memcg_from_slab_page() which makes no attempt to verify the page = is > > actually a slab page. But currently the binder coder (in > > drivers/android/binder_alloc.c) stores normal pages in the list_lru, ra= ther > > than slab objects. The only reason the binder doesn't catch issue is th= at > > the list_lru is not configured to be memcg aware. > > In order to make it more stable, we should verify the page type before > > getting memcg from it. In this patch, a new helper is introduced and th= e > > old helper is modified. Now we have two helpers as bellow, > >=20 > > struct mem_cgroup *__memcg_from_slab_page(struct page *page); > > struct mem_cgroup *memcg_from_slab_page(struct page *page); > >=20 > > The first helper is used when we are sure the page is a slab page and a= lso > > a head page, while the second helper is used when we are not sure the p= age > > type. > >=20 > > [1]. > > https://lore.kernel.org/linux-mm/20200106213103.GJ23195@dread.disaster.= area/ > >=20 > > Suggested-by: Dave Chinner > > Signed-off-by: Yafang Shao Hello Yafang! I actually have something similar in my patch queue, but I'm adding a helper which takes a kernel pointer rather than a page: struct mem_cgroup *mem_cgroup_from_obj(void *p); Will it work for you? If so, I can send it separately. (I'm working on switching to per-object accounting of slab object, so that slab pages will be shared between multiple cgroups. So it will require a change like this). Thanks! -- >From fc2b1ec53285edcb0017275019d60bd577bf64a9 Mon Sep 17 00:00:00 2001 From: Roman Gushchin Date: Thu, 2 Jan 2020 15:22:19 -0800 Subject: [PATCH] mm: memcg/slab: introduce mem_cgroup_from_obj() Sometimes we need to get a memcg pointer from a charged kernel object. The right way to do it depends on whether it's a proper slab object or it's backed by raw pages (e.g. it's a vmalloc alloction). In the first case the kmem_cache->memcg_params.memcg indirection should be used, however in the the second case it's just page->mem_cgroup. To simplify this task and hide these implementation details let's introduce the mem_cgroup_from_obj() helper, which takes a pointer to any kernel object and returns a valid memcg pointer or NULL. The caller is still responsible to ensure that the returned memcg isn't going away underneath: take the rcu read lock, cgroup mutex etc. mem_cgroup_from_kmem() defined in mm/list_lru.c is now obsolete and can be removed. Signed-off-by: Roman Gushchin --- include/linux/memcontrol.h | 7 +++++++ mm/list_lru.c | 12 +----------- mm/memcontrol.c | 32 +++++++++++++++++++++++++++++--- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index c372bed6be80..0f6f8e18029e 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -420,6 +420,8 @@ struct lruvec *mem_cgroup_page_lruvec(struct page *, st= ruct pglist_data *); =20 struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p); =20 +struct mem_cgroup *mem_cgroup_from_obj(void *p); + struct mem_cgroup *get_mem_cgroup_from_mm(struct mm_struct *mm); =20 struct mem_cgroup *get_mem_cgroup_from_page(struct page *page); @@ -912,6 +914,11 @@ static inline bool mm_match_cgroup(struct mm_struct *m= m, return true; } =20 +static inline struct mem_cgroup *mem_cgroup_from_obj(void *p) +{ + return NULL; +} + static inline struct mem_cgroup *get_mem_cgroup_from_mm(struct mm_struct *= mm) { return NULL; diff --git a/mm/list_lru.c b/mm/list_lru.c index 0f1f6b06b7f3..8de5e3784ee4 100644 --- a/mm/list_lru.c +++ b/mm/list_lru.c @@ -57,16 +57,6 @@ list_lru_from_memcg_idx(struct list_lru_node *nlru, int = idx) return &nlru->lru; } =20 -static __always_inline struct mem_cgroup *mem_cgroup_from_kmem(void *ptr) -{ - struct page *page; - - if (!memcg_kmem_enabled()) - return NULL; - page =3D virt_to_head_page(ptr); - return memcg_from_slab_page(page); -} - static inline struct list_lru_one * list_lru_from_kmem(struct list_lru_node *nlru, void *ptr, struct mem_cgroup **memcg_ptr) @@ -77,7 +67,7 @@ list_lru_from_kmem(struct list_lru_node *nlru, void *ptr, if (!nlru->memcg_lrus) goto out; =20 - memcg =3D mem_cgroup_from_kmem(ptr); + memcg =3D mem_cgroup_from_obj(ptr); if (!memcg) goto out; =20 diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 6e1ee8577ecf..99d6fe9d7026 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -757,13 +757,12 @@ void __mod_lruvec_state(struct lruvec *lruvec, enum n= ode_stat_item idx, =20 void __mod_lruvec_slab_state(void *p, enum node_stat_item idx, int val) { - struct page *page =3D virt_to_head_page(p); - pg_data_t *pgdat =3D page_pgdat(page); + pg_data_t *pgdat =3D page_pgdat(virt_to_page(p)); struct mem_cgroup *memcg; struct lruvec *lruvec; =20 rcu_read_lock(); - memcg =3D memcg_from_slab_page(page); + memcg =3D mem_cgroup_from_obj(p); =20 /* Untracked pages have no memcg, no lruvec. Update only the node */ if (!memcg || memcg =3D=3D root_mem_cgroup) { @@ -2636,6 +2635,33 @@ static void commit_charge(struct page *page, struct = mem_cgroup *memcg, unlock_page_lru(page, isolated); } =20 +/* + * Returns a pointer to the memory cgroup to which the kernel object is ch= arged. + * + * The caller must ensure the memcg lifetime, e.g. by owning a charged obj= ect, + * taking rcu_read_lock() or cgroup_mutex. + */ +struct mem_cgroup *mem_cgroup_from_obj(void *p) +{ + struct page *page; + + if (mem_cgroup_disabled()) + return NULL; + + page =3D virt_to_head_page(p); + + /* + * Slab pages don't have page->mem_cgroup set because corresponding + * kmem caches can be reparented during the lifetime. That's why + * cache->memcg_params.memcg pointer should be used instead. + */ + if (PageSlab(page)) + return memcg_from_slab_page(page); + + /* All other pages use page->mem_cgroup */ + return page->mem_cgroup; +} + #ifdef CONFIG_MEMCG_KMEM static int memcg_alloc_cache_id(void) { --=20 2.21.1