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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 99BD5C433EF for ; Tue, 4 Jan 2022 00:11:11 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 68DFB6B0082; Mon, 3 Jan 2022 19:10:57 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 28B7F6B007E; Mon, 3 Jan 2022 19:10:57 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D91536B0087; Mon, 3 Jan 2022 19:10:56 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0227.hostedemail.com [216.40.44.227]) by kanga.kvack.org (Postfix) with ESMTP id BA24C6B0082 for ; Mon, 3 Jan 2022 19:10:56 -0500 (EST) Received: from smtpin27.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 72BBA8C58F for ; Tue, 4 Jan 2022 00:10:56 +0000 (UTC) X-FDA: 78990674112.27.62EBF42 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by imf03.hostedemail.com (Postfix) with ESMTP id EBC2520009 for ; Tue, 4 Jan 2022 00:10:55 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 4A6101F3A2; Tue, 4 Jan 2022 00:10:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1641255054; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/ynMu9gUcfn+cFnntE/ZYyjBN3wddh509NNHt3XwZiU=; b=h8ZplfmX3aDLAXpTvihmcdWJE/nsqoKfgW1G8uh6/DOQX0RvxWhRy1jCM2xd3lQRTfGyuc ojc4beTpKB4KWQkVOQgVz5Gec/r2KP67KufxklKqwfT+bJU/uiVHmflxB+lhhgvJjhGMYi v+vmZ6UUkrlFwh/5Y97elyB80UfuqN0= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1641255054; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/ynMu9gUcfn+cFnntE/ZYyjBN3wddh509NNHt3XwZiU=; b=rzU2pFfEnRtQa1eYBaAD0QwsQCbn4hcC7cMTdWX5wg1sVKraFqDnz009hS/JsmdCqtm365 5LDaUAv7CmNsblBw== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 21231139D1; Tue, 4 Jan 2022 00:10:54 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 8JtxB46Q02FEQwAAMHmgww (envelope-from ); Tue, 04 Jan 2022 00:10:54 +0000 From: Vlastimil Babka To: Matthew Wilcox , Christoph Lameter , David Rientjes , Joonsoo Kim , Pekka Enberg Cc: linux-mm@kvack.org, Andrew Morton , Johannes Weiner , Roman Gushchin , Hyeonggon Yoo <42.hyeyoo@gmail.com>, patches@lists.linux.dev, Vlastimil Babka Subject: [PATCH v4 08/32] mm: Use struct slab in kmem_obj_info() Date: Tue, 4 Jan 2022 01:10:22 +0100 Message-Id: <20220104001046.12263-9-vbabka@suse.cz> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220104001046.12263-1-vbabka@suse.cz> References: <20220104001046.12263-1-vbabka@suse.cz> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=5689; i=vbabka@suse.cz; h=from:subject; bh=e+5OAymN3yXP3FQ+RIB0Qh2Z6HFn5ysk930ArWaUv5E=; b=owEBbQGS/pANAwAIAeAhynPxiakQAcsmYgBh05BwzFMhNvllRncvLKjg/33YChu5TiX4HqhKU/X6 VvGz5wOJATMEAAEIAB0WIQSNS5MBqTXjGL5IXszgIcpz8YmpEAUCYdOQcAAKCRDgIcpz8YmpEMNJB/ 9JxSN7GRruaBAn9ppDnq16CUvB2c05JNpYJlfTlUS+19vEzO6aUxaQ0BkmRlDetwAL+0uRJO7HabPu LKxTjHm+6H6VLdg5qyDnbKL84o9A02/a3fB9BooiD3NOgGtkIHTVE5KFqGshLxqfojB8aay5/zbUJR 9uvOuAgTPnwr2nGF1jPC8kju4sQ1rG6Sta8gNfy1SCPgRs9Zpkol7WUe1ChixR5c7sawhyFC0VOlNg RfPjnCFV1K7KA42MP31Y7wbWU3wPEjKq5EMDae1r/pgdGzy6nt4dEt/ihim0KLvIi4Wo/YU8YpDA4M KHrtBXfwWC1CRuwp0amPgyrWuBtZox X-Developer-Key: i=vbabka@suse.cz; a=openpgp; fpr=A940D434992C2E8E99103D50224FA7E7CC82A664 Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=suse.cz header.s=susede2_rsa header.b=h8ZplfmX; dkim=pass header.d=suse.cz header.s=susede2_ed25519 header.b=rzU2pFfE; spf=pass (imf03.hostedemail.com: domain of vbabka@suse.cz designates 195.135.220.29 as permitted sender) smtp.mailfrom=vbabka@suse.cz; dmarc=none X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: EBC2520009 X-Stat-Signature: wfowgxuam4su8rf8b36bzpeyab1pjj4x X-HE-Tag: 1641255055-339476 Content-Transfer-Encoding: quoted-printable 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: From: "Matthew Wilcox (Oracle)" All three implementations of slab support kmem_obj_info() which reports details of an object allocated from the slab allocator. By using the slab type instead of the page type, we make it obvious that this can only be called for slabs. [ vbabka@suse.cz: also convert the related kmem_valid_obj() to folios ] Signed-off-by: Matthew Wilcox (Oracle) Signed-off-by: Vlastimil Babka Reviewed-by: Roman Gushchin --- mm/slab.c | 12 ++++++------ mm/slab.h | 4 ++-- mm/slab_common.c | 14 +++++++------- mm/slob.c | 4 ++-- mm/slub.c | 13 +++++++------ 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/mm/slab.c b/mm/slab.c index 7f147805d0ab..44bc1fcd1393 100644 --- a/mm/slab.c +++ b/mm/slab.c @@ -3646,21 +3646,21 @@ EXPORT_SYMBOL(__kmalloc_node_track_caller); #endif /* CONFIG_NUMA */ =20 #ifdef CONFIG_PRINTK -void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page = *page) +void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct slab = *slab) { struct kmem_cache *cachep; unsigned int objnr; void *objp; =20 kpp->kp_ptr =3D object; - kpp->kp_page =3D page; - cachep =3D page->slab_cache; + kpp->kp_slab =3D slab; + cachep =3D slab->slab_cache; kpp->kp_slab_cache =3D cachep; objp =3D object - obj_offset(cachep); kpp->kp_data_offset =3D obj_offset(cachep); - page =3D virt_to_head_page(objp); - objnr =3D obj_to_index(cachep, page, objp); - objp =3D index_to_obj(cachep, page, objnr); + slab =3D virt_to_slab(objp); + objnr =3D obj_to_index(cachep, slab_page(slab), objp); + objp =3D index_to_obj(cachep, slab_page(slab), objnr); kpp->kp_objp =3D objp; if (DEBUG && cachep->flags & SLAB_STORE_USER) kpp->kp_ret =3D *dbg_userword(cachep, objp); diff --git a/mm/slab.h b/mm/slab.h index 1408ada9ff72..9ae9f6c3d1cb 100644 --- a/mm/slab.h +++ b/mm/slab.h @@ -801,7 +801,7 @@ static inline void debugfs_slab_release(struct kmem_c= ache *s) { } #define KS_ADDRS_COUNT 16 struct kmem_obj_info { void *kp_ptr; - struct page *kp_page; + struct slab *kp_slab; void *kp_objp; unsigned long kp_data_offset; struct kmem_cache *kp_slab_cache; @@ -809,7 +809,7 @@ struct kmem_obj_info { void *kp_stack[KS_ADDRS_COUNT]; void *kp_free_stack[KS_ADDRS_COUNT]; }; -void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page = *page); +void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct slab = *slab); #endif =20 #endif /* MM_SLAB_H */ diff --git a/mm/slab_common.c b/mm/slab_common.c index e5d080a93009..dc15566141d4 100644 --- a/mm/slab_common.c +++ b/mm/slab_common.c @@ -550,13 +550,13 @@ bool slab_is_available(void) */ bool kmem_valid_obj(void *object) { - struct page *page; + struct folio *folio; =20 /* Some arches consider ZERO_SIZE_PTR to be a valid address. */ if (object < (void *)PAGE_SIZE || !virt_addr_valid(object)) return false; - page =3D virt_to_head_page(object); - return PageSlab(page); + folio =3D virt_to_folio(object); + return folio_test_slab(folio); } EXPORT_SYMBOL_GPL(kmem_valid_obj); =20 @@ -579,18 +579,18 @@ void kmem_dump_obj(void *object) { char *cp =3D IS_ENABLED(CONFIG_MMU) ? "" : "/vmalloc"; int i; - struct page *page; + struct slab *slab; unsigned long ptroffset; struct kmem_obj_info kp =3D { }; =20 if (WARN_ON_ONCE(!virt_addr_valid(object))) return; - page =3D virt_to_head_page(object); - if (WARN_ON_ONCE(!PageSlab(page))) { + slab =3D virt_to_slab(object); + if (WARN_ON_ONCE(!slab)) { pr_cont(" non-slab memory.\n"); return; } - kmem_obj_info(&kp, object, page); + kmem_obj_info(&kp, object, slab); if (kp.kp_slab_cache) pr_cont(" slab%s %s", cp, kp.kp_slab_cache->name); else diff --git a/mm/slob.c b/mm/slob.c index c8a4290012a6..d2d15e7f191c 100644 --- a/mm/slob.c +++ b/mm/slob.c @@ -462,10 +462,10 @@ static void slob_free(void *block, int size) } =20 #ifdef CONFIG_PRINTK -void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page = *page) +void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct slab = *slab) { kpp->kp_ptr =3D object; - kpp->kp_page =3D page; + kpp->kp_slab =3D slab; } #endif =20 diff --git a/mm/slub.c b/mm/slub.c index 269e10d341a8..8e9667815f81 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -4322,31 +4322,32 @@ int __kmem_cache_shutdown(struct kmem_cache *s) } =20 #ifdef CONFIG_PRINTK -void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page = *page) +void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct slab = *slab) { void *base; int __maybe_unused i; unsigned int objnr; void *objp; void *objp0; - struct kmem_cache *s =3D page->slab_cache; + struct kmem_cache *s =3D slab->slab_cache; struct track __maybe_unused *trackp; =20 kpp->kp_ptr =3D object; - kpp->kp_page =3D page; + kpp->kp_slab =3D slab; kpp->kp_slab_cache =3D s; - base =3D page_address(page); + base =3D slab_address(slab); objp0 =3D kasan_reset_tag(object); #ifdef CONFIG_SLUB_DEBUG objp =3D restore_red_left(s, objp0); #else objp =3D objp0; #endif - objnr =3D obj_to_index(s, page, objp); + objnr =3D obj_to_index(s, slab_page(slab), objp); kpp->kp_data_offset =3D (unsigned long)((char *)objp0 - (char *)objp); objp =3D base + s->size * objnr; kpp->kp_objp =3D objp; - if (WARN_ON_ONCE(objp < base || objp >=3D base + page->objects * s->siz= e || (objp - base) % s->size) || + if (WARN_ON_ONCE(objp < base || objp >=3D base + slab->objects * s->siz= e + || (objp - base) % s->size) || !(s->flags & SLAB_STORE_USER)) return; #ifdef CONFIG_SLUB_DEBUG --=20 2.34.1