From patchwork Thu Feb 6 11:45:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Catalin Marinas X-Patchwork-Id: 13962938 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 7688DC02196 for ; Thu, 6 Feb 2025 11:45:45 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C018E6B0085; Thu, 6 Feb 2025 06:45:44 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id BB1616B0088; Thu, 6 Feb 2025 06:45:44 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A9FE86B0089; Thu, 6 Feb 2025 06:45:44 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 8CF8C6B0085 for ; Thu, 6 Feb 2025 06:45:44 -0500 (EST) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 2C6664B305 for ; Thu, 6 Feb 2025 11:45:44 +0000 (UTC) X-FDA: 83089340208.27.94D42F4 Received: from nyc.source.kernel.org (nyc.source.kernel.org [147.75.193.91]) by imf25.hostedemail.com (Postfix) with ESMTP id 9CC42A0039 for ; Thu, 6 Feb 2025 11:45:42 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=none; spf=pass (imf25.hostedemail.com: domain of cmarinas@kernel.org designates 147.75.193.91 as permitted sender) smtp.mailfrom=cmarinas@kernel.org; dmarc=fail reason="SPF not aligned (relaxed), No valid DKIM" header.from=arm.com (policy=none) ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1738842342; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=59wfkg/Xc9U6cW1cAJEjmyti7JBgA40SpKHWdxE0tN4=; b=YH/2xFytMDd5LHf0cXD2YKSGPwRGLamVvDAFeyhBYR6tUAMm+gYI4WJxIP2C/nZ/0miwz8 AePfDnQeQQkxyn0+SYCub4GULFpcyqQZ8W94jjy1lWjLql3tL2JDRyVnhgalnGgjuIedgx JUA3cKfGbktwOFo/15vLdHoVxCyopyk= ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=none; spf=pass (imf25.hostedemail.com: domain of cmarinas@kernel.org designates 147.75.193.91 as permitted sender) smtp.mailfrom=cmarinas@kernel.org; dmarc=fail reason="SPF not aligned (relaxed), No valid DKIM" header.from=arm.com (policy=none) ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1738842342; a=rsa-sha256; cv=none; b=fueqrUUSuKjUly5SKTUyXbaGD7ysSJFEBd8mxGneswQgr+EVN7TKkMxzne8CmsfmQqY9gP h7Rk0pkkylevM0BkqWiELzttX6GDI4G1YYrsW7PrelsZdlBlyHEgmsoezODf7sjBaOrzk0 8m0vA619zeYVh4vVluc6smXJ97VBQPw= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by nyc.source.kernel.org (Postfix) with ESMTP id F405AA40573; Thu, 6 Feb 2025 11:43:55 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CC287C4CEE2; Thu, 6 Feb 2025 11:45:40 +0000 (UTC) From: Catalin Marinas To: linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, Andrew Morton Subject: [PATCH 1/2] mm: kmemleak: Add support for dumping physical and __percpu object info Date: Thu, 6 Feb 2025 11:45:36 +0000 Message-Id: <20250206114537.2597764-2-catalin.marinas@arm.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250206114537.2597764-1-catalin.marinas@arm.com> References: <20250206114537.2597764-1-catalin.marinas@arm.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: 9CC42A0039 X-Rspam-User: X-Rspamd-Server: rspam11 X-Stat-Signature: h99oq5piifnc1xyoiwpu9jdokf1uxod3 X-HE-Tag: 1738842342-942764 X-HE-Meta: U2FsdGVkX1+g0FckS2yDdyaCdJWLDAFV+62GeKKf/mMDgm3yHUYMn55jq4BuGCaW62uKIS1quvtWrg6ZF6913hSv6kLsPUmBMK6MjmZKpAjpkgYfGvmqTWuL8DGuEM0uJFcgQOKdR7Xmb1g+C4ZHvdSFBbPxbw4FwX2xZVlrIB94fU0XzLESCySS5/IjJN/dxP9SXEsGW0LjQ8LlCo3nTbbsCVLwGau0gWUJO4/f4d1CwonlqN4XzacUyC7nWeYaYf84YgSkJbbYpKfOPz59HImyCp21RPFaOhCWMeqnW22LK2a6wc7Qkq0VFiD6YwZ+vGshrjDFQdGPNJ1E7AsoluGUuon3W4Jnx7ECZI2B3yeIea+RbkeoO/v3Cg+mPHOnkJv0+P4kulIQOz9eidShPyhrDenZLI45K61WEbfnwHW3hTnaick50S+pmseNT97cgAfSe7FL9EGkX0P+M845qp6GfWRkYuJ6urTv6F6QLkvjkxrA89xNMnxlXd1NwUKgg+oAg7TMQf5px6t12rYipAQi0cSCljgXvuaEX9/yi3PjSOjFjht7reYYjfcRknIt2Na+2fbwB1kwyHv435jV7RqTzPg2Q7iA+iuFbBJBOEQS3+8lX5wEWZ9xbBTf8BsSfE5MmeHcID2ThaLDT2xoJ49e+WSIBMJhx2GveS49RM62XZwu9NbokDor42NfV5rBTN+4XIPg/xiknvq1Z9cCJjGnOZfEfGqj/K6623zR9NB04buXzAv2f1OLlazIex5pHTGPcu0DkYcQtv8jDbg0KlL3CVoPxAx55c2m/87Sp07TxLp5cAS8vwHktfkepjFExpMA7V2vHzaFiSY71aCF5x+YLEcZYVyP3ha9k2B+6LsWovJpIotfUQq72FyZuM6ETJHQfXRClKNBPXY1jOO9SlXxxFDbTP4+K9H8RNlrbUFXejv2Tala81lHlBrOcFuQ6whpuq2kngO0amPCu2w HZJDf/xT 0wFtQnd95681PeFA5hBRO8m1p+7DHb5r9bNsthvjboMoYPlI36+fRERX4oMQeDdLsMcs0uwAVXgmIJNT/9AC6qZxnTQi7WUXYTo2P35LCCHVqD8jm9GBjb3dtFQXzqMeu5ktUhnvCibWdgpdzUL51jHqaTBUpWVr2IPY8utZmWj351Kz5IDXDu6yJXx87VMJP5AFBjyImoKDbHW0AtebN/c2iAhfTyuS+bMuF1D21Ltrjv9OmlSaLZF0tryNWEcjVsRVWtsr2Mvyc+YCQKnjCC0DkFZfVdOOwYrqYopzxrIx+27z5jUiypFVCVN2ymYWqj1PuroQ0h7Cej8YSZ73GarBPOJh2JwaCzbklNRRaTzpdV31q5xrQ9wdIDEBjcKziPWF5hB+4as2oQyUT8dbex1kF4XibR/awrCUfkfqM3i+5Ckj7Pk4B9401RR9ZgVLRVtjaMwlVFZw+NrDeCRlA+d99lA== 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: List-Subscribe: List-Unsubscribe: Currently, echo dump=... > /sys/kernel/debug/kmemleak only looks up the main virtual address object tree. However, for debugging, it's useful to dump information about physical address and __percpu objects. Search all three object trees for the dump= command and also print the type of the object if not virtual: "(phys)" or "(percpu)". In addition, allow search by alias (pointer within the object). Signed-off-by: Catalin Marinas Cc: Andrew Morton --- mm/kmemleak.c | 54 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/mm/kmemleak.c b/mm/kmemleak.c index c6ed68604136..c12cef3eeb32 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -352,6 +352,15 @@ static bool unreferenced_object(struct kmemleak_object *object) jiffies_last_scan); } +static const char *__object_type_str(struct kmemleak_object *object) +{ + if (object->flags & OBJECT_PHYS) + return " (phys)"; + if (object->flags & OBJECT_PERCPU) + return " (percpu)"; + return ""; +} + /* * Printing of the unreferenced objects information to the seq file. The * print_unreferenced function must be called with the object->lock held. @@ -364,8 +373,9 @@ static void print_unreferenced(struct seq_file *seq, unsigned int nr_entries; nr_entries = stack_depot_fetch(object->trace_handle, &entries); - warn_or_seq_printf(seq, "unreferenced object 0x%08lx (size %zu):\n", - object->pointer, object->size); + warn_or_seq_printf(seq, "unreferenced object%s 0x%08lx (size %zu):\n", + __object_type_str(object), + object->pointer, object->size); warn_or_seq_printf(seq, " comm \"%s\", pid %d, jiffies %lu\n", object->comm, object->pid, object->jiffies); hex_dump_object(seq, object); @@ -384,10 +394,10 @@ static void print_unreferenced(struct seq_file *seq, */ static void dump_object_info(struct kmemleak_object *object) { - pr_notice("Object 0x%08lx (size %zu):\n", - object->pointer, object->size); + pr_notice("Object%s 0x%08lx (size %zu):\n", + __object_type_str(object), object->pointer, object->size); pr_notice(" comm \"%s\", pid %d, jiffies %lu\n", - object->comm, object->pid, object->jiffies); + object->comm, object->pid, object->jiffies); pr_notice(" min_count = %d\n", object->min_count); pr_notice(" count = %d\n", object->count); pr_notice(" flags = 0x%x\n", object->flags); @@ -1998,25 +2008,41 @@ static int kmemleak_open(struct inode *inode, struct file *file) return seq_open(file, &kmemleak_seq_ops); } -static int dump_str_object_info(const char *str) +static bool __dump_str_object_info(unsigned long addr, unsigned int objflags) { unsigned long flags; struct kmemleak_object *object; - unsigned long addr; - if (kstrtoul(str, 0, &addr)) - return -EINVAL; - object = find_and_get_object(addr, 0); - if (!object) { - pr_info("Unknown object at 0x%08lx\n", addr); - return -EINVAL; - } + object = __find_and_get_object(addr, 1, objflags); + if (!object) + return false; raw_spin_lock_irqsave(&object->lock, flags); dump_object_info(object); raw_spin_unlock_irqrestore(&object->lock, flags); put_object(object); + + return true; +} + +static int dump_str_object_info(const char *str) +{ + unsigned long addr; + bool found = false; + + if (kstrtoul(str, 0, &addr)) + return -EINVAL; + + found |= __dump_str_object_info(addr, 0); + found |= __dump_str_object_info(addr, OBJECT_PHYS); + found |= __dump_str_object_info(addr, OBJECT_PERCPU); + + if (!found) { + pr_info("Unknown object at 0x%08lx\n", addr); + return -EINVAL; + } + return 0; }