From nobody Fri Jun 19 07:45:48 2026 Received: from mail-dy1-f202.google.com (mail-dy1-f202.google.com [74.125.82.202]) (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 1C5B02E11B9 for ; Sun, 26 Apr 2026 06:27:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777184846; cv=none; b=CIoBI1mmMHJDKfG3BekvLjqPUsNeXKWxkIGMMCWdOd8Dol2k1IzLLDKendisxZsnyrpnqTJU/SkOIBBVHzhj35R3j6YZzrhCKpbXUGOHpPERXRGDWcZ6jH7sMo4dnJDMnzNpmia0gppI9nV+3KZADoLZiWkIq2DRW/ey4sHs6vQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777184846; c=relaxed/simple; bh=+BbKZRz1S7LJnqETourImBZXzgj3GdUQlQzX+CvpTN8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=A5ELYGdwIp0fX2I9SCl+xOf5nqYpUx4s1wiQWSHKQS4pEOuqkVmeOfx8cbwwp9KJbCmVElRAsyCbvSzkcjsgMe5inaZViRGa6f5EXwX0AXVlTU4wGnDbqG+A/vSKqrfJw0ukBr8XFwwKn017LtV0Rmma7ZJGaJr865Y9mQFkUiI= 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=F7m2oF64; arc=none smtp.client-ip=74.125.82.202 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="F7m2oF64" Received: by mail-dy1-f202.google.com with SMTP id 5a478bee46e88-2eaf70f3b5fso886624eec.0 for ; Sat, 25 Apr 2026 23:27:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1777184844; x=1777789644; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=BL+hMAWdT+RqZveIZy5/Nl5gkg1RzorHCaohLNV+HgQ=; b=F7m2oF64HnDLURWvEHr3JP5APOEklJHUJr3sBHI/hOH7QP8ooiLwQYNLVggzuUGkfr qUn1+NGw0qXHIbLAzvbXAbxdzhFupjg/gidhbSCYgvAr2Dxl96aME7KNhFmD9pDn30pI GcRWW8eI3I+roMrf4yHHEX9wsaTAH49o9Cih/YRHVgn2/78mnbzQpQQIllU9T+oxde/q 5krWQrr/hHsJMAIhn6J3lJmX8Cr4Cry5E/thRLA55c6+xW/4hhk1Gs00yEhJ52RhasQ1 9UOVxpVXGrpcMNGcrOEER7Aq1xSXWu/9sStRAj1Eu2uSwSLd2SVK4Rb8/bH8B6KGImFq xkiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777184844; x=1777789644; h=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; bh=BL+hMAWdT+RqZveIZy5/Nl5gkg1RzorHCaohLNV+HgQ=; b=fH2rnTsngvMpjaUnZHmaXpZTWKmumc/sGwOJ4DkitF853mK9TtyZtllgTbmimvaDVi AL3cWrTt4yCjFPEGa0S8jF1cLlN45ja12/SHaHGRDv1u5yXFOfa/g9l3xq+8hXvAe2Xt OREHQO2ksp7ywBClb5eID93sL1Ln04/3WwNEZVM7kQybYR/jT7WzQ8oUYGneuw5jhRGB gWljiLNiBaeW/BFza9NxfjTIsKy11laGBd4mzysH3qMb5oi3fnx98y7ZYndmpRnXF4ho 7118Ez8WYnInP4+9YKbeNhzxOLt1ej2jmhknYA8aANEI/5QdJ0cINfUfGkeUeLa/xJhR gumQ== X-Forwarded-Encrypted: i=1; AFNElJ/tmsI/gQyO64HqndPOUGDKKgizDwYA+DDXfvgg+VlXBAps9a0Vy0lkg8QR+g9gyCh69eIigHxBtqRvg2Q=@vger.kernel.org X-Gm-Message-State: AOJu0YzY2Us7Q8yzqzdLYf/rU6d5Ac+8uSb3Kn7QEfGAsRWPkPBwpEea +aaXPLGBWfGe+XzqsXf90XqJxjv72NZQ4bAeDp7GHYrEhutmtmVRY9DmvHpIga5KeHVZkyovkYU AuFQdAA== X-Received: from dlaj2.prod.google.com ([2002:a05:701b:2802:b0:12d:b3e9:aad1]) (user=surenb job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:6606:b0:128:bae0:e044 with SMTP id a92af1059eb24-12c73fc621dmr20116534c88.30.1777184843993; Sat, 25 Apr 2026 23:27:23 -0700 (PDT) Date: Sat, 25 Apr 2026 23:27:16 -0700 In-Reply-To: <20260426062718.1238437-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: <20260426062718.1238437-1-surenb@google.com> X-Mailer: git-send-email 2.54.0.545.g6539524ca2-goog Message-ID: <20260426062718.1238437-2-surenb@google.com> Subject: [PATCH v2 1/3] fs/proc/task_mmu: read proc/pid/{smaps|numa_maps} under per-vma lock From: Suren Baghdasaryan To: akpm@linux-foundation.org Cc: liam@infradead.org, ljs@kernel.org, vbabka@kernel.org, david@redhat.com, willy@infradead.org, jannh@google.com, paulmck@kernel.org, pfalcato@suse.de, shuah@kernel.org, hsukrut3@gmail.com, richard.weiyang@gmail.com, reddybalavignesh9979@gmail.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kselftest@vger.kernel.org, surenb@google.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" proc/pid/{smaps|numa_maps} can be read using the combination of RCU and VMA read locks, similar to proc/pid/maps. RCU is required to safely traverse the VMA tree and VMA lock stabilizes the VMA being processed and the pagetable walk. Signed-off-by: Suren Baghdasaryan Reviewed-by: Liam R. Howlett Reviewed-by: Lorenzo Stoakes --- fs/proc/task_mmu.c | 195 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 156 insertions(+), 39 deletions(-) diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 751b9ba160fb..1e3a15bf46f4 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -132,6 +132,22 @@ static void release_task_mempolicy(struct proc_maps_pr= ivate *priv) =20 #ifdef CONFIG_PER_VMA_LOCK =20 +static inline 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; +} + +static inline void unlock_ctx_mm(struct proc_maps_locking_ctx *lock_ctx) +{ + mmap_read_unlock(lock_ctx->mm); + lock_ctx->mmap_locked =3D false; +} + static void reset_lock_ctx(struct proc_maps_locking_ctx *lock_ctx) { lock_ctx->locked_vma =3D NULL; @@ -146,25 +162,11 @@ static void unlock_ctx_vma(struct proc_maps_locking_c= tx *lock_ctx) } } =20 -static const struct seq_operations proc_pid_maps_op; - static inline bool lock_vma_range(struct seq_file *m, struct proc_maps_locking_ctx *lock_ctx) { - /* - * smaps and numa_maps perform page table walk, therefore require - * mmap_lock but maps can be read with locking just the vma and - * walking the vma tree under rcu read protection. - */ - if (m->op !=3D &proc_pid_maps_op) { - if (mmap_read_lock_killable(lock_ctx->mm)) - return false; - - lock_ctx->mmap_locked =3D true; - } else { - rcu_read_lock(); - reset_lock_ctx(lock_ctx); - } + rcu_read_lock(); + reset_lock_ctx(lock_ctx); =20 return true; } @@ -172,7 +174,7 @@ static inline bool lock_vma_range(struct seq_file *m, static inline void unlock_vma_range(struct proc_maps_locking_ctx *lock_ctx) { if (lock_ctx->mmap_locked) { - mmap_read_unlock(lock_ctx->mm); + unlock_ctx_mm(lock_ctx); } else { unlock_ctx_vma(lock_ctx); rcu_read_unlock(); @@ -213,17 +215,45 @@ static inline bool fallback_to_mmap_lock(struct proc_= maps_private *priv, return true; } =20 +static inline void drop_rcu(struct proc_maps_private *priv) +{ + if (priv->lock_ctx.mmap_locked) + return; + + rcu_read_unlock(); +} + +static inline void reacquire_rcu(struct proc_maps_private *priv) +{ + if (priv->lock_ctx.mmap_locked) + return; + + rcu_read_lock(); + /* Reinitialize the iterator. */ + vma_iter_set(&priv->iter, priv->lock_ctx.locked_vma->vm_end); +} + #else /* CONFIG_PER_VMA_LOCK */ =20 +static inline int lock_ctx_mm(struct proc_maps_locking_ctx *lock_ctx) +{ + return mmap_read_lock_killable(lock_ctx->mm); +} + +static inline void unlock_ctx_mm(struct proc_maps_locking_ctx *lock_ctx) +{ + mmap_read_unlock(lock_ctx->mm); +} + static inline bool lock_vma_range(struct seq_file *m, struct proc_maps_locking_ctx *lock_ctx) { - return mmap_read_lock_killable(lock_ctx->mm) =3D=3D 0; + return lock_ctx_mm(lock_ctx) =3D=3D 0; } =20 static inline void unlock_vma_range(struct proc_maps_locking_ctx *lock_ctx) { - mmap_read_unlock(lock_ctx->mm); + unlock_ctx_mm(lock_ctx); } =20 static struct vm_area_struct *get_next_vma(struct proc_maps_private *priv, @@ -238,6 +268,9 @@ static inline bool fallback_to_mmap_lock(struct proc_ma= ps_private *priv, return false; } =20 +static inline void drop_rcu(struct proc_maps_private *priv) {} +static inline void reacquire_rcu(struct proc_maps_private *priv) {} + #endif /* CONFIG_PER_VMA_LOCK */ =20 static struct vm_area_struct *proc_get_vma(struct seq_file *m, loff_t *ppo= s) @@ -538,12 +571,10 @@ static int query_vma_setup(struct proc_maps_locking_c= tx *lock_ctx) =20 static void query_vma_teardown(struct proc_maps_locking_ctx *lock_ctx) { - if (lock_ctx->mmap_locked) { - mmap_read_unlock(lock_ctx->mm); - lock_ctx->mmap_locked =3D false; - } else { + if (lock_ctx->mmap_locked) + unlock_ctx_mm(lock_ctx); + else unlock_ctx_vma(lock_ctx); - } } =20 static struct vm_area_struct *query_vma_find_by_addr(struct proc_maps_lock= ing_ctx *lock_ctx, @@ -1280,21 +1311,75 @@ static const struct mm_walk_ops smaps_shmem_walk_op= s =3D { .walk_lock =3D PGWALK_RDLOCK, }; =20 +#ifdef CONFIG_PER_VMA_LOCK + +static const struct mm_walk_ops smaps_walk_vma_lock_ops =3D { + .pmd_entry =3D smaps_pte_range, + .hugetlb_entry =3D smaps_hugetlb_range, + .walk_lock =3D PGWALK_VMA_RDLOCK_VERIFY, +}; + +static const struct mm_walk_ops smaps_shmem_walk_vma_lock_ops =3D { + .pmd_entry =3D smaps_pte_range, + .hugetlb_entry =3D smaps_hugetlb_range, + .pte_hole =3D smaps_pte_hole, + .walk_lock =3D PGWALK_VMA_RDLOCK_VERIFY, +}; + +static inline const struct mm_walk_ops * +get_smaps_walk_ops(struct proc_maps_private *priv) +{ + if (priv->lock_ctx.mmap_locked) + return &smaps_walk_ops; + return &smaps_walk_vma_lock_ops; +} + +static inline const struct mm_walk_ops * +get_smaps_shmem_walk_ops(struct proc_maps_private *priv) +{ + if (priv->lock_ctx.mmap_locked) + return &smaps_shmem_walk_ops; + return &smaps_shmem_walk_vma_lock_ops; +} + +#else /* CONFIG_PER_VMA_LOCK */ + +static inline const struct mm_walk_ops * +get_smaps_walk_ops(struct proc_maps_private *priv) +{ + return &smaps_walk_ops; +} + +static inline const struct mm_walk_ops * +get_smaps_shmem_walk_ops(struct proc_maps_private *priv) +{ + return &smaps_shmem_walk_ops; +} + +#endif /* CONFIG_PER_VMA_LOCK */ + /* * Gather mem stats from @vma with the indicated beginning * address @start, and keep them in @mss. * * Use vm_start of @vma as the beginning address if @start is 0. */ -static void smap_gather_stats(struct vm_area_struct *vma, - struct mem_size_stats *mss, unsigned long start) +static void smap_gather_stats(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 &smaps_walk_ops; + const struct mm_walk_ops *ops =3D get_smaps_walk_ops(priv); =20 /* Invalid start */ if (start >=3D vma->vm_end) return; =20 + if (vma =3D=3D get_gate_vma(priv->lock_ctx.mm)) + return; + + /* Might sleep. Drop RCU read lock but keep the VMA locked. */ + drop_rcu(priv); + if (vma->vm_file && shmem_mapping(vma->vm_file->f_mapping)) { /* * For shared or readonly shmem mappings we know that all @@ -1312,15 +1397,16 @@ static void smap_gather_stats(struct vm_area_struct= *vma, !(vma->vm_flags & VM_WRITE))) { mss->swap +=3D shmem_swapped; } else { - ops =3D &smaps_shmem_walk_ops; + ops =3D get_smaps_shmem_walk_ops(priv); } } =20 - /* mmap_lock is held in m_start */ if (!start) walk_page_vma(vma, ops, mss); else walk_page_range(vma->vm_mm, start, vma->vm_end, ops, mss); + + reacquire_rcu(priv); } =20 #define SEQ_PUT_DEC(str, val) \ @@ -1369,10 +1455,11 @@ static void __show_smap(struct seq_file *m, const s= truct mem_size_stats *mss, =20 static int show_smap(struct seq_file *m, void *v) { + struct proc_maps_private *priv =3D m->private; struct vm_area_struct *vma =3D v; struct mem_size_stats mss =3D {}; =20 - smap_gather_stats(vma, &mss, 0); + smap_gather_stats(priv, vma, &mss, 0); =20 show_map_vma(m, vma); =20 @@ -1413,7 +1500,7 @@ static int show_smaps_rollup(struct seq_file *m, void= *v) goto out_put_task; } =20 - ret =3D mmap_read_lock_killable(mm); + ret =3D lock_ctx_mm(&priv->lock_ctx); if (ret) goto out_put_mm; =20 @@ -1425,7 +1512,7 @@ static int show_smaps_rollup(struct seq_file *m, void= *v) =20 vma_start =3D vma->vm_start; do { - smap_gather_stats(vma, &mss, 0); + smap_gather_stats(priv, vma, &mss, 0); last_vma_end =3D vma->vm_end; =20 /* @@ -1434,8 +1521,8 @@ static int show_smaps_rollup(struct seq_file *m, void= *v) */ if (mmap_lock_is_contended(mm)) { vma_iter_invalidate(&vmi); - mmap_read_unlock(mm); - ret =3D mmap_read_lock_killable(mm); + unlock_ctx_mm(&priv->lock_ctx); + ret =3D lock_ctx_mm(&priv->lock_ctx); if (ret) { release_task_mempolicy(priv); goto out_put_mm; @@ -1484,14 +1571,14 @@ 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(vma, &mss, 0); + smap_gather_stats(priv, vma, &mss, 0); last_vma_end =3D vma->vm_end; continue; } =20 /* Case 4 above */ if (vma->vm_end > last_vma_end) { - smap_gather_stats(vma, &mss, last_vma_end); + smap_gather_stats(priv, vma, &mss, last_vma_end); last_vma_end =3D vma->vm_end; } } @@ -1505,7 +1592,7 @@ static int show_smaps_rollup(struct seq_file *m, void= *v) __show_smap(m, &mss, true); =20 release_task_mempolicy(priv); - mmap_read_unlock(mm); + unlock_ctx_mm(&priv->lock_ctx); =20 out_put_mm: mmput(mm); @@ -3291,6 +3378,31 @@ static const struct mm_walk_ops show_numa_ops =3D { .walk_lock =3D PGWALK_RDLOCK, }; =20 +#ifdef CONFIG_PER_VMA_LOCK +static const struct mm_walk_ops show_numa_vma_lock_ops =3D { + .hugetlb_entry =3D gather_hugetlb_stats, + .pmd_entry =3D gather_pte_stats, + .walk_lock =3D PGWALK_VMA_RDLOCK_VERIFY, +}; + +static inline const struct mm_walk_ops * +get_show_numa_ops(struct proc_maps_private *priv) +{ + if (priv->lock_ctx.mmap_locked) + return &show_numa_ops; + return &show_numa_vma_lock_ops; +} + +#else /* CONFIG_PER_VMA_LOCK */ + +static inline const struct mm_walk_ops * +get_show_numa_ops(struct proc_maps_private *priv) +{ + return &show_numa_ops; +} + +#endif /* CONFIG_PER_VMA_LOCK */ + /* * Display pages allocated per node and memory policy via /proc. */ @@ -3335,8 +3447,13 @@ static int show_numa_map(struct seq_file *m, void *v) if (is_vm_hugetlb_page(vma)) seq_puts(m, " huge"); =20 - /* mmap_lock is held by m_start */ - walk_page_vma(vma, &show_numa_ops, md); + /* Skip walking pages if gate VMA */ + if (vma !=3D get_gate_vma(proc_priv->lock_ctx.mm)) { + /* Might sleep. Drop RCU read lock but keep the VMA locked. */ + drop_rcu(proc_priv); + walk_page_vma(vma, get_show_numa_ops(proc_priv), md); + reacquire_rcu(proc_priv); + } =20 if (!md->pages) goto out; --=20 2.54.0.545.g6539524ca2-goog From nobody Fri Jun 19 07:45:48 2026 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (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 026F02E7F2C for ; Sun, 26 Apr 2026 06:27:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777184848; cv=none; b=hsq+tsKSLtS9xhqdU63lcG0bfgqCu51IkhaoQtgqF7o40fHEEKPRZn7Q3zWirK1k+E46QH+bed18gmKgTBcSVZfH5XkXRBLDONn7vvpZggtHuR2y0z48dwALb5ICsN6ARD4wjujLonEYkM6RbTb+nNYyrgxxI43DvYbCUJP78xA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777184848; c=relaxed/simple; bh=WtINYcQ2o5Q20NUYMtezs3/9QnS0e8xfJuo6KIVeYwg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=TRx6klftpcFR6Fgqd9ox+9+z9i+84X1S7LBarVquU6Ao5vaUuUn96+oQ6Yn2zq03X7CcyFeGdWCtcM4X7iuv+/1Un1QDXS871m4TN1SsBCDUen0YhHoqX9nx5kx0zV1+ZN/gKzwbZRBzC1o+kBtqqL2D3U0a7VXr4x3I55ES5qc= 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=pLHu35NH; arc=none smtp.client-ip=209.85.216.73 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="pLHu35NH" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-35842aa350fso18094677a91.0 for ; Sat, 25 Apr 2026 23:27:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1777184846; x=1777789646; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=StblesR9iaiFRRbioNuJy6fVbWaUnyZsVnFfUPQ3g9E=; b=pLHu35NHV1OK+84jxffdn+0qOsaBVV69AZ8RHz798Q/4wZby4ML1m0joQPfSSFNbna LN07ujruJQzAAN+G9lbFPv/FlJlNNeQEXc0y2aCy5VNetfUWcm1vRu9S7uQJj0oNu1Xg 96L7y8bkr5FpIOHPMRlB72156CfweFyDGKZWYBRkUYZt3YixWMITdnfcZZNh+r46NzDf gIDpHTqqrSMBHMnnu+RqY1wvvmcX4OgtgncoVzSM5q1Po2kdSc7GjXVxw98FiSldeDL9 69DJCJsVfyBCjXQ1G1xksLQ2GgQgqg05kik74mKxdUcEdiOBKHRcF0KjweAyZQvqmeBC S1Qg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777184846; x=1777789646; h=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; bh=StblesR9iaiFRRbioNuJy6fVbWaUnyZsVnFfUPQ3g9E=; b=h2Gm57x65hhNODVlKVWlC1b61le5a/wq+/BfiEFU6u1Gls5rufw7ceEdp5wOh5w187 F9re30x2YBkr4F+sBPFSLXbQK0QJtXvNOLheA0hQYReKTFQcSij6K7+NWaDuvJb+w043 TNg6yQA9pDqciHSW54tdD7ZF0+EhvUMYseLbAcVViJTyihqN+Ti82c6eM9Dzvv0Dw8e0 mGNThpwa7ckc0ECqyKVSHOt7ToSDyfCyoy7fXuHCeCOpdOkENISKiLOcmJ9CgYJsINnI F3ZGJRx4yyE7ghfunrcVPZcVE26U3Z2NDVmnsWDSp4O49+a1WX5zq8nd7ZCoJ7wIrST4 W23g== X-Forwarded-Encrypted: i=1; AFNElJ8Mhgl5uUznMIDe2j0IjdQwuMQlRV24EJb0btd5oISp2NNMkxzabweNaLmPB8tJer8wSbVpJ74wPuieDks=@vger.kernel.org X-Gm-Message-State: AOJu0YxuU8k1JymfGDBK25gLxFMsVdLDVct1lVnZ72qTFmt276Zc143M GI9IsR7gWHWAAtHeYcWr8jvKb9GLYmL1onhg3hjg2WUck4G1LvB/or5kgKhlD6K6u3AK5cyaQE7 RZxRSbw== X-Received: from pjbiq12.prod.google.com ([2002:a17:90a:fb4c:b0:35c:27ed:8765]) (user=surenb job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:8cb:b0:35b:b52d:f34d with SMTP id 98e67ed59e1d1-361403b01b9mr28822090a91.5.1777184846217; Sat, 25 Apr 2026 23:27:26 -0700 (PDT) Date: Sat, 25 Apr 2026 23:27:17 -0700 In-Reply-To: <20260426062718.1238437-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: <20260426062718.1238437-1-surenb@google.com> X-Mailer: git-send-email 2.54.0.545.g6539524ca2-goog Message-ID: <20260426062718.1238437-3-surenb@google.com> Subject: [PATCH v2 2/3] selftests/proc: ensure the test is performed at the right page boundary From: Suren Baghdasaryan To: akpm@linux-foundation.org Cc: liam@infradead.org, ljs@kernel.org, vbabka@kernel.org, david@redhat.com, willy@infradead.org, jannh@google.com, paulmck@kernel.org, pfalcato@suse.de, shuah@kernel.org, hsukrut3@gmail.com, richard.weiyang@gmail.com, reddybalavignesh9979@gmail.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kselftest@vger.kernel.org, surenb@google.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When running tearing tests we need to ensure the pages we use include VMAs that were mapped by the child process for this test. Currently we always use the first two pages, checking VMAs at their boundaries and this works, however once we add tests for /proc/pid/smaps, the first two pages might not contain the VMAs that child modifies. Locate the page that contains the first VMA mapped by the child and use that and the next page for the test. Signed-off-by: Suren Baghdasaryan Reviewed-by: Liam R. Howlett --- tools/testing/selftests/proc/proc-maps-race.c | 119 +++++++++++++++--- 1 file changed, 100 insertions(+), 19 deletions(-) diff --git a/tools/testing/selftests/proc/proc-maps-race.c b/tools/testing/= selftests/proc/proc-maps-race.c index a734553718da..5eb350c23da4 100644 --- a/tools/testing/selftests/proc/proc-maps-race.c +++ b/tools/testing/selftests/proc/proc-maps-race.c @@ -39,6 +39,13 @@ #include #include =20 +#define min(a, b) \ + ({ \ + typeof(a) _a =3D (a); \ + typeof(b) _b =3D (b); \ + _a < _b ? _a : _b; \ + }) + /* /proc/pid/maps parsing routines */ struct page_content { char *data; @@ -77,6 +84,7 @@ FIXTURE(proc_maps_race) struct line_content first_line; unsigned long duration_sec; int shared_mem_size; + int skip_pages; int page_size; int vma_count; bool verbose; @@ -105,38 +113,102 @@ struct vma_modifier_info { void *child_mapped_addr[]; }; =20 - -static bool read_two_pages(FIXTURE_DATA(proc_maps_race) *self) +static bool read_page(FIXTURE_DATA(proc_maps_race) *self, + struct page_content *page) { ssize_t bytes_read; =20 - if (lseek(self->maps_fd, 0, SEEK_SET) < 0) + bytes_read =3D read(self->maps_fd, page->data, self->page_size); + if (bytes_read <=3D 0) return false; =20 - bytes_read =3D read(self->maps_fd, self->page1.data, self->page_size); - if (bytes_read <=3D 0) + /* Make sure data always ends with a newline character. */ + if (page->data[bytes_read - 1] !=3D '\n') return false; =20 - self->page1.size =3D bytes_read; + page->size =3D bytes_read; =20 - bytes_read =3D read(self->maps_fd, self->page2.data, self->page_size); - if (bytes_read <=3D 0) + return true; +} + +static bool parse_vma_line(char *line_start, char *line_end, + unsigned long *start, unsigned long *end) +{ + bool found; + + *line_end =3D '\0'; /* stop sscanf at the EOL */ + found =3D (sscanf(line_start, "%lx-%lx", start, end) =3D=3D 2); + *line_end =3D '\n'; + + return found; +} + +static int locate_containing_page(FIXTURE_DATA(proc_maps_race) *self, + unsigned long addr, unsigned long size) +{ + unsigned long start, end; + int page =3D 0; + + if (lseek(self->maps_fd, 0, SEEK_SET) < 0) + return -1; + + while (true) { + char *curr_pos; + char *end_pos; + + if (!read_page(self, &self->page1)) + return -1; + + curr_pos =3D self->page1.data; + end_pos =3D self->page1.data + self->page1.size; + while (curr_pos < end_pos) { + char *line_end; + + line_end =3D strchr(curr_pos, '\n'); + if (!line_end) + break; + + if (parse_vma_line(curr_pos, line_end, &start, &end) && + start =3D=3D addr && end =3D=3D addr + size) + return page; + + curr_pos =3D line_end + 1; + } + page++; + } + + return 0; +} + +static bool read_two_pages(FIXTURE_DATA(proc_maps_race) *self) +{ + if (lseek(self->maps_fd, 0, SEEK_SET) < 0) return false; =20 - self->page2.size =3D bytes_read; + for (int i =3D 0; i < self->skip_pages; i++) + if (!read_page(self, &self->page1)) + return false; =20 - return true; + return read_page(self, &self->page1) && read_page(self, &self->page2); } =20 -static void copy_first_line(struct page_content *page, char *first_line) +static void copy_line(const char *line_start, const char *line_end, + char *buf, size_t buf_size) { - char *pos =3D strchr(page->data, '\n'); + size_t len =3D min(line_end - line_start, buf_size - 1); =20 - strncpy(first_line, page->data, pos - page->data); - first_line[pos - page->data] =3D '\0'; + strncpy(buf, line_start, len); + buf[len] =3D '\0'; } =20 -static void copy_last_line(struct page_content *page, char *last_line) +static void copy_first_line(struct page_content *page, char *first_line, + size_t line_size) +{ + copy_line(page->data, strchr(page->data, '\n'), first_line, line_size); +} + +static void copy_last_line(struct page_content *page, char *last_line, + size_t line_size) { /* Get the last line in the first page */ const char *end =3D page->data + page->size - 1; @@ -146,8 +218,8 @@ static void copy_last_line(struct page_content *page, c= har *last_line) /* search previous newline */ while (pos[-1] !=3D '\n') pos--; - strncpy(last_line, pos, end - pos); - last_line[end - pos] =3D '\0'; + + copy_line(pos, end, last_line, line_size); } =20 /* Read the last line of the first page and the first line of the second p= age */ @@ -158,8 +230,8 @@ static bool read_boundary_lines(FIXTURE_DATA(proc_maps_= race) *self, if (!read_two_pages(self)) return false; =20 - copy_last_line(&self->page1, last_line->text); - copy_first_line(&self->page2, first_line->text); + copy_last_line(&self->page1, last_line->text, LINE_MAX_SIZE); + copy_first_line(&self->page2, first_line->text, LINE_MAX_SIZE); =20 return sscanf(last_line->text, "%lx-%lx", &last_line->start_addr, &last_line->end_addr) =3D=3D 2 && @@ -418,6 +490,8 @@ FIXTURE_SETUP(proc_maps_race) struct vma_modifier_info *mod_info; pthread_mutexattr_t mutex_attr; pthread_condattr_t cond_attr; + unsigned long first_map_addr; + unsigned long last_map_addr; unsigned long duration_sec; char fname[32]; =20 @@ -502,6 +576,13 @@ FIXTURE_SETUP(proc_maps_race) self->page2.data =3D malloc(self->page_size); ASSERT_NE(self->page2.data, NULL); =20 + first_map_addr =3D (unsigned long)mod_info->child_mapped_addr[0]; + last_map_addr =3D (unsigned long)mod_info->child_mapped_addr[mod_info->vm= a_count - 1]; + + self->skip_pages =3D locate_containing_page(self, + min(first_map_addr, last_map_addr), + self->page_size * 3); + ASSERT_NE(self->skip_pages, -1); ASSERT_TRUE(read_boundary_lines(self, &self->last_line, &self->first_line= )); =20 /* --=20 2.54.0.545.g6539524ca2-goog From nobody Fri Jun 19 07:45:48 2026 Received: from mail-dl1-f73.google.com (mail-dl1-f73.google.com [74.125.82.73]) (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 3B2A92E2850 for ; Sun, 26 Apr 2026 06:27:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777184851; cv=none; b=tkBCFe4gL0pnN9pVOFFsAHT2CrQ/WPo9OaIek900hJqcdntWJFCvL+8jg4hFOKHkGaDMIIQxCR0hLgR68sAcPgC5Ffxj3XuKVtbbkvKOhJx1XP48ofSSkOBCqTGsytfZmzsGNuQ6IwpYe22HtkJqQMvNGPJ0fgiPFaK7M9GJym0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777184851; c=relaxed/simple; bh=yxX9S+gKUq71RidCW01kW3BfqOUd2y3AtJzsLU2iU+I=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=e0k9U6oZMhk71NFuqPxgMIVPzgE4FdhImldv0LyLoS7aBt5gK69iAiUoc+REBlEJ4OXyi+CQ+ITI2eG0Zr95QFwbDndwm4knpqD2E2otcSAs4I2T64W+jfbNexMAnkrBvADa98q+cxzY1uq1Miwgrw1liMkhS72CQpuuY+Cia0A= 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=DesYcZ0g; arc=none smtp.client-ip=74.125.82.73 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="DesYcZ0g" Received: by mail-dl1-f73.google.com with SMTP id a92af1059eb24-12c21dbc9c1so34624177c88.0 for ; Sat, 25 Apr 2026 23:27:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1777184848; x=1777789648; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=0bz3o39/B8+STfzOmNVRr4jYj/f9wiAKcuL2hAc9CAE=; b=DesYcZ0gTvXSAN3jcPFsPNf0ZsYDchBVh6/sI4LjgN51XQ4B9C4xp7N+eiFM8ourfo mcBhVgYL2NNCtFknVRTf2XFWa5f0jvfU/CD3o1WuIayALKg3Cbz8kK4S65sAG1Hk+jsR tDsUOvPvL2M9rZQhxDdJn7xamRHf7Gb2ivdzwllnUq1Sn1k7joPWo5c61WQAZrYc64fO IzkGA5xpY5/jCOBzYhzbUYMEto51tsy3F8XQ9bPACgp3h3nBVbSfISPpvi/rAAtED6bn ebQ5ubbVANmdoTNWOLQzPDnM30aF18wPKvR3rt7QE3bIRLfk57ylg8oTR4bzYtHWK+Q6 gymw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777184848; x=1777789648; h=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; bh=0bz3o39/B8+STfzOmNVRr4jYj/f9wiAKcuL2hAc9CAE=; b=gVzAC4uLZTH38wSBN7WR8xJAAwDkyDwXo06/ZsrAOXocqJXP3nIt5GyZV6tUp43x3g eDaQ1JTMx8nDXsswIyG3oT791P553IdjR/74GVlkezWDwHxUsALFLEQ+ld8pErBWyzuv wFT0HQNEBHtKsVMAh3TQePEFodFK52iXxbZBnaYOwgqPYrqTOs8u+21OUnB+8KZKDNNp IvEuuzG3Ww3GqNKX8qYXGd+Nw4KVGO0BNCJ/XeAgolSGxJLQTn5DfSq93N7rek6nEmut 65cYIklH0hJ+lZfwgOjYrZJCTIsS8TU/EfIJtXAe4nH3lHMe/B+klImF+esmd4zf2ANn hf0g== X-Forwarded-Encrypted: i=1; AFNElJ+OAKIGY5NX6cJqqM7g5BBNh/BZ2BqpRqjoNCcCOwroPZ68b7fhEmPzPDg8QSDBLoGBZfDRyfbFPIW5Ujw=@vger.kernel.org X-Gm-Message-State: AOJu0Yw0BMF4NfidNs0ZqHfFLdAkbm1XnmloZ0E/lSUUleHy7ERbSJcz 21T2F8fhQ1xrrX+1pvMS9TT42Vj241WjhGuZzpZSvv8CL4qJDRzF8RbDWceSgBGsbmbl9l0proT 0vcXshg== X-Received: from dlbpu1.prod.google.com ([2002:a05:7022:e881:b0:12c:4955:b382]) (user=surenb job=prod-delivery.src-stubby-dispatcher) by 2002:a05:7022:458f:b0:12d:ca9f:7e4f with SMTP id a92af1059eb24-12dca9f818dmr3135792c88.19.1777184848209; Sat, 25 Apr 2026 23:27:28 -0700 (PDT) Date: Sat, 25 Apr 2026 23:27:18 -0700 In-Reply-To: <20260426062718.1238437-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: <20260426062718.1238437-1-surenb@google.com> X-Mailer: git-send-email 2.54.0.545.g6539524ca2-goog Message-ID: <20260426062718.1238437-4-surenb@google.com> Subject: [PATCH v2 3/3] selftests/proc: add /proc/pid/smaps tearing tests From: Suren Baghdasaryan To: akpm@linux-foundation.org Cc: liam@infradead.org, ljs@kernel.org, vbabka@kernel.org, david@redhat.com, willy@infradead.org, jannh@google.com, paulmck@kernel.org, pfalcato@suse.de, shuah@kernel.org, hsukrut3@gmail.com, richard.weiyang@gmail.com, reddybalavignesh9979@gmail.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kselftest@vger.kernel.org, surenb@google.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add tearing tests for /proc/pid/smaps file. New tests reuse the same logic as with maps file but skipping all the data except for the VMA addresses, which are the only part relevant for the tearing tests. Skip PROCMAP_QUERY parts of the tests because smaps does not implement that ioctl. Signed-off-by: Suren Baghdasaryan Reviewed-by: Liam R. Howlett --- tools/testing/selftests/proc/proc-maps-race.c | 178 +++++++++++++----- 1 file changed, 133 insertions(+), 45 deletions(-) diff --git a/tools/testing/selftests/proc/proc-maps-race.c b/tools/testing/= selftests/proc/proc-maps-race.c index 5eb350c23da4..1026d8c400e1 100644 --- a/tools/testing/selftests/proc/proc-maps-race.c +++ b/tools/testing/selftests/proc/proc-maps-race.c @@ -17,8 +17,8 @@ */ /* * Fork a child that concurrently modifies address space while the main - * process is reading /proc/$PID/maps and verifying the results. Address - * space modifications include: + * process is reading /proc/$PID/maps and /proc/$PID/smaps, verifying the + * results. Address space modifications include: * VMA splitting and merging * */ @@ -73,6 +73,11 @@ enum test_state { TEST_DONE, }; =20 +enum maps_file { + MAPS, + SMAPS, +}; + struct vma_modifier_info; =20 FIXTURE(proc_maps_race) @@ -83,6 +88,7 @@ FIXTURE(proc_maps_race) struct line_content last_line; struct line_content first_line; unsigned long duration_sec; + enum maps_file maps_file; int shared_mem_size; int skip_pages; int page_size; @@ -92,6 +98,19 @@ FIXTURE(proc_maps_race) pid_t pid; }; =20 +FIXTURE_VARIANT(proc_maps_race) +{ + const enum maps_file maps_file; +}; + +FIXTURE_VARIANT_ADD(proc_maps_race, maps) { + .maps_file =3D MAPS, +}; + +FIXTURE_VARIANT_ADD(proc_maps_race, smaps) { + .maps_file =3D SMAPS, +}; + typedef bool (*vma_modifier_op)(FIXTURE_DATA(proc_maps_race) *self); typedef bool (*vma_mod_result_check_op)(struct line_content *mod_last_line, struct line_content *mod_first_line, @@ -222,6 +241,57 @@ static void copy_last_line(struct page_content *page, = char *last_line, copy_line(pos, end, last_line, line_size); } =20 +static bool copy_first_entry(struct page_content *page, char *first_line, + size_t line_size) +{ + char *start_pos =3D page->data; + + while (start_pos < page->data + page->size) { + unsigned long start_addr; + unsigned long end_addr; + char *end_pos; + + end_pos =3D strchr(start_pos, '\n'); + if (!end_pos) + break; + + if (parse_vma_line(start_pos, end_pos, &start_addr, &end_addr)) { + copy_line(start_pos, end_pos, first_line, line_size); + return true; + } + + start_pos =3D end_pos + 1; + } + + return false; +} + +static bool copy_last_entry(struct page_content *page, char *last_line, + size_t line_size) +{ + char *end_pos =3D page->data + page->size - 1; + char *start_pos; + + while (end_pos > page->data) { + unsigned long start_addr; + unsigned long end_addr; + + /* skip last newline */ + start_pos =3D end_pos - 1; + /* search previous newline */ + while (start_pos > page->data && start_pos[-1] !=3D '\n') + start_pos--; + if (parse_vma_line(start_pos, end_pos, &start_addr, &end_addr)) { + copy_line(start_pos, end_pos, last_line, line_size); + return true; + } + + end_pos =3D start_pos - 1; + } + + return false; +} + /* Read the last line of the first page and the first line of the second p= age */ static bool read_boundary_lines(FIXTURE_DATA(proc_maps_race) *self, struct line_content *last_line, @@ -230,8 +300,16 @@ static bool read_boundary_lines(FIXTURE_DATA(proc_maps= _race) *self, if (!read_two_pages(self)) return false; =20 - copy_last_line(&self->page1, last_line->text, LINE_MAX_SIZE); - copy_first_line(&self->page2, first_line->text, LINE_MAX_SIZE); + if (self->maps_file =3D=3D MAPS) { + copy_last_line(&self->page1, last_line->text, LINE_MAX_SIZE); + copy_first_line(&self->page2, first_line->text, LINE_MAX_SIZE); + } else if (self->maps_file =3D=3D SMAPS) { + if (!copy_last_entry(&self->page1, last_line->text, LINE_MAX_SIZE) || + !copy_first_entry(&self->page2, first_line->text, LINE_MAX_SIZE)) + return false; + } else { + return false; + } =20 return sscanf(last_line->text, "%lx-%lx", &last_line->start_addr, &last_line->end_addr) =3D=3D 2 && @@ -497,6 +575,7 @@ FIXTURE_SETUP(proc_maps_race) =20 self->page_size =3D (unsigned long)sysconf(_SC_PAGESIZE); self->verbose =3D verbose && !strncmp(verbose, "1", 1); + self->maps_file =3D variant->maps_file; duration_sec =3D duration ? atol(duration) : 0; self->duration_sec =3D duration_sec ? duration_sec : 5UL; =20 @@ -563,7 +642,16 @@ FIXTURE_SETUP(proc_maps_race) exit(0); } =20 - sprintf(fname, "/proc/%d/maps", self->pid); + switch (self->maps_file) { + case MAPS: + sprintf(fname, "/proc/%d/maps", self->pid); + break; + case SMAPS: + sprintf(fname, "/proc/%d/smaps", self->pid); + break; + default: + ksft_exit_fail(); + } self->maps_fd =3D open(fname, O_RDONLY); ASSERT_NE(self->maps_fd, -1); =20 @@ -608,7 +696,6 @@ FIXTURE_SETUP(proc_maps_race) ASSERT_TRUE(mod_info->addr && mod_info->next_addr); =20 signal_state(mod_info, PARENT_READY); - } =20 FIXTURE_TEARDOWN(proc_maps_race) @@ -698,20 +785,20 @@ TEST_F(proc_maps_race, test_maps_tearing_from_split) last_line_changed =3D strcmp(new_last_line.text, self->last_line.text) != =3D 0; first_line_changed =3D strcmp(new_first_line.text, self->first_line.text= ) !=3D 0; ASSERT_EQ(last_line_changed, first_line_changed); - - /* Check if PROCMAP_QUERY ioclt() finds the right VMA */ - ASSERT_TRUE(query_addr_at(self->maps_fd, mod_info->addr + self->page_siz= e, - &vma_start, &vma_end)); - /* - * The vma at the split address can be either the same as - * original one (if read before the split) or the same as the - * first line in the second page (if read after the split). - */ - ASSERT_TRUE((vma_start =3D=3D self->last_line.start_addr && - 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)); - + if (self->maps_file =3D=3D MAPS) { + /* Check if PROCMAP_QUERY ioclt() finds the right VMA */ + ASSERT_TRUE(query_addr_at(self->maps_fd, mod_info->addr + self->page_si= ze, + &vma_start, &vma_end)); + /* + * The vma at the split address can be either the same as + * original one (if read before the split) or the same as the + * first line in the second page (if read after the split). + */ + ASSERT_TRUE((vma_start =3D=3D self->last_line.start_addr && + 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)); + } clock_gettime(CLOCK_MONOTONIC_COARSE, &end_ts); end_test_iteration(&end_ts, self->verbose); } while (end_ts.tv_sec - start_ts.tv_sec < self->duration_sec); @@ -781,17 +868,18 @@ TEST_F(proc_maps_race, test_maps_tearing_from_resize) strcmp(new_first_line.text, restored_first_line.text), "Expand result invalid", self)); } - - /* Check if PROCMAP_QUERY ioclt() finds the right VMA */ - ASSERT_TRUE(query_addr_at(self->maps_fd, mod_info->addr, &vma_start, &vm= a_end)); - /* - * The vma should stay at the same address and have either the - * original size of 3 pages or 1 page if read after shrinking. - */ - 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)); - + if (self->maps_file =3D=3D MAPS) { + /* Check if PROCMAP_QUERY ioclt() finds the right VMA */ + ASSERT_TRUE(query_addr_at(self->maps_fd, mod_info->addr, + &vma_start, &vma_end)); + /* + * The vma should stay at the same address and have either the + * original size of 3 pages or 1 page if read after shrinking. + */ + 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)); + } clock_gettime(CLOCK_MONOTONIC_COARSE, &end_ts); end_test_iteration(&end_ts, self->verbose); } while (end_ts.tv_sec - start_ts.tv_sec < self->duration_sec); @@ -861,20 +949,20 @@ TEST_F(proc_maps_race, test_maps_tearing_from_remap) strcmp(new_first_line.text, restored_first_line.text), "Remap restore result invalid", self)); } - - /* Check if PROCMAP_QUERY ioclt() finds the right VMA */ - ASSERT_TRUE(query_addr_at(self->maps_fd, mod_info->addr + self->page_siz= e, - &vma_start, &vma_end)); - /* - * The vma should either stay at the same address and have the - * original size of 3 pages or we should find the remapped vma - * at the remap destination address with size of 1 page. - */ - ASSERT_TRUE((vma_start =3D=3D self->last_line.start_addr && - 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)); - + if (self->maps_file =3D=3D MAPS) { + /* Check if PROCMAP_QUERY ioclt() finds the right VMA */ + ASSERT_TRUE(query_addr_at(self->maps_fd, mod_info->addr + self->page_si= ze, + &vma_start, &vma_end)); + /* + * The vma should either stay at the same address and have the + * original size of 3 pages or we should find the remapped vma + * at the remap destination address with size of 1 page. + */ + ASSERT_TRUE((vma_start =3D=3D self->last_line.start_addr && + 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)); + } clock_gettime(CLOCK_MONOTONIC_COARSE, &end_ts); end_test_iteration(&end_ts, self->verbose); } while (end_ts.tv_sec - start_ts.tv_sec < self->duration_sec); --=20 2.54.0.545.g6539524ca2-goog