From nobody Thu Sep 24 23:32:10 2026 Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 499844F391F for ; Fri, 18 Sep 2026 15:33:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789745606; cv=none; b=SPWTZcZ/eBIjnOWVprycmoPl093uYWlgz40xlrPafkjQMZQCKhdbGEUJWamjrFfYhqAXryEj3OKn/WD56FDzZWayufuaVFRAX/sEbYKF+9L9BAiwtaQcUoZD9uV4A2qJg8UX9ows1+dBjT+xY4ehaStLhkuhRIE88fiyoVRa5KM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789745606; c=relaxed/simple; bh=sNhtugPm/JmXICxKXp9aPTYjkThuZCpeqE7pnXcsG/E=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Vit70n7oePg8mJLXRGFy//XtUcH5p1Hok36Wh//GxCQVCX/SYplBxKZwqif5LvxUKFgBPZQJAqUsaCymMoxXs3i7frO1klrKLMqyaL75BsOZ9Jj0JxV2wjADXuUTQbY5OWXRXHFPuRSLTJe8L2qojLegGS91VyKOcR+/1JE/+WE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--surenb.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=ghIJPijE; arc=none smtp.client-ip=209.85.216.72 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--surenb.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="ghIJPijE" Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-39de1f85cb2so1218777a91.0 for ; Fri, 18 Sep 2026 08:33:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1789745603; x=1790350403; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=G76+KNo+7dCD80CEXVYRdrJvlcvMXRNfZh0Z210UNpw=; b=ghIJPijEWsiBuU67vV0aYHO4lX8qRfIUfuht8tF3ByfvMV4Wvw6HO1D6sXjUBrov3p rT48R3AoNfD5+j9mCEBLhH8KIfZnllKm2bs0CFY+mcxdMqkYj5EuO+63CmuAh+BEOi/y UCYabTcWDX3GQvm1SqVAojYzwlRFji07fhnJ1HLLAo6nhKjDdVbWZibKV1gvx7mn00Uj uA7RUN3EbFtXSHFiQK63IspYz8bOdYsC0gJWnlG6Y/7uJnI+hD1GmSC9c1V29qr46q1i supX1L9eMgl/VBcYniF+3k7fFdSniCEOa5a2u/UendcckIUjxAY+GWHFdPcXVhTZ2z/X 4zcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789745603; x=1790350403; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=G76+KNo+7dCD80CEXVYRdrJvlcvMXRNfZh0Z210UNpw=; b=GLO7Np1zn2/JMYbO4tvgHsPCgZJp2lLM48UOBDagW6je7gRrN5//X5Na7NjHTUTNsb yZhEMEUzaEX7MM+hlKdLYsB5v+dPtGjzTQMqr70SHlzXmxZCjJSc5hiCUXJPWYP+W+4p /ED9gQuXQeoYxA3XkO5LJOsOYj7B26hOeCTXyB5TBdg8UKQlaQiey2pT+8/gCyFMI3R4 7ft+/OIoWBuMWYAX5ZZ0QWpUjfln2zTvzN0g46DKvjCLL1a9vKu2kGrweeIk98viJYgx 5OyPUizs3k0Q0w09CPZpX8k3IMtNqLaItE2guY4+H5LCSbwa4V30EhSjIezkOfgRVQgV 75nw== X-Forwarded-Encrypted: i=1; AKwUvByzm6mVX75RrbW0LC/52FsonlSjwP8EI2t3Bg++Gzfp8tbWmOsIquDTReF2tx3MGYFhnapy9NJLruS8P6A=@vger.kernel.org X-Gm-Message-State: AFuF++npzQ1BoflTi5ogoviddIi859+DNZVZlIQLJsYNrlnSCXirckn1 VJph84agA5Dh6zlIrNDKIgxqBxHLKZ+tbTxFHPtVeKKeUXHFCvwVbLXfHmbF2Km507RGVSlBCRU C2dQBbQ== X-Received: from dldd2.prod.google.com ([2002:a05:701a:c902:b0:144:d109:6356]) (user=surenb job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4ac7:b0:39e:6c6a:4b6b with SMTP id 98e67ed59e1d1-39e6c6a56acmr25332a91.53.1789745603281; Fri, 18 Sep 2026 08:33:23 -0700 (PDT) Date: Fri, 18 Sep 2026 08:33:12 -0700 In-Reply-To: <20260918153318.758387-1-surenb@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260918153318.758387-1-surenb@google.com> X-Mailer: git-send-email 2.55.0.1082.g2b9226bbc0-goog Message-ID: <20260918153318.758387-2-surenb@google.com> Subject: [PATCH v5 1/7] proc/task_mmu: remove unnecessary helpers From: Suren Baghdasaryan To: akpm@linux-foundation.org Cc: liam@infradead.org, ljs@kernel.org, vbabka@kernel.org, david@kernel.org, willy@infradead.org, jannh@google.com, paulmck@kernel.org, pfalcato@suse.de, xueyuan.chen21@gmail.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, surenb@google.com, Usama Arif Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When per-vma locks were behind a config option, a number of helper functions were needed to simplify the locking code. Now that these locks are universally available, we can do a little cleanup. Remove lock_vma_range(), unlock_vma_range(), query_vma_setup(), query_vma_teardown() helpers. No functional change intended. Signed-off-by: Suren Baghdasaryan Reviewed-by: Liam R. Howlett (Oracle) Reviewed-by: Lorenzo Stoakes (ARM) Acked-by: Usama Arif Acked-by: David Hildenbrand (Arm) --- fs/proc/task_mmu.c | 67 ++++++++++++---------------------------------- 1 file changed, 17 insertions(+), 50 deletions(-) diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 052e8dc796bc..191a054d7e40 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -160,25 +160,6 @@ static void unlock_ctx_vma(struct proc_maps_locking_ct= x *lock_ctx) } } =20 -static inline bool lock_vma_range(struct seq_file *m, - struct proc_maps_locking_ctx *lock_ctx) -{ - rcu_read_lock(); - reset_lock_ctx(lock_ctx); - - return true; -} - -static inline void unlock_vma_range(struct proc_maps_locking_ctx *lock_ctx) -{ - if (lock_ctx->mmap_locked) { - unlock_ctx_mm(lock_ctx); - } else { - unlock_ctx_vma(lock_ctx); - rcu_read_unlock(); - } -} - static struct vm_area_struct *get_next_vma(struct proc_maps_private *priv, loff_t last_pos) { @@ -286,13 +267,8 @@ static void *m_start(struct seq_file *m, loff_t *ppos) return NULL; } =20 - if (!lock_vma_range(m, lock_ctx)) { - mmput(mm); - put_task_struct(priv->task); - priv->task =3D NULL; - return ERR_PTR(-EINTR); - } - + rcu_read_lock(); + reset_lock_ctx(lock_ctx); /* * Reset current position if last_addr was set before * and it's not a sentinel. @@ -325,7 +301,12 @@ static void m_stop(struct seq_file *m, void *v) return; =20 release_task_mempolicy(priv); - unlock_vma_range(&priv->lock_ctx); + if (priv->lock_ctx.mmap_locked) { + unlock_ctx_mm(&priv->lock_ctx); + } else { + unlock_ctx_vma(&priv->lock_ctx); + rcu_read_unlock(); + } mmput(mm); put_task_struct(priv->task); priv->task =3D NULL; @@ -518,21 +499,6 @@ static int pid_maps_open(struct inode *inode, struct f= ile *file) PROCMAP_QUERY_VMA_FLAGS \ ) =20 -static int query_vma_setup(struct proc_maps_locking_ctx *lock_ctx) -{ - reset_lock_ctx(lock_ctx); - - return 0; -} - -static void query_vma_teardown(struct proc_maps_locking_ctx *lock_ctx) -{ - if (lock_ctx->mmap_locked) - unlock_ctx_mm(lock_ctx); - else - unlock_ctx_vma(lock_ctx); -} - static struct vm_area_struct *query_vma_find_by_addr(struct proc_maps_lock= ing_ctx *lock_ctx, unsigned long addr) { @@ -653,12 +619,7 @@ static int do_procmap_query(struct mm_struct *mm, void= __user *uarg) if (!mm || !mmget_not_zero(mm)) return -ESRCH; =20 - err =3D query_vma_setup(&lock_ctx); - if (err) { - mmput(mm); - return err; - } - + reset_lock_ctx(&lock_ctx); vma =3D query_matching_vma(&lock_ctx, karg.query_addr, karg.query_flags); if (IS_ERR(vma)) { err =3D PTR_ERR(vma); @@ -732,7 +693,10 @@ static int do_procmap_query(struct mm_struct *mm, void= __user *uarg) vm_file =3D get_file(vma->vm_file); =20 /* unlock vma or mmap_lock, and put mm_struct before copying data to user= */ - query_vma_teardown(&lock_ctx); + if (lock_ctx.mmap_locked) + unlock_ctx_mm(&lock_ctx); + else + unlock_ctx_vma(&lock_ctx); mmput(mm); =20 if (karg.build_id_size) { @@ -773,7 +737,10 @@ static int do_procmap_query(struct mm_struct *mm, void= __user *uarg) return 0; =20 out: - query_vma_teardown(&lock_ctx); + if (lock_ctx.mmap_locked) + unlock_ctx_mm(&lock_ctx); + else + unlock_ctx_vma(&lock_ctx); mmput(mm); out_file: if (vm_file) --=20 2.55.0.1082.g2b9226bbc0-goog From nobody Thu Sep 24 23:32:10 2026 Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 245EA4FDA70 for ; Fri, 18 Sep 2026 15:33:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.70 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789745608; cv=none; b=OTRU18jeHFMVYts9HuYb9ik5WJq6Bi+4kVyfv4zc0SGDz7gJowCTDhZ4VR0nPmasQfTWrTfdBd6lwngB+m1U+TvMT582HRUweFvs/MH9fcQsu35J+t4TLs7jYU2kL+v4W6tE9XRzqpOeD1QLm4WXLhSTccU5nrh1/qPsq5qtxiY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789745608; c=relaxed/simple; bh=ZATjr9vGIRP9OJ8ChECjJEnnBK9wQJMcxZJyHJQjVtM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=IVyS3YZy8theyPVZgLRmgnfA3fCVgl25thGEU/I3k1hTUPSjYWrMqnpKV79DS57/r2sw0E4Jiq0QiObfOEVweRkl6crRvvyHrGcbnnUV5bsVr/7LB3yODBeKzAJSFJCVgsiTqCjKD+ZxtvOuL5kEBTiaLwRRKtcPHeBOhYHJ4dw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--surenb.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Jbi4SaKD; arc=none smtp.client-ip=209.85.216.70 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--surenb.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Jbi4SaKD" Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-3823dcc1647so1322971a91.3 for ; Fri, 18 Sep 2026 08:33:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1789745605; x=1790350405; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=CWMWdX0M04Ux74D6qkwQk3CE9vSTuvtr+k+ENnhVHRs=; b=Jbi4SaKDJnoj7+oL7aOgG5N7stSClc24YawhC3gJLGTjWM2cLx7WK0l4NO0tzrp9+b CxQ+T8bwKlcddit8pqgyt9UiyZBSINpPK4GJkxhpiJSF9huJZ6mmu9UKU0EREwryTa5Z wlXxJQYd2vrEB/Zb+JOwXze15MqgK8oo8jpqwJmESx5pVamg5lkz97FMEmjFbCn0FDpF lAaxBbh2NXGQGLNrXxcNawzS/hdwBdAnAThMkVusIc1/TtRXkXTIYKyRWKYScoZspdqN x0YgmboI+abv1+u/rrGw6xNSPDom0I5Zq7yDz6TQycKYCryUz1aRIAx7n3dSaI4nq7Va iQEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789745605; x=1790350405; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=CWMWdX0M04Ux74D6qkwQk3CE9vSTuvtr+k+ENnhVHRs=; b=O2NVSHoRS76Cj5WH54pELOxBL2YGomAQnUTD+vhsduiqPB+IrMD2QC/BXltOuV/z1m alvyefoYbePZPvxGgwziEWJVWQVPfJrvR+WcmBMa3TaVBkM8rne2wM8tcZqfrJCAurGX fv1HA2gzMpKmPTQJUiJD3hZJ+aO4WxaViP+QWYG+YB8qBWfLzMuUy9YfdS+m30YT0uGR qFnAUM9ED48sJ8ePgiHxzAyGb089iHK/JCdHOaq1C5pVfuCVIC8dldkiO0gL9z5XwbI8 afw4JNLbN21jEJFmT/NfNVk0HT14FOy9sMpWD6XT9HXPNyWA8hx2chZixrbLqJdcdmFt fD+w== X-Forwarded-Encrypted: i=1; AKwUvByfJgbbAYovuhjP5kvCI800ov1ElpK4cnmGH9WlJWnPhoj0CSdON6DtnSglrwp/nNHrPtB/iGUclKot2o0=@vger.kernel.org X-Gm-Message-State: AFuF++nHx5Om7ll+J/KrvHiLKGwN1Ejgbsk9I1tzOQYPWJHN/9dG2Hu9 eoZHgV6rYqa6a/NcGW/Yin9VzaNcqcpb7D19cr5H8b1LLi+gGlLZwdAzLJxOZdQJUvNuN7zDZ6D n6CSDjg== X-Received: from dlev11.prod.google.com ([2002:a05:701b:464b:b0:143:966c:32eb]) (user=surenb job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1d47:b0:39e:6a81:5a91 with SMTP id 98e67ed59e1d1-39e6a815e2cmr504732a91.37.1789745605293; Fri, 18 Sep 2026 08:33:25 -0700 (PDT) Date: Fri, 18 Sep 2026 08:33:13 -0700 In-Reply-To: <20260918153318.758387-1-surenb@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260918153318.758387-1-surenb@google.com> X-Mailer: git-send-email 2.55.0.1082.g2b9226bbc0-goog Message-ID: <20260918153318.758387-3-surenb@google.com> Subject: [PATCH v5 2/7] proc/task_mmu: remove unnecessary inlines in function definitions From: Suren Baghdasaryan To: akpm@linux-foundation.org Cc: liam@infradead.org, ljs@kernel.org, vbabka@kernel.org, david@kernel.org, willy@infradead.org, jannh@google.com, paulmck@kernel.org, pfalcato@suse.de, xueyuan.chen21@gmail.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, surenb@google.com, Usama Arif Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" It was pointed out in the previous reviews of this code that many functions are specified as inline, which is unnecessary as the compiler can make that decision by itself. Cleanup these definitions. No change in the resulting binary file size with gcc v15.2.0. No functional change intended. Signed-off-by: Suren Baghdasaryan Reviewed-by: Liam R. Howlett (Oracle) Reviewed-by: Lorenzo Stoakes (ARM) Acked-by: Usama Arif Acked-by: David Hildenbrand (Arm) --- fs/proc/task_mmu.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 191a054d7e40..8a72dc0dc945 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -130,7 +130,8 @@ static void release_task_mempolicy(struct proc_maps_pri= vate *priv) } #endif =20 -static inline int lock_ctx_mm(struct proc_maps_locking_ctx *lock_ctx) +#ifdef CONFIG_PROC_PAGE_MONITOR +static int lock_ctx_mm(struct proc_maps_locking_ctx *lock_ctx) { int ret =3D mmap_read_lock_killable(lock_ctx->mm); =20 @@ -139,8 +140,9 @@ static inline int lock_ctx_mm(struct proc_maps_locking_= ctx *lock_ctx) =20 return ret; } +#endif =20 -static inline void unlock_ctx_mm(struct proc_maps_locking_ctx *lock_ctx) +static void unlock_ctx_mm(struct proc_maps_locking_ctx *lock_ctx) { mmap_read_unlock(lock_ctx->mm); lock_ctx->mmap_locked =3D false; @@ -177,8 +179,8 @@ static struct vm_area_struct *get_next_vma(struct proc_= maps_private *priv, return vma; } =20 -static inline bool fallback_to_mmap_lock(struct proc_maps_private *priv, - loff_t pos) +static bool fallback_to_mmap_lock(struct proc_maps_private *priv, + loff_t pos) { struct proc_maps_locking_ctx *lock_ctx =3D &priv->lock_ctx; =20 @@ -194,7 +196,8 @@ static inline bool fallback_to_mmap_lock(struct proc_ma= ps_private *priv, return true; } =20 -static inline void drop_rcu(struct proc_maps_private *priv) +#ifdef CONFIG_PROC_PAGE_MONITOR +static void drop_rcu(struct proc_maps_private *priv) { if (priv->lock_ctx.mmap_locked) return; @@ -202,7 +205,7 @@ static inline void drop_rcu(struct proc_maps_private *p= riv) rcu_read_unlock(); } =20 -static inline void reacquire_rcu(struct proc_maps_private *priv) +static void reacquire_rcu(struct proc_maps_private *priv) { if (priv->lock_ctx.mmap_locked) return; @@ -211,6 +214,7 @@ static inline void reacquire_rcu(struct proc_maps_priva= te *priv) /* Reinitialize the iterator. */ vma_iter_set(&priv->iter, priv->lock_ctx.locked_vma->vm_end); } +#endif =20 static struct vm_area_struct *proc_get_vma(struct seq_file *m, loff_t *ppo= s) { @@ -1230,7 +1234,7 @@ static const struct mm_walk_ops smaps_shmem_walk_vma_= lock_ops =3D { .walk_lock =3D PGWALK_VMA_RDLOCK_VERIFY, }; =20 -static inline const struct mm_walk_ops * +static const struct mm_walk_ops * get_smaps_walk_ops(struct proc_maps_private *priv) { if (priv->lock_ctx.mmap_locked) @@ -1238,7 +1242,7 @@ get_smaps_walk_ops(struct proc_maps_private *priv) return &smaps_walk_vma_lock_ops; } =20 -static inline const struct mm_walk_ops * +static const struct mm_walk_ops * get_smaps_shmem_walk_ops(struct proc_maps_private *priv) { if (priv->lock_ctx.mmap_locked) @@ -1572,7 +1576,7 @@ struct clear_refs_private { enum clear_refs_types type; }; =20 -static inline bool pte_is_pinned(struct vm_area_struct *vma, unsigned long= addr, pte_t pte) +static bool pte_is_pinned(struct vm_area_struct *vma, unsigned long addr, = pte_t pte) { struct folio *folio; =20 @@ -1588,8 +1592,8 @@ static inline bool pte_is_pinned(struct vm_area_struc= t *vma, unsigned long addr, return folio_maybe_dma_pinned(folio); } =20 -static inline void clear_soft_dirty(struct vm_area_struct *vma, - unsigned long addr, pte_t *pte) +static void clear_soft_dirty(struct vm_area_struct *vma, unsigned long add= r, + pte_t *pte) { if (!pgtable_supports_soft_dirty()) return; @@ -1620,7 +1624,7 @@ static inline void clear_soft_dirty(struct vm_area_st= ruct *vma, } =20 #if defined(CONFIG_TRANSPARENT_HUGEPAGE) -static inline void clear_soft_dirty_pmd(struct vm_area_struct *vma, +static void clear_soft_dirty_pmd(struct vm_area_struct *vma, unsigned long addr, pmd_t *pmdp) { pmd_t old, pmd =3D *pmdp; @@ -1646,7 +1650,7 @@ static inline void clear_soft_dirty_pmd(struct vm_are= a_struct *vma, } } #else -static inline void clear_soft_dirty_pmd(struct vm_area_struct *vma, +static void clear_soft_dirty_pmd(struct vm_area_struct *vma, unsigned long addr, pmd_t *pmdp) { } @@ -1848,7 +1852,7 @@ struct pagemapread { =20 #define PM_END_OF_BUFFER 1 =20 -static inline pagemap_entry_t make_pme(u64 frame, u64 flags) +static pagemap_entry_t make_pme(u64 frame, u64 flags) { return (pagemap_entry_t) { .pme =3D (frame & PM_PFRAME_MASK) | flags }; } @@ -3390,7 +3394,7 @@ static const struct mm_walk_ops show_numa_vma_lock_op= s =3D { .walk_lock =3D PGWALK_VMA_RDLOCK_VERIFY, }; =20 -static inline const struct mm_walk_ops * +static const struct mm_walk_ops * get_show_numa_ops(struct proc_maps_private *priv) { if (priv->lock_ctx.mmap_locked) --=20 2.55.0.1082.g2b9226bbc0-goog From nobody Thu Sep 24 23:32:10 2026 Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0383C50278F for ; Fri, 18 Sep 2026 15:33:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.70 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789745609; cv=none; b=lfFW4s51sfJSOYL+wOFMz9RHMJWH3xA5AcuCJGQhcun6jrVZ2lML11N1NNFkwxwHQ+0Sx7aMdFuLyOzZ5HGE4Jt/ZDq+gEXW8SvtN86fUvJ96gvt6/JPjWH4I8q/3HCTufSQygmFh/cf5A6yr1zyFuS5AzVmfq+Xv/dB8vGW1wE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789745609; c=relaxed/simple; bh=rN+E4/FWjcs5I7cZl7CmbMADuFHOc37MDHiG5PLssiM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=t0KC9QLzv6OUW1UF6+kChVOe7H22nSWw9tU7viJ8RZ0IhMdmNw8nuwTWxLH3+7BZOD2y2wuZHwUAvKrjfCqS4P3mvGaF9qFm/bjVeyVe+OlXl83zg/G/1jSOJG+rvi9RcpAon/stGcU+ETMoQDE6a9i7IoKR/1/9cIrOW34z4Rg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--surenb.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Se+S8G68; arc=none smtp.client-ip=209.85.216.70 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--surenb.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Se+S8G68" Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-39de1f85cb2so1218856a91.0 for ; Fri, 18 Sep 2026 08:33:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1789745607; x=1790350407; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=31y1T2wCgzpuS+JdcRd/GVSVXNd4Xu5+lzNmsg6bK28=; b=Se+S8G68oVIA79n1uHICdL1hSRiKVACNImzOu2avfAXMGEWLYy5J0+43diH9su/S+K 6pIM4z2iRrzTo2/DjHvc+9eEymTIw4vITyNPK94Xe1hx1epA81CsBu2M1n24+cuRA3Xf /5YAvr/rlj3+ntEgbn5RXkJ6gezl7T2JnvKO37oTb3+tus0pSyvagAAAlSftPUn7adAE qo58fXFAcPx78aefdisUCLFYtZTy/Sg6gUMt7Ma3bbHVrtlJeZeT16jCjhv63ST/wf2G KcoT8JlLhk1X4OIhaUYnvLsUqYPgimxOWFwCk4V1nTieRqZ7leVeRLMun+nd4baMlqRo lYnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789745607; x=1790350407; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=31y1T2wCgzpuS+JdcRd/GVSVXNd4Xu5+lzNmsg6bK28=; b=vdI00lpKb79VEnLuPsvRDCL8NAwa+OIzDW96N88rDnCjPdLoq97Iq4vU1sOJmnSVfW wWLs6i8HZUisuc/5RRjPHb839Yd44hwuz0erUmEE2KOL4D9tFbsnpD8GR1QsBN9KBWRo 7kZhn1qXlMt1BixuumNXBxZkzyzPs9zCrksSXsoXZoiRtXuDnkCRPIz7G7Tkv8RjqBqQ MrUpJmthxn0AmU3Ht9RYuvO01npGj5jHr5fSpHBYuDuOJ1UY4kdfs3JTrIZ2GsVXyKM8 KrSoNpYmUgyepdHKX5usQR+UZ+gvFQoZwh4SPcSqpnxtCksaG7d09L9sB8ZNOf4oEJPo AiDA== X-Forwarded-Encrypted: i=1; AKwUvBxC4IIWwIxr8uWVAZP7MrqMYhtiQfz/USB6zCnxsFHuBLvu2pcJPtDrRKi1Ez9FYPJ/gOEOOkfm1JmWDYQ=@vger.kernel.org X-Gm-Message-State: AFuF++lhO0XMEZIwF/yabjfPgeboCjju6EbciaViXBuSn4oDS/qSzBJT 8cjmtub6UvDe15RjTgIEurOe0w0/hca9hjOPilQ+jM6zstZM6s7yW2hCzauPRy29yfzOXyZGTI8 t86nbIQ== X-Received: from dlan4-n2.prod.google.com ([2002:a05:7022:eb44:20b0:144:d2ba:3139]) (user=surenb job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2ecb:b0:39e:31ec:ba55 with SMTP id 98e67ed59e1d1-39e54d36b09mr7394741a91.7.1789745607146; Fri, 18 Sep 2026 08:33:27 -0700 (PDT) Date: Fri, 18 Sep 2026 08:33:14 -0700 In-Reply-To: <20260918153318.758387-1-surenb@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260918153318.758387-1-surenb@google.com> X-Mailer: git-send-email 2.55.0.1082.g2b9226bbc0-goog Message-ID: <20260918153318.758387-4-surenb@google.com> Subject: [PATCH v5 3/7] proc/task_mmu: clarify shmem mapping walk conditions in smap_gather_stats() From: Suren Baghdasaryan To: akpm@linux-foundation.org Cc: liam@infradead.org, ljs@kernel.org, vbabka@kernel.org, david@kernel.org, willy@infradead.org, jannh@google.com, paulmck@kernel.org, pfalcato@suse.de, xueyuan.chen21@gmail.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, surenb@google.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" smap_gather_stats() optimizes stats gathering by skipping the walk for shmem mappings in certain conditions. Update the comment to clarify these conditions and use vma_is_cow_mapping() for CoW identification instead of open-coding it. No functional change intended. Suggested by: David Hildenbrand (Arm) Signed-off-by: Suren Baghdasaryan Reviewed-by: Lorenzo Stoakes (ARM) Acked-by: David Hildenbrand (Arm) --- fs/proc/task_mmu.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 8a72dc0dc945..f1ce15981253 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -1274,23 +1274,18 @@ static void smap_gather_stats(struct proc_maps_priv= ate *priv, =20 if (vma->vm_file && shmem_mapping(vma->vm_file->f_mapping)) { /* - * For shared or readonly shmem mappings we know that all - * swapped out pages belong to the shmem object, and we can - * obtain the swap value much more efficiently. For private - * writable mappings, we might have COW pages that are - * not affected by the parent swapped out pages of the shmem - * object, so we have to distinguish them during the page walk. - * Unless we know that the shmem object (or the part mapped by - * our VMA) has no swapped out pages at all. + * CoW mappings might map anon folios that do not belong to + * shmem. Perform a less efficient page table walk in this + * situation, unless we know that the shmem object (or the + * part mapped by our VMA) has no swapped out pages at all. */ - unsigned long shmem_swapped =3D shmem_swap_usage(vma); + const unsigned long shmem_swapped =3D shmem_swap_usage(vma); + const bool is_cow =3D vma_is_cow_mapping(vma); =20 - if (!start && (!shmem_swapped || (vma->vm_flags & VM_SHARED) || - !(vma->vm_flags & VM_WRITE))) { - mss->swap +=3D shmem_swapped; - } else { + if (start || (shmem_swapped && is_cow)) ops =3D get_smaps_shmem_walk_ops(priv); - } + else + mss->swap +=3D shmem_swapped; } =20 if (!start) --=20 2.55.0.1082.g2b9226bbc0-goog From nobody Thu Sep 24 23:32:10 2026 Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C610502D7D for ; Fri, 18 Sep 2026 15:33:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.72 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789745612; cv=none; b=ci5+flQ5rx8/YX41xclLLmiKK1XtF486xRGA5/BQ2Vaw0GN7U8mfwh0JNJtZO/csSfOdkPpOrMWn11SrWjyvigI2o0sA8vILa7xU2QAN9ZmM5Sjbt0VaWR5TK7CWFI6x+04/UWy74gUc+54fKGoyxN6HZkbsssDZr5+1E71lX1s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789745612; c=relaxed/simple; bh=Kk/Av/Wahs3wr855f5dR9G/6SzogvS0HbJ/6bSoiP1g=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=lDPU2tg8RAk55G+qWbwKQMDClOBIuxtWa1jzXT+TPKSAQkIof0XE/HRZKsdf3MOG5GgWrtkEHeVub9cb7yK9WlMJKaDOAckFvGWh7WoicDKE4rGJJXxLcb31EhuDemqpvInhBOOTET5Ha8KO1Ejl+VYUj/0NvRbHb6Cy7uJ2BeQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--surenb.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=MIV7uBr+; arc=none smtp.client-ip=209.85.216.72 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--surenb.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="MIV7uBr+" Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-39af92138f9so1370900a91.0 for ; Fri, 18 Sep 2026 08:33:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1789745609; x=1790350409; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=c64grHEqWwUtUzGGsYu1Ih95rNaNVw7BlsDsBBQp/Gk=; b=MIV7uBr+mTtJaORu/r8kpHdzUd9BRkqldxLci5LktBLGOZEHGnJR92OdM6RMk1a5Em 5d+nSY7Jjj09XaBDH/E8jfni9Tu7CT4FYQ8Y6NAqkJbVpxbh3jwgcnyETfEklYJEyodF znE3pFhD0Kk86VeozNBXlqtF3MSj5x6N1I4KC0dvtwUCfxkyRBsF/aZXDscl3Mp6Zw/o xdlUpj6bMB5+P6dWOg1ncm7SVzL9R3980/pbxBASEQmFozv62K7rEBTG8nfeQKs+/kEP JPnNe9zBX3YKRj35mDvi/hrCI/AQAg+c5y8ZvDweyvk02f2FqfsNFNtKIEVvY+auk6SA o2uQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789745609; x=1790350409; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=c64grHEqWwUtUzGGsYu1Ih95rNaNVw7BlsDsBBQp/Gk=; b=coYhMXS24bsqWxtCIgdfBTAQcucWyHOHSuSHlSG0gPNpz4Jh5wWYkC5/3ThbOkDpbr LsV/WdiS2K2qYFKI85El7Tj899VmCf9u/2ix6xiOgls5NxOsFqFhRWP5h/god6aL6vlX VLvMEGXbKWuhB+YnAdXxMADhY3VTVVS4iUfGy7Ow7NnCuuC1G8xQrf6d3XlUYjUmHarF fMMYLTGELkSgzK1SCCvWXtN4DnJgTf7B7uaIf4bQvdMFgWC5sSjB3Ot9+N/eup6UpCy7 +nxGNkdKPtYxJFBmbhIHPqaB6QGwtArpE4EePAoh2aiUGDie2uPCfZgnRgcGTeCnTR76 FJ2g== X-Forwarded-Encrypted: i=1; AKwUvBxHzh4ZOuF6jKsBiEGDYtFN7/rInewW1fUxkwd1xuQ/Qu8EBraxAOi3TZJhs/K5IJ+hcH0t4uMbSjX8ox4=@vger.kernel.org X-Gm-Message-State: AFuF++mJVxdK/enh6Ti+wNKfJ/zQbvs9AgCDGpnztU2BAGQyKbRpgj3C XKmxZCJjakbO/JSFn9ubg51MbpTX3Tm15pneVgsT10GOm8F5QSmTKLWH9PWKOOauZv+vxgyMhm6 bn6vYHA== X-Received: from dlbvp1.prod.google.com ([2002:a05:7022:ff41:b0:144:d125:b235]) (user=surenb job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1fce:b0:39e:402e:accb with SMTP id 98e67ed59e1d1-39e402eaed7mr7921534a91.18.1789745609213; Fri, 18 Sep 2026 08:33:29 -0700 (PDT) Date: Fri, 18 Sep 2026 08:33:15 -0700 In-Reply-To: <20260918153318.758387-1-surenb@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260918153318.758387-1-surenb@google.com> X-Mailer: git-send-email 2.55.0.1082.g2b9226bbc0-goog Message-ID: <20260918153318.758387-5-surenb@google.com> Subject: [PATCH v5 4/7] proc/task_mmu: remove special-casing of smap_gather_stats() start parameter From: Suren Baghdasaryan To: akpm@linux-foundation.org Cc: liam@infradead.org, ljs@kernel.org, vbabka@kernel.org, david@kernel.org, willy@infradead.org, jannh@google.com, paulmck@kernel.org, pfalcato@suse.de, xueyuan.chen21@gmail.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, surenb@google.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" smap_gather_stats() interprets its start parameter to mean vma->vm_start when it's set to 0. Eliminate this special interpretation and provide two separate functions for a partial and complete VMA walk. Since smap_gather_stats() operates within a single VMA, we can replace walk_page_vma()/walk_page_range() calls with walk_page_range_vma() which is simpler and also can be called while holding per-VMA lock. No functional change intended. Suggested by: Lorenzo Stoakes Signed-off-by: Suren Baghdasaryan Reviewed-by: Lorenzo Stoakes (ARM) Acked-by: David Hildenbrand (Arm) --- fs/proc/task_mmu.c | 52 +++++++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index f1ce15981253..8f2f302d4563 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -1250,20 +1250,26 @@ get_smaps_shmem_walk_ops(struct proc_maps_private *= priv) return &smaps_shmem_walk_vma_lock_ops; } =20 -/* - * Gather mem stats from @vma with the indicated beginning - * address @start, and keep them in @mss. +/** + * smap_gather_stats_range() - Gather mem stats from a portion of the @vma. + * @priv: proc maps private state. + * @vma: The VMA to gather stats for. + * @mss: The accumulated stats. + * @start: The address from which to start. * - * Use vm_start of @vma as the beginning address if @start is 0. + * This gathers stats for the portion of the VMA starting at the @start + * address. */ -static void smap_gather_stats(struct proc_maps_private *priv, - struct vm_area_struct *vma, - struct mem_size_stats *mss, unsigned long start) +static void smap_gather_stats_range(struct proc_maps_private *priv, + struct vm_area_struct *vma, + struct mem_size_stats *mss, + unsigned long start) { const struct mm_walk_ops *ops =3D get_smaps_walk_ops(priv); + const bool is_partial =3D start > vma->vm_start; =20 /* Invalid start */ - if (start >=3D vma->vm_end) + if (start < vma->vm_start || start >=3D vma->vm_end) return; =20 if (vma =3D=3D get_gate_vma(priv->lock_ctx.mm)) @@ -1282,20 +1288,31 @@ static void smap_gather_stats(struct proc_maps_priv= ate *priv, const unsigned long shmem_swapped =3D shmem_swap_usage(vma); const bool is_cow =3D vma_is_cow_mapping(vma); =20 - if (start || (shmem_swapped && is_cow)) + if (is_partial || (shmem_swapped && is_cow)) ops =3D get_smaps_shmem_walk_ops(priv); else mss->swap +=3D shmem_swapped; } =20 - if (!start) - walk_page_vma(vma, ops, mss); - else - walk_page_range(vma->vm_mm, start, vma->vm_end, ops, mss); + walk_page_range_vma(vma, start, vma->vm_end, ops, mss); =20 reacquire_rcu(priv); } =20 +/** + * smap_gather_stats() - Gather mem stats from the entire @vma. + * @priv: proc maps private state. + * @vma: The VMA to gather stats for. + * @mss: The accumulated stats. + * + * This gathers stats for the whole of the VMA. + */ +static void smap_gather_stats(struct proc_maps_private *priv, + struct vm_area_struct *vma, struct mem_size_stats *mss) +{ + smap_gather_stats_range(priv, vma, mss, vma->vm_start); +} + #define SEQ_PUT_DEC(str, val) \ seq_put_decimal_ull_width(m, str, (val) >> 10, 8) =20 @@ -1346,7 +1363,7 @@ static int show_smap(struct seq_file *m, void *v) struct vm_area_struct *vma =3D v; struct mem_size_stats mss =3D {}; =20 - smap_gather_stats(priv, vma, &mss, 0); + smap_gather_stats(priv, vma, &mss); =20 show_map_vma(m, vma); =20 @@ -1399,7 +1416,7 @@ static int show_smaps_rollup(struct seq_file *m, void= *v) =20 vma_start =3D vma->vm_start; do { - smap_gather_stats(priv, vma, &mss, 0); + smap_gather_stats(priv, vma, &mss); last_vma_end =3D vma->vm_end; =20 /* @@ -1458,14 +1475,15 @@ static int show_smaps_rollup(struct seq_file *m, vo= id *v) =20 /* Case 1 and 2 above */ if (vma->vm_start >=3D last_vma_end) { - smap_gather_stats(priv, vma, &mss, 0); + smap_gather_stats(priv, vma, &mss); last_vma_end =3D vma->vm_end; continue; } =20 /* Case 4 above */ if (vma->vm_end > last_vma_end) { - smap_gather_stats(priv, vma, &mss, last_vma_end); + smap_gather_stats_range(priv, vma, &mss, + last_vma_end); last_vma_end =3D vma->vm_end; } } --=20 2.55.0.1082.g2b9226bbc0-goog From nobody Thu Sep 24 23:32:10 2026 Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8772D50390F for ; Fri, 18 Sep 2026 15:33:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.70 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789745615; cv=none; b=F3LElOsJR4O7JbcsCfvnchYQmvhEUl4lHB4TRGkMSc2Pviev8r0tSWarTaTuPrJ99kT4m5tD8souyrutgIxpDYBrExaNgeFBMJfgKxzahguNrkzgFNmez9zyWma8IJOq60D7SO5Hzr12bFefPMdQLjkGQJJN90pwwGDFjoieHj4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789745615; c=relaxed/simple; bh=oZ/fvi1k3DBUjyI5jwjRUhQencv56NnJtg/3XEZIHys=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=YWAOx5hzBRI6aOYiSJV29TxyEN3iaQTGnkxUskLtVkHZu+uqzW3gWGkhFIh0/UERuB82BQ+qMXI/47OUsL+2dhyu3ikGvggDFl6VmHl0vhvzu4nuygvGbcLTehkkXTC+hYNecZhquz4az9/vlMMkyyxCs1PvEe5/D5BqmL0BCag= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--surenb.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=n9i36t6K; arc=none smtp.client-ip=209.85.216.70 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--surenb.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="n9i36t6K" Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-39deda201bcso88437a91.2 for ; Fri, 18 Sep 2026 08:33:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1789745611; x=1790350411; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=lv14f2Ly5jvNlP8xqLAumR3AMqosSrAJIJiLUsY0qSI=; b=n9i36t6KbS4CJ5stYwzw0HkXIZXHjaA0Hh6ILrDQEiEejy7c3Xqs4QtWyPFtTgvRlk zhsgc/xy/hRSiedZKRgJ0wMW1xsQqXRWruHnvNcqboawv93danlDRXGjpUNEwbcDdrgX u9LjewKBF5OTu3fD28sRMUkNht2k+Y0R663hIvz8WbpyrkF72t4LH+MriGEidFOe+5Yf jRhm6DaSMjESHyqp1li6ZJLPKf5yPMIwAHqHXJjUwvXb9UBkXmX265GzOG/2RKJN8K9v JASbdVMjdCoiC7FpR4jqFxX+l6iYxiTPqyep37wB6w23hNxyvtDui/fKeGJy++r5amaO EIxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789745611; x=1790350411; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=lv14f2Ly5jvNlP8xqLAumR3AMqosSrAJIJiLUsY0qSI=; b=XxwbNzSsdrXvG5DbPxlwnGml+RR5YO7UpJP4iNQOeSm5gw1zJDNAWYDWXikFBLFhoQ O/BKQwA8ZVkviRl/PPumTwRsvgFbAorQauqH4Rua/QxYqnOqPIQZuHWHfCuE18T48r6X 3/Kctxu63pcmkM1x/GR4zlWGtT9hx+DQk3VTKhSDqOjvJ2qJJHr7NvYq4qhZaqtXZRzS wNjt2Q0hxyRuyWH/PnXJNbcAx0VCS3izY7FshGYSBjtb+tsNcww/ils2qIXXZ3+p+hpp VqRgA2UroRVMAxKUNFTZ68Zi/8GNFi2u06ix2ouBdsuCQSOXSfEZtNCT02AQSnrcWXTl QsWg== X-Forwarded-Encrypted: i=1; AKwUvBw/SkMWPC2lSprQupJ7vS9QY1X2Cu9RXVSUHOPw0+VaQosqJurMDr0Y8VsXk9qLFa7xUkHuVVAX+8WKw0E=@vger.kernel.org X-Gm-Message-State: AFuF++moCASPZSWvKrL29h0huCx6cJDitn40TUnknDP3tgi75Sw00s/K ow4TTYOnOUPjACNVPckWcL/mFFbiahicloJILJ9Bdk7Qh0+FqkVhZEyDCNkXF/jivUWoNWKBMWT 23CuRwQ== X-Received: from dlbcy8.prod.google.com ([2002:a05:7022:b88:b0:143:7b76:ee9c]) (user=surenb job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90a:d410:b0:39d:f024:c7e2 with SMTP id 98e67ed59e1d1-39e54cb099bmr6569591a91.4.1789745611342; Fri, 18 Sep 2026 08:33:31 -0700 (PDT) Date: Fri, 18 Sep 2026 08:33:16 -0700 In-Reply-To: <20260918153318.758387-1-surenb@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260918153318.758387-1-surenb@google.com> X-Mailer: git-send-email 2.55.0.1082.g2b9226bbc0-goog Message-ID: <20260918153318.758387-6-surenb@google.com> Subject: [PATCH v5 5/7] proc/task_mmu: change proc_get_vma() to stop returning gate VMA at the end From: Suren Baghdasaryan To: akpm@linux-foundation.org Cc: liam@infradead.org, ljs@kernel.org, vbabka@kernel.org, david@kernel.org, willy@infradead.org, jannh@google.com, paulmck@kernel.org, pfalcato@suse.de, xueyuan.chen21@gmail.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, surenb@google.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" proc_get_vma() returning gate VMA at the end is desirable for the its current m_start/m_next callers, as they need to report a gate VMA at the end of the address space. This behavior is very specific to these callers and makes proc_get_vma() hard to use for other purposes. Move this usage-specific behavior into the callers themselves so that proc_get_vma() returns either a valid VMA, an error or a NULL when no more VMAs are available. This makes it more generic, simpler and usable in the later patches. Signed-off-by: Suren Baghdasaryan Reviewed-by: Lorenzo Stoakes (ARM) Acked-by: David Hildenbrand (Arm) --- fs/proc/task_mmu.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 8f2f302d4563..2c90b91d271b 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -240,9 +240,6 @@ static struct vm_area_struct *proc_get_vma(struct seq_f= ile *m, loff_t *ppos) * found the extended vma with the same vm_start. */ *ppos =3D vma->vm_end; - } else { - *ppos =3D SENTINEL_VMA_GATE; - vma =3D get_gate_vma(priv->lock_ctx.mm); } =20 return vma; @@ -252,6 +249,7 @@ static void *m_start(struct seq_file *m, loff_t *ppos) { struct proc_maps_private *priv =3D m->private; struct proc_maps_locking_ctx *lock_ctx; + struct vm_area_struct *vma; loff_t last_addr =3D *ppos; struct mm_struct *mm; =20 @@ -281,19 +279,39 @@ static void *m_start(struct seq_file *m, loff_t *ppos) *ppos =3D last_addr =3D priv->last_pos; vma_iter_init(&priv->iter, mm, (unsigned long)last_addr); hold_task_mempolicy(priv); + /* + * If seq_file had to flush its collected data right after m_next() set + * position to SENTINEL_VMA_GATE, m_start() will get that sentinel and + * should return gate_vma without calling proc_get_vma(). + */ if (last_addr =3D=3D SENTINEL_VMA_GATE) return get_gate_vma(mm); =20 - return proc_get_vma(m, ppos); + vma =3D proc_get_vma(m, ppos); + if (vma) + return vma; + + /* Return gate VMA at the end */ + *ppos =3D SENTINEL_VMA_GATE; + return get_gate_vma(mm); } =20 static void *m_next(struct seq_file *m, void *v, loff_t *ppos) { + struct proc_maps_private *priv =3D m->private; + struct vm_area_struct *vma; + if (*ppos =3D=3D SENTINEL_VMA_GATE) { *ppos =3D SENTINEL_VMA_END; return NULL; } - return proc_get_vma(m, ppos); + vma =3D proc_get_vma(m, ppos); + if (vma) + return vma; + + /* Return gate VMA at the end */ + *ppos =3D SENTINEL_VMA_GATE; + return get_gate_vma(priv->lock_ctx.mm); } =20 static void m_stop(struct seq_file *m, void *v) --=20 2.55.0.1082.g2b9226bbc0-goog From nobody Thu Sep 24 23:32:10 2026 Received: from mail-pj1-f69.google.com (mail-pj1-f69.google.com [209.85.216.69]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 812B8509EE2 for ; Fri, 18 Sep 2026 15:33:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.69 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789745616; cv=none; b=utcNdQnKpEFt55ec/F3oUSbRU7g0tqKkYFsXp/+JUIbJdGaJqWrMqMnatpwrde19IM4N1Ha/y6Q1vusj7bHMZ1uQlVbpBsNHQYy5e+wnWcI/e5Gvwi2rtw+nYxiVECNhn7Sha2xo21IImBlB9Q3/phqtO71BzRonmiIlme9uvzI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789745616; c=relaxed/simple; bh=dIYyxZgsj031zKhH/ITSJ091DyX11qiCrTkYrVwSexI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Y1DU664KmuoYaAybf4Mltu5A4QvDpTPhJcyIsuB75+n8qElCOeVfEtnaAqEl0Fuyc+dmTwIbBrGbqpEFu0tyTR2PMyHrAnYcR5f8uO4f8pzzbtw/eUW3V3gR8TWAOYYF/IxPrCYfjoZEKzqYvj37ptpOcZ5VAHti7tyCDWbxtoQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--surenb.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=iP8n9ppE; arc=none smtp.client-ip=209.85.216.69 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--surenb.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="iP8n9ppE" Received: by mail-pj1-f69.google.com with SMTP id 98e67ed59e1d1-39e087a17dfso1686573a91.3 for ; Fri, 18 Sep 2026 08:33:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1789745613; x=1790350413; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=GezTlyn6XHQWhl94S93tdh+KQwNw767Wgp9o9ICsVJ4=; b=iP8n9ppE6S7cGKRM9cCHEAVHGQNQ2irz2n28H6OtfxbvyL6XGBMMcZ50yODIEJLzNE R9DmkCk2EJQFCqt263ZtlNSapA9U39dUrjDNBEGdndNM5wHG0JbQxGdhdddwFfxTS7f4 xwcZ6OXJkk8eBr5VnEKhhcB9yjjC4QnpZh3WZMp8krwYgH4R+F43oq0muMiCXQs8HA+N 6SCG2Y8X6tgnjEjlW/4QnEICWuVdmNbaCobqbW1uxijBw526CWvWtpkzJ7RooSe1mGln x2S77vcqDkbaxgL+eBY/titiCdTvNorLM/lJ5U3VXtsAa1x4fBnv1070jMTVPwYitFX+ REyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789745613; x=1790350413; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=GezTlyn6XHQWhl94S93tdh+KQwNw767Wgp9o9ICsVJ4=; b=w79K1Vlc/VrmPM+WqmEHpeF9U9x1UKFpwf/YADdJbei3LRY0BriCB3Z8/rOgdBxPaC /YAJq4xn/hznv2SzxYUvppCak5LTIe/8nbmb4fo5TQt/+fDYmuDVCaqh0o6YqEiMR6Q/ S9td0gyyeS9xR+co5T6mYBVU+icWPlwFMaOL7V/dsmCpPQDh1e2gFS/+imrL4t9th4/U nlvzPQp5WwwzqYJhygert/4LSgtE2wI1EshRyRAckKiiIHqD34VaYjulsnzoCBP2qNEB FUbLA1ne9rgyIM77VN9qLMBaVJoicd5jB2mV9dQQxN3ccqMzzmUYtYwC0KP8EuN7MYK8 r9MQ== X-Forwarded-Encrypted: i=1; AKwUvBxWaedBCQdN6LaVyjJM6Ip+MrU6RROrEWS2x2ShGUdt1ewpxV/tu/60xxkQFHmAnMj++ud6AdQhCEwZbSY=@vger.kernel.org X-Gm-Message-State: AFuF++mVMa+9AA9t4DtivaPIJwga5P/my8LpJKTs05eqblUyd70yHYun GU+DCw3gaV9R0sIGSR1JDF7HJkR8eSnCqcGahA+jT2bAndTFFFStk+6Z60Exd16kyeOYfDEZFvY mx9f2dg== X-Received: from dldyr17-n1.prod.google.com ([2002:a05:701b:4511:10b0:143:7976:20e7]) (user=surenb job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:4d91:b0:39e:6c68:c782 with SMTP id 98e67ed59e1d1-39e6c68c9f1mr34046a91.56.1789745613433; Fri, 18 Sep 2026 08:33:33 -0700 (PDT) Date: Fri, 18 Sep 2026 08:33:17 -0700 In-Reply-To: <20260918153318.758387-1-surenb@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260918153318.758387-1-surenb@google.com> X-Mailer: git-send-email 2.55.0.1082.g2b9226bbc0-goog Message-ID: <20260918153318.758387-7-surenb@google.com> Subject: [PATCH v5 6/7] proc/task_mmu: read proc/pid/smaps_rollup under per-vma lock From: Suren Baghdasaryan To: akpm@linux-foundation.org Cc: liam@infradead.org, ljs@kernel.org, vbabka@kernel.org, david@kernel.org, willy@infradead.org, jannh@google.com, paulmck@kernel.org, pfalcato@suse.de, xueyuan.chen21@gmail.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, surenb@google.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" proc/pid/smaps_rollup can be read using the combination of RCU and VMA read locks, similar to proc/pid/{maps|smaps|numa_maps}. RCU is required to safely traverse the VMA tree and VMA lock stabilizes the VMA being processed and the pagetable walk. Note that we have to keep the logic to drop mmap_lock on contention because even when using per-VMA locks we might have to fall back to holding the mmap_lock. Running Paul's contention benchmark [1] shows considerable improvement both in median and in the worst case latencies: Execution command: run-proc-vs-map.sh --nsamples 20 --rawdata -- \ --busyduration 2 --procfile smaps_rollup Baseline: Median Minimum Maximum 0.174 0.161 2.553 0.174 0.164 2.663 0.174 0.165 2.664 0.174 0.166 2.679 0.174 0.167 2.691 0.174 0.168 2.704 0.174 0.169 2.729 0.174 0.172 2.741 0.174 0.174 2.745 0.174 0.174 2.755 0.174 0.175 2.790 0.174 0.177 2.809 0.174 0.179 3.096 0.174 0.183 3.144 0.174 0.184 3.158 0.174 0.185 3.175 0.174 0.185 4.568 0.174 0.198 4.821 0.174 0.214 5.143 0.174 0.251 5.220 Patched: Median Minimum Maximum 0.007 0.007 1.952 0.007 0.007 1.955 0.007 0.007 1.955 0.007 0.007 1.955 0.007 0.007 1.957 0.007 0.007 1.969 0.007 0.007 2.065 0.007 0.007 2.075 0.007 0.007 2.146 0.007 0.007 2.195 0.007 0.007 2.223 0.007 0.007 2.259 0.007 0.007 2.488 0.007 0.007 2.562 0.007 0.007 2.599 0.007 0.007 2.697 0.007 0.007 3.030 0.007 0.007 3.075 0.007 0.007 3.145 0.007 0.007 3.225 Remove now unused lock_ctx_mm() and move unlock_ctx_vma() next to unlock_ctx_mm() as they are logically related. Remove a long comment about 4 cases that we handle when dropping the mmap lock in the middle of VMA walk due to contention. The first 3 cases explained there are handled naturally and only case 4 needs to be handled in a special way, which is done in smap_gather_stats() by gathering stats from the portion of the VMA that has not yet been processed. For posterity, moving this comment here: After dropping the lock, there are four cases to consider. See the following example for explanation. +------+------+-----------+ | VMA1 | VMA2 | VMA3 | +------+------+-----------+ | | | | 4k 8k 16k 400k Suppose we drop the lock after reading VMA2 due to contention, then we get: last_vma_end =3D 16k 1) VMA2 is freed, but VMA3 exists: vma_next(vmi) will return VMA3. In this case, just continue from VMA3. 2) VMA2 still exists: vma_next(vmi) will return VMA3. In this case, just continue from VMA3. 3) No more VMAs can be found: vma_next(vmi) will return NULL. No more things to do, just break. 4) (last_vma_end - 1) is the middle of a vma (VMA'): vma_next(vmi) will return VMA' whose range contains last_vma_end. Iterate VMA' from last_vma_end. [1] https://github.com/paulmckrcu/proc-mmap_sem-test Signed-off-by: Suren Baghdasaryan Reviewed-by: Lorenzo Stoakes (ARM) --- fs/proc/task_mmu.c | 159 ++++++++++++++++++--------------------------- 1 file changed, 63 insertions(+), 96 deletions(-) diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 2c90b91d271b..c0d228036b8a 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -130,30 +130,12 @@ static void release_task_mempolicy(struct proc_maps_p= rivate *priv) } #endif =20 -#ifdef CONFIG_PROC_PAGE_MONITOR -static int lock_ctx_mm(struct proc_maps_locking_ctx *lock_ctx) -{ - int ret =3D mmap_read_lock_killable(lock_ctx->mm); - - if (!ret) - lock_ctx->mmap_locked =3D true; - - return ret; -} -#endif - static void unlock_ctx_mm(struct proc_maps_locking_ctx *lock_ctx) { mmap_read_unlock(lock_ctx->mm); lock_ctx->mmap_locked =3D false; } =20 -static void reset_lock_ctx(struct proc_maps_locking_ctx *lock_ctx) -{ - lock_ctx->locked_vma =3D NULL; - lock_ctx->mmap_locked =3D false; -} - static void unlock_ctx_vma(struct proc_maps_locking_ctx *lock_ctx) { if (lock_ctx->locked_vma) { @@ -162,6 +144,12 @@ static void unlock_ctx_vma(struct proc_maps_locking_ct= x *lock_ctx) } } =20 +static void reset_lock_ctx(struct proc_maps_locking_ctx *lock_ctx) +{ + lock_ctx->locked_vma =3D NULL; + lock_ctx->mmap_locked =3D false; +} + static struct vm_area_struct *get_next_vma(struct proc_maps_private *priv, loff_t last_pos) { @@ -1406,12 +1394,14 @@ static int show_smap(struct seq_file *m, void *v) static int show_smaps_rollup(struct seq_file *m, void *v) { struct proc_maps_private *priv =3D m->private; + struct proc_maps_locking_ctx *lock_ctx =3D &priv->lock_ctx; + struct mm_struct *mm =3D lock_ctx->mm; struct mem_size_stats mss =3D {}; - struct mm_struct *mm =3D priv->lock_ctx.mm; + unsigned long last_vma_end =3D 0; + unsigned long vma_start =3D 0; struct vm_area_struct *vma; - unsigned long vma_start =3D 0, last_vma_end =3D 0; + loff_t pos =3D 0; int ret =3D 0; - VMA_ITERATOR(vmi, mm, 0); =20 priv->task =3D get_proc_task(priv->inode); if (!priv->task) @@ -1422,90 +1412,63 @@ static int show_smaps_rollup(struct seq_file *m, vo= id *v) goto out_put_task; } =20 - ret =3D lock_ctx_mm(&priv->lock_ctx); - if (ret) - goto out_put_mm; - hold_task_mempolicy(priv); - vma =3D vma_next(&vmi); + rcu_read_lock(); + reset_lock_ctx(lock_ctx); =20 + vma_iter_init(&priv->iter, mm, 0); + vma =3D proc_get_vma(m, &pos); if (unlikely(!vma)) goto empty_set; =20 - vma_start =3D vma->vm_start; - do { - smap_gather_stats(priv, vma, &mss); + if (!IS_ERR(vma)) + vma_start =3D vma->vm_start; + + while (vma) { + if (IS_ERR(vma)) { + ret =3D PTR_ERR(vma); + goto out_unlock; + } + + if (vma->vm_start < last_vma_end) { + /* + * After retaking the lock, already reported VMA grew + * or got merged with the next one and we found it + * again. Gather stats for the remaining portion by + * starting at last_vma_end. + */ + smap_gather_stats_range(priv, vma, &mss, last_vma_end); + } else { + /* Found next unreported VMA, start from its beginning */ + smap_gather_stats(priv, vma, &mss); + } last_vma_end =3D vma->vm_end; =20 /* - * Release mmap_lock temporarily if someone wants to - * access it for write request. + * If the VMA lock is not taken, we hold the often contended + * mmap lock. This can happen if we had to fall back to the + * mmap lock. + * + * To relieve pressure, check if it is indeed contended, then + * temporarily release it. */ - if (mmap_lock_is_contended(mm)) { - vma_iter_invalidate(&vmi); - unlock_ctx_mm(&priv->lock_ctx); - ret =3D lock_ctx_mm(&priv->lock_ctx); - if (ret) { - release_task_mempolicy(priv); - goto out_put_mm; - } - + if (lock_ctx->mmap_locked && + mmap_lock_is_contended(lock_ctx->mm)) { + unlock_ctx_mm(lock_ctx); /* - * After dropping the lock, there are four cases to - * consider. See the following example for explanation. - * - * +------+------+-----------+ - * | VMA1 | VMA2 | VMA3 | - * +------+------+-----------+ - * | | | | - * 4k 8k 16k 400k - * - * Suppose we drop the lock after reading VMA2 due to - * contention, then we get: - * - * last_vma_end =3D 16k - * - * 1) VMA2 is freed, but VMA3 exists: - * - * vma_next(vmi) will return VMA3. - * In this case, just continue from VMA3. - * - * 2) VMA2 still exists: - * - * vma_next(vmi) will return VMA3. - * In this case, just continue from VMA3. - * - * 3) No more VMAs can be found: - * - * vma_next(vmi) will return NULL. - * No more things to do, just break. - * - * 4) (last_vma_end - 1) is the middle of a vma (VMA'): - * - * vma_next(vmi) will return VMA' whose range - * contains last_vma_end. - * Iterate VMA' from last_vma_end. + * Even though we previously fell back to mmap lock, + * we try taking VMA lock for the next VMA, since it + * might not be under modification. In the worst case + * we will fall back to mmap lock again. */ - vma =3D vma_next(&vmi); - /* Case 3 above */ - if (!vma) - break; - - /* Case 1 and 2 above */ - if (vma->vm_start >=3D last_vma_end) { - smap_gather_stats(priv, vma, &mss); - last_vma_end =3D vma->vm_end; - continue; - } - - /* Case 4 above */ - if (vma->vm_end > last_vma_end) { - smap_gather_stats_range(priv, vma, &mss, - last_vma_end); - last_vma_end =3D vma->vm_end; - } + rcu_read_lock(); + reset_lock_ctx(lock_ctx); + /* Resume from the last position. */ + pos =3D last_vma_end; + vma_iter_init(&priv->iter, mm, pos); } - } for_each_vma(vmi, vma); + vma =3D proc_get_vma(m, &pos); + } =20 empty_set: show_vma_header_prefix(m, vma_start, last_vma_end, 0, 0, 0, 0); @@ -1514,10 +1477,14 @@ static int show_smaps_rollup(struct seq_file *m, vo= id *v) =20 __show_smap(m, &mss, true); =20 +out_unlock: + if (lock_ctx->mmap_locked) { + unlock_ctx_mm(lock_ctx); + } else { + unlock_ctx_vma(lock_ctx); + rcu_read_unlock(); + } release_task_mempolicy(priv); - unlock_ctx_mm(&priv->lock_ctx); - -out_put_mm: mmput(mm); out_put_task: put_task_struct(priv->task); --=20 2.55.0.1082.g2b9226bbc0-goog From nobody Thu Sep 24 23:32:10 2026 Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 91B2050AC0D for ; Fri, 18 Sep 2026 15:33:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789745618; cv=none; b=keBbrHwQvZ0fBHjrhCMHLmJDJ8fW9yc8+96v8xus3EZVBQTiuF8qOLPYhWCaOAIpgWnroomQDFCfXPbDQc+rP66P6v7w+g7BFLNhpEUbN9zcHEwPyXYLQkgY+2NQnWjOCsEE10sqJp4zF3O1Ooqc664HIWWXtiYtMnNVA4C1uIw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789745618; c=relaxed/simple; bh=KMg7LIcwjTIHXZlfRPQEJm7YMnNI09tGnzRfT2CuQ6w=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=JHrWwfZOcmgUPAPmdQQjnPqB+ZCONJ/NRDo1ll2b7CpbkfVfUNBMn7mefmYWy9QCFOvvfffNKyHWd2dLNj+50M2/Rm7n3vpavq7slYWBqUOcRRYjTel5F/NpADi4w9cgcJYibzgAhOimKPDel0LwxPgaxUzcU+DxJN4GM9V6jas= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--surenb.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=PinwlIup; arc=none smtp.client-ip=209.85.214.200 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--surenb.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="PinwlIup" Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2d6fed0652bso10532585ad.2 for ; Fri, 18 Sep 2026 08:33:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1789745616; x=1790350416; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=qSlM5tp89ADGL7d7hsn2qc0Ifj+pabEAxR9BGEjE7ls=; b=PinwlIup6CFTiUZHZwiJFAtfGPLE7P9OMfTSQInQ9nUak7WMTVNLM/FgUMt6fVodYm MlArm5s+mjyP+TMtwbEa6bJSpl1dN4amNykDRKP9G74g0p/0Q5VHFaFTAEJjylkll89H z/j4+pT/Tgt27Si6VNwOyeg6noSJ/i4CzHHiQx8D74qs7UlP++OIN/0Qeu3le7saJ3Gc fN/Fh2x4drqBhmguPqZv1C+zldQqtMU8a/yXUDBw6hFMWjh55/JBOo1Yf/S6fFAMReaz CQliLmTWmw0CL1hmzn3NJ8PEahy7P2itkMBFAgIHuNyNV84yvwO6s8ACUbtjhEJoO7dh t1Ug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789745616; x=1790350416; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=qSlM5tp89ADGL7d7hsn2qc0Ifj+pabEAxR9BGEjE7ls=; b=V4X5/w54XA7AXgq36QxCFZeROvhfNO6Rb8tQP6MnUpwtnqeWtPewJXPWGRH85bDdJF G9is7NqVHzIV01KhyGAgU6YsCMA6e2u/QlVfNRrsXHRnlvQnJ7tH5SNM9JR2IQGg6QPp 4CeF9tiwe98royvOLr0io0DNuRfRtXaa9RMcNqlyCBM3iNztDEyWjkaqLDa/4lXOdKt/ XgqcBinAsdM/sfnaXaQvl7WTmM/aLTW4PjHyrRUvbSnVtRyDjkq9mggI6JWDCWuiq9Bf p/gj/uVcyFIicjhJAk5hmlWQ6wKd5ZezPpeR3YeVxBxNHXcQY5UITgY0DsNIjvhRT9XX il7A== X-Forwarded-Encrypted: i=1; AKwUvBy2HJh5EXKcr7Gx2Z41XCB33P3vm+RhTWifLo1HVy6PzCrHAheWcjNr2MWdIoscFNPue1ikIRGrYUyfWyU=@vger.kernel.org X-Gm-Message-State: AFuF++nCbe1SFRNhfKx7h7zuNeV3Thd1FlJZ4PrwfLFbUwPBXWapAUTa 2Karu1K9e/G2DOQ1BjXe/jjGM9VFNvsTFqp85GwUKLLWi6v0sA5E7/dRCTBVqJmsDw8qjB6HLkV SBcU/YQ== X-Received: from plly11.prod.google.com ([2002:a17:902:7c8b:b0:2dd:c0fa:93f7]) (user=surenb job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2ac4:b0:2dd:c0a5:6634 with SMTP id d9443c01a7336-2ddc0a5674fmr2432485ad.15.1789745615483; Fri, 18 Sep 2026 08:33:35 -0700 (PDT) Date: Fri, 18 Sep 2026 08:33:18 -0700 In-Reply-To: <20260918153318.758387-1-surenb@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260918153318.758387-1-surenb@google.com> X-Mailer: git-send-email 2.55.0.1082.g2b9226bbc0-goog Message-ID: <20260918153318.758387-8-surenb@google.com> Subject: [PATCH v5 7/7] selftests/proc: add /proc/pid/smaps_rollup tearing tests From: Suren Baghdasaryan To: akpm@linux-foundation.org Cc: liam@infradead.org, ljs@kernel.org, vbabka@kernel.org, david@kernel.org, willy@infradead.org, jannh@google.com, paulmck@kernel.org, pfalcato@suse.de, xueyuan.chen21@gmail.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, surenb@google.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" During tearing tests, smaps_rollup Pss* metrics should stay constant. Extend /proc/pid/smaps tearing tests to also check for smaps_rollup consistency. Signed-off-by: Suren Baghdasaryan Acked-by: Lorenzo Stoakes (ARM) --- tools/testing/selftests/proc/proc-maps-race.c | 186 +++++++++++++++++- 1 file changed, 181 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/proc/proc-maps-race.c b/tools/testing/= selftests/proc/proc-maps-race.c index 415eccb70468..bf4c5073f6fc 100644 --- a/tools/testing/selftests/proc/proc-maps-race.c +++ b/tools/testing/selftests/proc/proc-maps-race.c @@ -80,6 +80,61 @@ enum maps_file { =20 struct vma_modifier_info; =20 +enum smaps_rollup_stat { + Rss, + Pss, + Pss_Dirty, + Pss_Anon, + Pss_File, + Pss_Shmem, + Shared_Clean, + Shared_Dirty, + Private_Clean, + Private_Dirty, + Referenced, + Anonymous, + KSM, + LazyFree, + AnonHugePages, + ShmemPmdMapped, + FilePmdMapped, + Shared_Hugetlb, + Private_Hugetlb, + Swap, + SwapPss, + Locked, + RollupFieldCount +}; + +static const char *smaps_rollup_stat_names[RollupFieldCount] =3D { + "Rss", + "Pss", + "Pss_Dirty", + "Pss_Anon", + "Pss_File", + "Pss_Shmem", + "Shared_Clean", + "Shared_Dirty", + "Private_Clean", + "Private_Dirty", + "Referenced", + "Anonymous", + "KSM", + "LazyFree", + "AnonHugePages", + "ShmemPmdMapped", + "FilePmdMapped", + "Shared_Hugetlb", + "Private_Hugetlb", + "Swap", + "SwapPss", + "Locked", +}; + +struct smaps_rollup_stats { + unsigned long values[RollupFieldCount]; +}; + FIXTURE(proc_maps_race) { struct vma_modifier_info *mod_info; @@ -91,6 +146,7 @@ FIXTURE(proc_maps_race) enum maps_file maps_file; int shared_mem_size; int skip_pages; + int rollup_fd; int page_size; int vma_count; bool verbose; @@ -132,12 +188,12 @@ struct vma_modifier_info { void *child_mapped_addr[]; }; =20 -static bool read_page(FIXTURE_DATA(proc_maps_race) *self, +static bool read_page(FIXTURE_DATA(proc_maps_race) *self, int fd, struct page_content *page) { ssize_t bytes_read; =20 - bytes_read =3D read(self->maps_fd, page->data, self->page_size); + bytes_read =3D read(fd, page->data, self->page_size); if (bytes_read <=3D 0) return false; =20 @@ -175,7 +231,7 @@ static int locate_containing_page(FIXTURE_DATA(proc_map= s_race) *self, char *curr_pos; char *end_pos; =20 - if (!read_page(self, &self->page1)) + if (!read_page(self, self->maps_fd, &self->page1)) return -1; =20 curr_pos =3D self->page1.data; @@ -205,10 +261,11 @@ static bool read_two_pages(FIXTURE_DATA(proc_maps_rac= e) *self) return false; =20 for (int i =3D 0; i < self->skip_pages; i++) - if (!read_page(self, &self->page1)) + if (!read_page(self, self->maps_fd, &self->page1)) return false; =20 - return read_page(self, &self->page1) && read_page(self, &self->page2); + return read_page(self, self->maps_fd, &self->page1) && + read_page(self, self->maps_fd, &self->page2); } =20 static void copy_line(const char *line_start, const char *line_end, @@ -317,6 +374,61 @@ static bool read_boundary_lines(FIXTURE_DATA(proc_maps= _race) *self, &first_line->end_addr) =3D=3D 2; } =20 +static bool parse_smaps_rollup(FIXTURE_DATA(proc_maps_race) *self, + struct smaps_rollup_stats *stats) +{ + unsigned int dev_maj, dev_min, inode; + unsigned long start, end, offs; + unsigned long value; + char name[32], perm[5]; + char *curr_pos; + char *end_pos; + char *line_end; + + if (lseek(self->rollup_fd, 0, SEEK_SET) < 0) + return false; + + if (!read_page(self, self->rollup_fd, &self->page1)) + return false; + + curr_pos =3D self->page1.data; + end_pos =3D self->page1.data + self->page1.size; + + line_end =3D strchr(curr_pos, '\n'); + if (!line_end) + return false; + + if (sscanf(curr_pos, "%lx-%lx %4s %lx %u:%u %u %31s", + &start, &end, perm, &offs, &dev_maj, &dev_min, &inode, name) !=3D 8) + return false; + + if (strcmp(name, "[rollup]")) + return false; + + for (int stat =3D 0; stat < ARRAY_SIZE(smaps_rollup_stat_names); stat++) { + int len; + + curr_pos =3D line_end + 1; + if (curr_pos >=3D end_pos) + return false; + + line_end =3D strchr(curr_pos, '\n'); + if (!line_end) + return false; + + if (sscanf(curr_pos, "%31s %lu kB", name, &value) !=3D 2) + return false; + + len =3D strlen(name); + if (name[len - 1] !=3D ':' || strncmp(name, smaps_rollup_stat_names[stat= ], len - 1)) + return false; + + stats->values[stat] =3D value; + } + + return true; +} + /* Thread synchronization routines */ static void wait_for_state(struct vma_modifier_info *mod_info, enum test_s= tate state) { @@ -397,6 +509,40 @@ static bool print_boundaries_on(bool condition, const = char *title, return condition; } =20 +static void print_smaps_rollup_stats(const char *title, FIXTURE_DATA(proc_= maps_race) *self, + struct smaps_rollup_stats *stats) +{ + printf("%s", title); + for (int stat =3D 0; stat < ARRAY_SIZE(smaps_rollup_stat_names); stat++) + printf("%64s %lu kB\n", smaps_rollup_stat_names[stat], stats->values[sta= t]); +} + +static bool cmp_smaps_rollup_stat(struct smaps_rollup_stats *s1, + struct smaps_rollup_stats *s2, enum smaps_rollup_stat stat) +{ + return s1->values[stat] =3D=3D s2->values[stat]; +} + +static bool compare_smaps_rollup(FIXTURE_DATA(proc_maps_race) *self, + struct smaps_rollup_stats *expected, + struct smaps_rollup_stats *actual) +{ + /* + * Clean/dirty metrics might change but Pss-related ones + * should stay constant. + */ + if (cmp_smaps_rollup_stat(expected, actual, Pss) && + cmp_smaps_rollup_stat(expected, actual, Pss_Anon) && + cmp_smaps_rollup_stat(expected, actual, Pss_File) && + cmp_smaps_rollup_stat(expected, actual, Pss_Shmem)) + return true; + + print_smaps_rollup_stats("Expected stats:", self, expected); + print_smaps_rollup_stats("Actual stats:", self, actual); + + return false; +} + static void report_test_start(const char *name, bool verbose) { if (verbose) @@ -572,6 +718,7 @@ FIXTURE_SETUP(proc_maps_race) unsigned long first_map_addr; unsigned long last_map_addr; unsigned long duration_sec; + char rollup_fname[32]; char fname[32]; =20 self->page_size =3D (unsigned long)sysconf(_SC_PAGESIZE); @@ -649,6 +796,9 @@ FIXTURE_SETUP(proc_maps_race) break; case SMAPS: sprintf(fname, "/proc/%d/smaps", self->pid); + sprintf(rollup_fname, "/proc/%d/smaps_rollup", self->pid); + self->rollup_fd =3D open(rollup_fname, O_RDONLY); + ASSERT_NE(self->rollup_fd, -1); break; default: ksft_exit_fail(); @@ -711,6 +861,8 @@ FIXTURE_TEARDOWN(proc_maps_race) for (int i =3D 0; i < self->vma_count; i++) munmap(self->mod_info->child_mapped_addr[i], self->page_size); close(self->maps_fd); + if (self->maps_file =3D=3D SMAPS) + close(self->rollup_fd); waitpid(self->pid, &status, 0); munmap(self->mod_info, self->shared_mem_size); } @@ -723,6 +875,7 @@ TEST_F(proc_maps_race, test_maps_tearing_from_split) struct line_content split_first_line; struct line_content restored_last_line; struct line_content restored_first_line; + struct smaps_rollup_stats orig_stats; =20 wait_for_state(mod_info, SETUP_READY); =20 @@ -736,6 +889,8 @@ TEST_F(proc_maps_race, test_maps_tearing_from_split) report_test_start("Tearing from split", self->verbose); ASSERT_TRUE(capture_mod_pattern(self, &split_last_line, &split_first_line, &restored_last_line, &restored_first_line)); + if (self->maps_file =3D=3D SMAPS) + ASSERT_TRUE(parse_smaps_rollup(self, &orig_stats)); =20 /* Now start concurrent modifications for self->duration_sec */ signal_state(mod_info, TEST_READY); @@ -799,6 +954,11 @@ TEST_F(proc_maps_race, test_maps_tearing_from_split) vma_end =3D=3D self->last_line.end_addr) || (vma_start =3D=3D split_first_line.start_addr && vma_end =3D=3D split_first_line.end_addr)); + } else { + struct smaps_rollup_stats stats; + + ASSERT_TRUE(parse_smaps_rollup(self, &stats)); + ASSERT_TRUE(compare_smaps_rollup(self, &orig_stats, &stats)); } clock_gettime(CLOCK_MONOTONIC_COARSE, &end_ts); end_test_iteration(&end_ts, self->verbose); @@ -817,6 +977,7 @@ TEST_F(proc_maps_race, test_maps_tearing_from_resize) struct line_content shrunk_first_line; struct line_content restored_last_line; struct line_content restored_first_line; + struct smaps_rollup_stats orig_stats; =20 wait_for_state(mod_info, SETUP_READY); =20 @@ -830,6 +991,8 @@ TEST_F(proc_maps_race, test_maps_tearing_from_resize) report_test_start("Tearing from resize", self->verbose); ASSERT_TRUE(capture_mod_pattern(self, &shrunk_last_line, &shrunk_first_li= ne, &restored_last_line, &restored_first_line)); + if (self->maps_file =3D=3D SMAPS) + ASSERT_TRUE(parse_smaps_rollup(self, &orig_stats)); =20 /* Now start concurrent modifications for self->duration_sec */ signal_state(mod_info, TEST_READY); @@ -880,6 +1043,11 @@ TEST_F(proc_maps_race, test_maps_tearing_from_resize) ASSERT_TRUE(vma_start =3D=3D self->last_line.start_addr && (vma_end - vma_start =3D=3D self->page_size * 3 || vma_end - vma_start =3D=3D self->page_size)); + } else { + struct smaps_rollup_stats stats; + + ASSERT_TRUE(parse_smaps_rollup(self, &stats)); + ASSERT_TRUE(compare_smaps_rollup(self, &orig_stats, &stats)); } clock_gettime(CLOCK_MONOTONIC_COARSE, &end_ts); end_test_iteration(&end_ts, self->verbose); @@ -898,6 +1066,7 @@ TEST_F(proc_maps_race, test_maps_tearing_from_remap) struct line_content remapped_first_line; struct line_content restored_last_line; struct line_content restored_first_line; + struct smaps_rollup_stats orig_stats; =20 wait_for_state(mod_info, SETUP_READY); =20 @@ -911,6 +1080,8 @@ TEST_F(proc_maps_race, test_maps_tearing_from_remap) report_test_start("Tearing from remap", self->verbose); ASSERT_TRUE(capture_mod_pattern(self, &remapped_last_line, &remapped_firs= t_line, &restored_last_line, &restored_first_line)); + if (self->maps_file =3D=3D SMAPS) + ASSERT_TRUE(parse_smaps_rollup(self, &orig_stats)); =20 /* Now start concurrent modifications for self->duration_sec */ signal_state(mod_info, TEST_READY); @@ -963,6 +1134,11 @@ TEST_F(proc_maps_race, test_maps_tearing_from_remap) vma_end - vma_start =3D=3D self->page_size * 3) || (vma_start =3D=3D self->last_line.start_addr + self->page_size && vma_end - vma_start =3D=3D self->page_size)); + } else { + struct smaps_rollup_stats stats; + + ASSERT_TRUE(parse_smaps_rollup(self, &stats)); + ASSERT_TRUE(compare_smaps_rollup(self, &orig_stats, &stats)); } clock_gettime(CLOCK_MONOTONIC_COARSE, &end_ts); end_test_iteration(&end_ts, self->verbose); --=20 2.55.0.1082.g2b9226bbc0-goog