From patchwork Sat Jun 11 03:55:49 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: patrick wang X-Patchwork-Id: 12878332 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 8A3ECC433EF for ; Sat, 11 Jun 2022 03:57:54 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 242728D0108; Fri, 10 Jun 2022 23:57:54 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 1F2178D00F7; Fri, 10 Jun 2022 23:57:54 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 06D238D0108; Fri, 10 Jun 2022 23:57:54 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id EBEC28D00F7 for ; Fri, 10 Jun 2022 23:57:53 -0400 (EDT) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id CB8372183D for ; Sat, 11 Jun 2022 03:57:53 +0000 (UTC) X-FDA: 79564596426.10.551FBA3 Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) by imf09.hostedemail.com (Postfix) with ESMTP id 7032B14005A for ; Sat, 11 Jun 2022 03:57:53 +0000 (UTC) Received: by mail-pf1-f181.google.com with SMTP id c196so1101694pfb.1 for ; Fri, 10 Jun 2022 20:57:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=aAKZps72PMMzoHcO+HkFjM55OhZNaxgE/SU4USJkil8=; b=PnUoFhqnRmYUsadvL00HsRESRoOzWZo2LXZ+DmTIxZVF3xYrhCvipnNBPkxycY0//h 0nBmRrT/VATjJDXBTrMntOD8PMRrWaHPhPoVl49LhmXhFyv7O8eAorMM9wiE3rDL1m98 i+Denny9OqXJcSM19Gkal2Yk/UfoLH9o4ZUrA5Rfh/JoCpdEWyL15yUOxPDhJ3vDEGpo IaHPwUVLqmCU249QeD/qGZ61iEiV/Iah/4kl3me5hyMyXSZjfSuiUOEJX3J5EYSaevge d+OLtj813UGsRvXKQcOEAPZ4ZCb2lJLCkUW81Ixxvx1VsRx1xcj2bZXI0D0m5f9VDvG8 oKIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=aAKZps72PMMzoHcO+HkFjM55OhZNaxgE/SU4USJkil8=; b=4fqpPxCQ6VRon+h4ouqwhAX+ZefKYwcmhWeU6FX0xJSXnqIoUW1bZiCbPJhaVlZ099 KlLbkZ8a91BwOFYYyiJxqVEIFUeaTtpv0S6mWu+Ydr1uqRWExxKJdYmDShmoyA1PRxe7 CKrXDk7CAtjM7mbWRWjrML5Ix4R2bRAfqIJW1aJDFu43u8EnfdfQ/oroT30O1TZvy2UE k5ZeqpWOx330o1jL3A5Mq4Ays4YULGMS6BBodE3dVAjY0GwW9nBQf2B/P74+wLPq4GyH pBZ60BVoKvLxpJGLlS0d7RtqbWL21OHfcgbH5oCrSbhOzu6Vbd9U68KxuntH0g1gpOwe uEOA== X-Gm-Message-State: AOAM532RMzkuzUHfm9ZNhlljb/CbBJEx8y7xbnSbABSEYrWnLGzbpADQ aUp4e3DEJhPGlPqP1UBLiw4= X-Google-Smtp-Source: ABdhPJy4p+QtcgzeQNeAiLnmtk2zrkY6GToee55wx7X2yzN+844cprFJBj11wSVsyS1OaWyapN7+PA== X-Received: by 2002:a05:6a00:168a:b0:4f7:e161:83cd with SMTP id k10-20020a056a00168a00b004f7e16183cdmr49433188pfc.56.1654919872496; Fri, 10 Jun 2022 20:57:52 -0700 (PDT) Received: from localhost ([101.86.206.203]) by smtp.gmail.com with ESMTPSA id 2-20020a620602000000b0051844f3f637sm383080pfg.40.2022.06.10.20.57.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jun 2022 20:57:51 -0700 (PDT) From: Patrick Wang To: catalin.marinas@arm.com, akpm@linux-foundation.org Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, yee.lee@mediatek.com, patrick.wang.shcn@gmail.com Subject: [PATCH v4 2/4] mm: kmemleak: add OBJECT_PHYS flag for objects allocated with physical address Date: Sat, 11 Jun 2022 11:55:49 +0800 Message-Id: <20220611035551.1823303-3-patrick.wang.shcn@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220611035551.1823303-1-patrick.wang.shcn@gmail.com> References: <20220611035551.1823303-1-patrick.wang.shcn@gmail.com> MIME-Version: 1.0 ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1654919873; a=rsa-sha256; cv=none; b=ifB5swGRU7xp0+s9KTLpHAHR4UCrYGuAP7PxHAQANhpY/IYFxuDdrPTFzdpRemV6JolUdz ag3I1ukNnut70gnyxdi97kLlQE8gtSxpWErjdn6lxi2xGIeP0/BnrWn8bMwo+822bY3z+a YVr84xnHPHW0aPVHbMxXhwhjcumySp8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1654919873; 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:dkim-signature; bh=aAKZps72PMMzoHcO+HkFjM55OhZNaxgE/SU4USJkil8=; b=SxA5qf/5fJ4gnqSt2l5qBWtZna6og4P9Qyl+zbD+6mt8GjYJp8wx29mAv/wiUQxZa+F5i9 VF2H60GQQZ6peIcBIM2uUUasFxwtzZ7Ok/6D3zcGHWNe8Ka++ZfjyhtCDN2coVcMzvl+3L e5CxHp/RaYijx+zPVhFN0uZRXWfJx9U= ARC-Authentication-Results: i=1; imf09.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=PnUoFhqn; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf09.hostedemail.com: domain of patrick.wang.shcn@gmail.com designates 209.85.210.181 as permitted sender) smtp.mailfrom=patrick.wang.shcn@gmail.com Authentication-Results: imf09.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=PnUoFhqn; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf09.hostedemail.com: domain of patrick.wang.shcn@gmail.com designates 209.85.210.181 as permitted sender) smtp.mailfrom=patrick.wang.shcn@gmail.com X-Stat-Signature: sojsacj9tiiacho697x6g4tkczhbodkj X-Rspamd-Queue-Id: 7032B14005A X-Rspamd-Server: rspam12 X-Rspam-User: X-HE-Tag: 1654919873-587009 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: Add OBJECT_PHYS flag for object. This flag is used to identify the objects allocated with physical address. The create_object_phys() function is added as well to set that flag and is used by kmemleak_alloc_phys(). Suggested-by: Catalin Marinas Signed-off-by: Patrick Wang Reviewed-by: Catalin Marinas --- mm/kmemleak.c | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/mm/kmemleak.c b/mm/kmemleak.c index 156eafafa182..d82d8db0e8df 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -172,6 +172,8 @@ struct kmemleak_object { #define OBJECT_NO_SCAN (1 << 2) /* flag set to fully scan the object when scan_area allocation failed */ #define OBJECT_FULL_SCAN (1 << 3) +/* flag set for object allocated with physical address */ +#define OBJECT_PHYS (1 << 4) #define HEX_PREFIX " " /* number of bytes to print per line; must be 16 or 32 */ @@ -574,8 +576,9 @@ static int __save_stack_trace(unsigned long *trace) * Create the metadata (struct kmemleak_object) corresponding to an allocated * memory block and add it to the object_list and object_tree_root. */ -static struct kmemleak_object *create_object(unsigned long ptr, size_t size, - int min_count, gfp_t gfp) +static struct kmemleak_object *__create_object(unsigned long ptr, size_t size, + int min_count, gfp_t gfp, + bool is_phys) { unsigned long flags; struct kmemleak_object *object, *parent; @@ -595,7 +598,7 @@ static struct kmemleak_object *create_object(unsigned long ptr, size_t size, INIT_HLIST_HEAD(&object->area_list); raw_spin_lock_init(&object->lock); atomic_set(&object->use_count, 1); - object->flags = OBJECT_ALLOCATED; + object->flags = OBJECT_ALLOCATED | (is_phys ? OBJECT_PHYS : 0); object->pointer = ptr; object->size = kfence_ksize((void *)ptr) ?: size; object->excess_ref = 0; @@ -662,6 +665,20 @@ static struct kmemleak_object *create_object(unsigned long ptr, size_t size, return object; } +/* Create kmemleak object which allocated with virtual address. */ +static struct kmemleak_object *create_object(unsigned long ptr, size_t size, + int min_count, gfp_t gfp) +{ + return __create_object(ptr, size, min_count, gfp, false); +} + +/* Create kmemleak object which allocated with physical address. */ +static struct kmemleak_object *create_object_phys(unsigned long ptr, size_t size, + int min_count, gfp_t gfp) +{ + return __create_object(ptr, size, min_count, gfp, true); +} + /* * Mark the object as not allocated and schedule RCU freeing via put_object(). */ @@ -728,11 +745,11 @@ static void delete_object_part(unsigned long ptr, size_t size) start = object->pointer; end = object->pointer + object->size; if (ptr > start) - create_object(start, ptr - start, object->min_count, - GFP_KERNEL); + __create_object(start, ptr - start, object->min_count, + GFP_KERNEL, object->flags & OBJECT_PHYS); if (ptr + size < end) - create_object(ptr + size, end - ptr - size, object->min_count, - GFP_KERNEL); + __create_object(ptr + size, end - ptr - size, object->min_count, + GFP_KERNEL, object->flags & OBJECT_PHYS); __delete_object(object); } @@ -1129,9 +1146,14 @@ EXPORT_SYMBOL(kmemleak_no_scan); */ void __ref kmemleak_alloc_phys(phys_addr_t phys, size_t size, gfp_t gfp) { + pr_debug("%s(0x%pa, %zu)\n", __func__, &phys, size); + if (PHYS_PFN(phys) >= min_low_pfn && PHYS_PFN(phys) < max_low_pfn) - /* assume min_count 0 */ - kmemleak_alloc(__va(phys), size, 0, gfp); + /* + * Create object with OBJECT_PHYS flag and + * assume min_count 0. + */ + create_object_phys((unsigned long)__va(phys), size, 0, gfp); } EXPORT_SYMBOL(kmemleak_alloc_phys);