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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 396D4C433EF for ; Fri, 5 Nov 2021 13:15:00 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id E859F611AE for ; Fri, 5 Nov 2021 13:14:59 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org E859F611AE Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=kvack.org Received: by kanga.kvack.org (Postfix) id 71C706B006C; Fri, 5 Nov 2021 09:14:59 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6A4E3940007; Fri, 5 Nov 2021 09:14:59 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4F7A16B0073; Fri, 5 Nov 2021 09:14:59 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0193.hostedemail.com [216.40.44.193]) by kanga.kvack.org (Postfix) with ESMTP id 30EC76B006C for ; Fri, 5 Nov 2021 09:14:59 -0400 (EDT) Received: from smtpin09.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id A8B6576AEE for ; Fri, 5 Nov 2021 13:14:57 +0000 (UTC) X-FDA: 78774921834.09.D1A74F2 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by imf26.hostedemail.com (Postfix) with ESMTP id B9D9C20019F0 for ; Fri, 5 Nov 2021 13:14:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1636118094; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cipQgNVTuxKP3IGGvIvJ0OX8skmtJ1D0RKlfG0HMsY4=; b=RdhDVrpJr32kuh6LDgyvGlP92ZJrDK3w6dKQsYfzGrci+iijJGcfTG70xm6Tf6YfzKy219 3nUjuXBxiLIgNmvi6yZ4r23Zh7MgpOMF5bfBWTq2O5XfcsEnHwF+SiNYMVzuMUPPeWL4He qvJoXM9PtUf9qCWN53u6UYzXEJWdPG8= Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-421-0AoYDGx1NiyB850BGcC2pQ-1; Fri, 05 Nov 2021 09:14:53 -0400 X-MC-Unique: 0AoYDGx1NiyB850BGcC2pQ-1 Received: by mail-wr1-f70.google.com with SMTP id j12-20020adf910c000000b0015e4260febdso2303287wrj.20 for ; Fri, 05 Nov 2021 06:14:53 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent :content-language:to:cc:references:from:organization:subject :in-reply-to:content-transfer-encoding; bh=cipQgNVTuxKP3IGGvIvJ0OX8skmtJ1D0RKlfG0HMsY4=; b=DgP39CaFsxLx3ULqEUfZN51fw7n0JiJDQWdtXpm1OZOEAWddi4ROuuahtHuS30snHl is3rJARjNBGorVb8okTTnVFZeyc46s2QC1vM6JcnLpWM7XNLgaZXkEWMf5YFhzve8v2T mqI0KJAq4SFAfNwsH6gVm/pAHMbPvh2J21jiSciNT5Wj+zs+f5MMbvOi2VF0ecaWKW6l QofTT+nQCcBaVSYEDtp2NbkBLTwg2LVlCHgNAphbhll66C6Kk60cqUnUa4B+v+iNrUws eZjCKqNc9ZRLS6BkRrkPDBW3PYuPB/+C733tzthRUnJtQbuReyN1xLF1L2cugvB5dRK8 r1oA== X-Gm-Message-State: AOAM5333w5b82B670klvCKIroH/WfDOwSlHxH0bl8ZcVhuxBgtak+PDS JWG6fGfDrg5ZuVaZqgFu5AL++Q4qFmaEzW/ftxYvAvFiubHHAQremUWMAMNEL3uFFxu9McoeqNc JKf62LuaDdnE= X-Received: by 2002:a7b:cbc3:: with SMTP id n3mr30833944wmi.15.1636118092321; Fri, 05 Nov 2021 06:14:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwjLBuk120ET2AqSLkOFNtaP+Vx9v5XHOJr4E0tU4vBg08W3mnHMCfMWOLtyKXuYkoakLXblA== X-Received: by 2002:a7b:cbc3:: with SMTP id n3mr30833920wmi.15.1636118092066; Fri, 05 Nov 2021 06:14:52 -0700 (PDT) Received: from ?IPV6:2003:d8:2f0c:a000:3f25:9662:b5cf:73f9? (p200300d82f0ca0003f259662b5cf73f9.dip0.t-ipconnect.de. [2003:d8:2f0c:a000:3f25:9662:b5cf:73f9]) by smtp.gmail.com with ESMTPSA id 8sm10916174wmg.24.2021.11.05.06.14.51 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 05 Nov 2021 06:14:51 -0700 (PDT) Message-ID: Date: Fri, 5 Nov 2021 14:14:50 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.2.0 To: Lang Yu , linux-mm@kvack.org Cc: Catalin Marinas , linux-kernel@vger.kernel.org References: <20211105035241.1239751-1-lang.yu@amd.com> From: David Hildenbrand Organization: Red Hat Subject: Re: [PATCH] mm/kmemleak: Avoid scanning potential huge holes In-Reply-To: <20211105035241.1239751-1-lang.yu@amd.com> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: B9D9C20019F0 X-Stat-Signature: tc4gf1hp9mfkmne16x7s777hpogdz57g Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=RdhDVrpJ; spf=none (imf26.hostedemail.com: domain of david@redhat.com has no SPF policy when checking 216.205.24.124) smtp.mailfrom=david@redhat.com; dmarc=pass (policy=none) header.from=redhat.com X-HE-Tag: 1636118095-54984 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 05.11.21 04:52, Lang Yu wrote: > When using devm_request_free_mem_region() and > devm_memremap_pages() to add ZONE_DEVICE memory, if requested > free mem region pfn were huge(e.g., 0x0x400000000 ,we found > on some amd apus, amdkfd svm will request a such free mem region), > the node_end_pfn() will be also huge(see move_pfn_range_to_zone()). > It creates a huge hole between node_start_pfn() and node_end_pfn(). > > In such a case, following code snippet acctually was > just doing busy test_bit() looping on the huge hole. > > for (pfn = start_pfn; pfn < end_pfn; pfn++) { > struct page *page = pfn_to_online_page(pfn); > if (!page) > continue; > ... > } > > So we got a soft lockup: > > watchdog: BUG: soft lockup - CPU#6 stuck for 26s! [bash:1221] > CPU: 6 PID: 1221 Comm: bash Not tainted 5.15.0-custom #1 > RIP: 0010:pfn_to_online_page+0x5/0xd0 > Call Trace: > ? kmemleak_scan+0x16a/0x440 > kmemleak_write+0x306/0x3a0 > ? common_file_perm+0x72/0x170 > full_proxy_write+0x5c/0x90 > vfs_write+0xb9/0x260 > ksys_write+0x67/0xe0 > __x64_sys_write+0x1a/0x20 > do_syscall_64+0x3b/0xc0 > entry_SYSCALL_64_after_hwframe+0x44/0xae > > I did some tests with the patch. > > (1) amdgpu module unloaded > > before the patch: > > real 0m0.976s > user 0m0.000s > sys 0m0.968s > > after the patch: > > real 0m0.981s > user 0m0.000s > sys 0m0.973s > > (2) amdgpu module loaded > > before the patch: > > real 0m35.365s > user 0m0.000s > sys 0m35.354s > > after the patch: > > real 0m1.049s > user 0m0.000s > sys 0m1.042s > > Signed-off-by: Lang Yu > --- > mm/kmemleak.c | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > > diff --git a/mm/kmemleak.c b/mm/kmemleak.c > index b57383c17cf6..d07444613a84 100644 > --- a/mm/kmemleak.c > +++ b/mm/kmemleak.c > @@ -1403,6 +1403,7 @@ static void kmemleak_scan(void) > { > unsigned long flags; > struct kmemleak_object *object; > + struct zone *zone; > int i; > int new_leaks = 0; > > @@ -1443,9 +1444,9 @@ static void kmemleak_scan(void) > * Struct page scanning for each node. > */ > get_online_mems(); > - for_each_online_node(i) { > - unsigned long start_pfn = node_start_pfn(i); > - unsigned long end_pfn = node_end_pfn(i); > + for_each_populated_zone(zone) { > + unsigned long start_pfn = zone->zone_start_pfn; > + unsigned long end_pfn = zone_end_pfn(zone); > unsigned long pfn; > > for (pfn = start_pfn; pfn < end_pfn; pfn++) { > @@ -1455,7 +1456,7 @@ static void kmemleak_scan(void) > continue; > > /* only scan pages belonging to this node */ > - if (page_to_nid(page) != i) > + if (page_to_nid(page) != zone_to_nid(zone)) With overlapping zones you might rescan ranges ... instead we should do: /* only scan pages belonging to this zone */ if (zone != page_zone(page)) ... Or alternatively: /* only scan pages belonging to this node */ if (page_to_nid(page) != zone_to_nid(zone)) continue; /* only scan pages belonging to this zone */ if (page_zonenum(page) != zone_idx(zone)) continue; -- Thanks, David / dhildenb