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 3E089C4828F for ; Fri, 9 Feb 2024 07:38:28 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 9BE4E6B0071; Fri, 9 Feb 2024 02:38:27 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 96EC06B0072; Fri, 9 Feb 2024 02:38:27 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 836056B0074; Fri, 9 Feb 2024 02:38:27 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 6F2106B0071 for ; Fri, 9 Feb 2024 02:38:27 -0500 (EST) Received: from smtpin22.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 059A3C04CC for ; Fri, 9 Feb 2024 07:38:27 +0000 (UTC) X-FDA: 81771462654.22.B65F6B8 Received: from mail-vs1-f51.google.com (mail-vs1-f51.google.com [209.85.217.51]) by imf14.hostedemail.com (Postfix) with ESMTP id 3E83F100010 for ; Fri, 9 Feb 2024 07:38:25 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=xLA9ue0T; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf14.hostedemail.com: domain of elver@google.com designates 209.85.217.51 as permitted sender) smtp.mailfrom=elver@google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1707464305; a=rsa-sha256; cv=none; b=JjbGqztZUywtnlPNVGgR6LYX+iBFwVU3M55WK3+CsteyYqiG1h1PEH+Hh1lHtUP90tRnjW dLt//cCnyMxEnunp6TuRtqyQAnoN3O9XpFMwKmsNLOv7TNHgzSukuHqA7TxQFAdAHfqwZg Q8SSbUv8EkucB4sNX4SXPDz7Dp1oHBE= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=xLA9ue0T; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf14.hostedemail.com: domain of elver@google.com designates 209.85.217.51 as permitted sender) smtp.mailfrom=elver@google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1707464305; 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-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=SRlv7V7FElgbzeYr1VtPdkh39UXXVbDIkm1KlhC6yfU=; b=ojm/6EJNLdBkcNF3XF9NgGUDakPdaEfzrOr93pV6GsKvdRFZtX/XedSZ+Wl2R4qC90krC2 TYt4ZbcNLox6UIn7wlWGYQMX7fiHsmrwiEnYGehW3wH4RIglvNch8lnPJdCqVZbxwsVE53 gM+L2/gUI1plOHzicRFpTcVpOrkqP+U= Received: by mail-vs1-f51.google.com with SMTP id ada2fe7eead31-46d29d26716so132138137.1 for ; Thu, 08 Feb 2024 23:38:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1707464304; x=1708069104; darn=kvack.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=SRlv7V7FElgbzeYr1VtPdkh39UXXVbDIkm1KlhC6yfU=; b=xLA9ue0TD5PiQDms5FkOODwKam0yOiQyb2Y3dceYgkXVYRpjWAhAHm4Km7bOJGqqy6 AVnLnRWNYdYyDYpJwheZ9Q2v+vbN+fHKSUn5iLP0rvvKFJm9gsU+wKfdRdvdAk4ofJf0 H1LEiJBzack85cywhVDTPs72y2SmRJZ6dXOE+ULMgO1n8+5L1ciu9fZbb4QxplW2wyGs x9/jM76QTnHeVDzGZaB9FBLn9hF+M4iFThslFiPWer6TTyBjrd04gZA8u8sdxBYXO1Qi EB+xImhCwUyOi4Wvx6akJ+DgGhoJLFTbk8egrlc2jMma0p7/qMnN8BoVis1TBzb5r8cf Fr2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1707464304; x=1708069104; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=SRlv7V7FElgbzeYr1VtPdkh39UXXVbDIkm1KlhC6yfU=; b=cN299UibJDDohN++iGoZV4RlCaC4fmFBi+J85e385mgdnQkwYuqVFe59V8XvyJgHJl OqXV957jxMdKa1plcGZwLEfYUmIcUr61E/j/H/WO96ObYx98KZ/tsZTFntEslEHboFLI 2/H+DAmDRpY0W5DiO3DDSDekkiOPocmRqt7ZlP+CDNhIEcEVtIV3B87EwY8HMQ4hv5zw 3ALVlJxrCSFG6HvPXqotythtX2CNUQC3NRzJFGwwybADU1+Rpkaf5hM4o92lh2KuEGo4 ftCxtM0oOr3SiK97iy3+EFQtXWLx4xNwIqVfqxA0QkcDGcG6DrHV1WVS1uSW59H4Q82a ERrA== X-Forwarded-Encrypted: i=1; AJvYcCXzDZjGxL0CofST1GKJR+yotW5ZewPK0g84eGHm78soVAE6PeOjL3F7cAkd+yI8Vfd1FTbQuxjLDk1NIaHs9RDE2G8= X-Gm-Message-State: AOJu0Yy07aCbuDHZp47V7WzLmMFEu0zso/byq5I3fWHSHH61eC1Bz89M r8k1qAOpsdLPMzVoQDmFzP07hBrN4eQ3V91FT6vgvFDaDV61z/8eG65IP5gqrq+IlyV+O+6goqG Ojny1PR3+R+rd/iGZ9eotUBgITvg37pqKjmBX X-Google-Smtp-Source: AGHT+IEu6DIN2XhxMjFllmU69QGQ/h0eOIqex2NbtE8sfnoKt/074UjDwM+94GUpewb+4IJMg+ZYlcNa2TU+Ehh+Qng= X-Received: by 2002:a05:6102:21d0:b0:46d:3208:aec9 with SMTP id r16-20020a05610221d000b0046d3208aec9mr406460vsg.8.1707464304111; Thu, 08 Feb 2024 23:38:24 -0800 (PST) MIME-Version: 1.0 References: <20240208234539.19113-1-osalvador@suse.de> <20240208234539.19113-3-osalvador@suse.de> In-Reply-To: <20240208234539.19113-3-osalvador@suse.de> From: Marco Elver Date: Fri, 9 Feb 2024 08:37:46 +0100 Message-ID: Subject: Re: [PATCH v7 2/4] mm,page_owner: Implement the tracking of the stacks count To: Oscar Salvador Cc: Andrew Morton , linux-kernel@vger.kernel.org, linux-mm@kvack.org, Michal Hocko , Vlastimil Babka , Andrey Konovalov , Alexander Potapenko Content-Type: text/plain; charset="UTF-8" X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 3E83F100010 X-Stat-Signature: aor58emznuuybofxrr9udws3hfbd8fqb X-HE-Tag: 1707464305-355520 X-HE-Meta: U2FsdGVkX19tpMTPE1JD8lcDRD0Ti/yRWvp0PDX4kAdAjYWcus2Jx+cPh2Q+fMorlRavPjLQzj3WEDfybDLPmUk3BgA/HY3FxTU/7DD6cp5Qgh3VhNTa1/yIzzH8ttSY2QefsB7PTDkyGpsX7z8y23G+c50LKsIPjj1LiplwQJgVAFj+gY37GYAppk5HSAsqsiKFArqCuOgREh9T6/oagXjBloZy58j5ff7OwrOtWugx2Mao08qg04PIv7Xy18EV1vAYI2hrSuSL6MTaTXXh8WT8seTd41A7K3teY6W+UcbH/xZC3xDR+XkpBNXGUB9JNcmlzxeTDUPhRCNQfZ5rTTu2kRsW8rlv4M5JL/R8ROP1rqYU58IiSga++V5aW+jBNFeWcrL+bZi1ZV6cjh3Z6qzaLOix6M3w/Ny7O3XNREfu+z+ZWqYJIOcB15GM4nWdSzDmKacDY42KaZXJLWxHSW3q76XcQDscKDK4XrFJE9MSt1QqXdiaPW/7whpRiep5M0yPEciej1IQnMC3r9fnvhijkJRpMflzInWxZHoqZHi5KXALgfkxfb+cbxdoOzCfU51YCDN2Sqq5S6JKGLTc777xIacU8GsClgUAoqSNQy0Lda+2LkL8D1mCz/tkgfzLByZCO5Ybu8MNAr5vgOAQLP4tgv3tjofek9dPQXeBYYA7oStW+/w8JhiBnFEfVoxJGn3BZv2h3b7vgpow7nHeAcD485x6d8VmYfWv3yYHlHTxv58QXzVorFku8Z7RrGyGxirFQNbHWIWLAtBCRCv1nweQI00DMODjtuvxabTzdsTKAb+tLCMFS4tBqVRdEqxnwv9d7V2YSoRwOrZANaM4DFNlB7t+Aj283yS6RjRtymaRYY2zq2p6Dg7wakshUIe/y80/KzYGwJVVuZhWF1JLgs3owwYcRi3CSDrsPl8rfIe57crJ5rS1xX8an9obf3G4y1NWChYMCIS16dD+yER 4tpdxl81 /d3zedvVqBGPguHIx2xGFNUjRQFbql64PyBUcm6G2iqwtLTxcsAkS4ZxFFWVDcTJeeLXxwQ0xVEYnTvZoxDaIUbecMvt3A58iJwO158m07bFiHxe02YI5JGV4p3H0rokQfUG7qB1Poll4vt64Ejap0s3M7DYCQBWhKkd34IaM91I/vfoP9xd2Ib/dy0LoLc1LR7KLq0nthT+yf4k8u7uutz31rcPvx0kwItroU6mZTR8je25L3JSbd4EGKS8yUOmZJtZbfS+ygSiQzQXnykPymnOh5g== 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: On Fri, 9 Feb 2024 at 00:45, Oscar Salvador wrote: > > page_owner needs to increment a stack_record refcount when a new allocation > occurs, and decrement it on a free operation. > In order to do that, we need to have a way to get a stack_record from a > handle. > Implement stack_depot_get_stack() which just does that, and make it public > so page_owner can use it. > > Also implement {inc,dec}_stack_record_count() which increments > or decrements on respective allocation and free operations, via > __reset_page_owner() (free operation) and __set_page_owner() (alloc > operation). > > Signed-off-by: Oscar Salvador > --- > include/linux/stackdepot.h | 8 ++++++++ > lib/stackdepot.c | 8 ++++++++ > mm/page_owner.c | 30 ++++++++++++++++++++++++++++++ > 3 files changed, 46 insertions(+) > > diff --git a/include/linux/stackdepot.h b/include/linux/stackdepot.h > index d0dcf4aebfb4..ac62de4d4999 100644 > --- a/include/linux/stackdepot.h > +++ b/include/linux/stackdepot.h > @@ -175,6 +175,14 @@ depot_stack_handle_t stack_depot_save_flags(unsigned long *entries, > depot_stack_handle_t stack_depot_save(unsigned long *entries, > unsigned int nr_entries, gfp_t gfp_flags); > > +/** > + * stack_depo_get_stack - Get a pointer to a stack struct > + * @handle: Stack depot handle > + * > + * Return: Returns a pointer to a stack struct > + */ > +struct stack_record *stack_depot_get_stack(depot_stack_handle_t handle); > + > /** > * stack_depot_fetch - Fetch a stack trace from stack depot > * > diff --git a/lib/stackdepot.c b/lib/stackdepot.c > index 16c8a1bf0008..197c355601f9 100644 > --- a/lib/stackdepot.c > +++ b/lib/stackdepot.c > @@ -681,6 +681,14 @@ depot_stack_handle_t stack_depot_save(unsigned long *entries, > } > EXPORT_SYMBOL_GPL(stack_depot_save); > > +struct stack_record *stack_depot_get_stack(depot_stack_handle_t handle) > +{ > + if (!handle) > + return NULL; > + > + return depot_fetch_stack(handle); > +} > + > unsigned int stack_depot_fetch(depot_stack_handle_t handle, > unsigned long **entries) > { > diff --git a/mm/page_owner.c b/mm/page_owner.c > index 5634e5d890f8..0adf41702b9d 100644 > --- a/mm/page_owner.c > +++ b/mm/page_owner.c > @@ -61,6 +61,22 @@ static __init bool need_page_owner(void) > return page_owner_enabled; > } > > +static void inc_stack_record_count(depot_stack_handle_t handle) > +{ > + struct stack_record *stack = stack_depot_get_stack(handle); > + > + if (stack) > + refcount_inc(&stack->count); > +} > + > +static void dec_stack_record_count(depot_stack_handle_t handle) > +{ > + struct stack_record *stack = stack_depot_get_stack(handle); > + > + if (stack) > + refcount_dec(&stack->count); > +} > + > static __always_inline depot_stack_handle_t create_dummy_stack(void) > { > unsigned long entries[4]; > @@ -140,6 +156,7 @@ void __reset_page_owner(struct page *page, unsigned short order) > int i; > struct page_ext *page_ext; > depot_stack_handle_t handle; > + depot_stack_handle_t alloc_handle; > struct page_owner *page_owner; > u64 free_ts_nsec = local_clock(); > > @@ -147,6 +164,9 @@ void __reset_page_owner(struct page *page, unsigned short order) > if (unlikely(!page_ext)) > return; > > + page_owner = get_page_owner(page_ext); > + alloc_handle = page_owner->handle; > + > handle = save_stack(GFP_NOWAIT | __GFP_NOWARN); > for (i = 0; i < (1 << order); i++) { > __clear_bit(PAGE_EXT_OWNER_ALLOCATED, &page_ext->flags); > @@ -158,6 +178,15 @@ void __reset_page_owner(struct page *page, unsigned short order) > page_ext = page_ext_next(page_ext); > } > page_ext_put(page_ext); > + if (alloc_handle != early_handle) > + /* > + * early_handle is being set as a handle for all those > + * early allocated pages. See init_pages_in_zone(). > + * Since their refcount is not being incremented because > + * the machinery is not ready yet, we cannot decrement > + * their refcount either. > + */ > + dec_stack_record_count(alloc_handle); > } > > static inline void __set_page_owner_handle(struct page_ext *page_ext, > @@ -199,6 +228,7 @@ noinline void __set_page_owner(struct page *page, unsigned short order, > return; > __set_page_owner_handle(page_ext, handle, order, gfp_mask); > page_ext_put(page_ext); > + inc_stack_record_count(handle); > } > > void __set_page_owner_migrate_reason(struct page *page, int reason) > -- > 2.43.0 >