From patchwork Sat Jan 11 04:25:49 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Suren Baghdasaryan X-Patchwork-Id: 13935768 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id AB9D9E7719A for ; Sat, 11 Jan 2025 04:26:16 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 408076B0088; Fri, 10 Jan 2025 23:26:16 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 36B746B0089; Fri, 10 Jan 2025 23:26:16 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 16F516B008C; Fri, 10 Jan 2025 23:26:16 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id E02936B0088 for ; Fri, 10 Jan 2025 23:26:15 -0500 (EST) Received: from smtpin29.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 93EF9B0736 for ; Sat, 11 Jan 2025 04:26:15 +0000 (UTC) X-FDA: 82993883910.29.5B4FB9C Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) by imf10.hostedemail.com (Postfix) with ESMTP id BDF93C0005 for ; Sat, 11 Jan 2025 04:26:13 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=PB8r6rzA; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf10.hostedemail.com: domain of 35PKBZwYKCBUDFCz8w19916z.x97638FI-775Gvx5.9C1@flex--surenb.bounces.google.com designates 209.85.216.74 as permitted sender) smtp.mailfrom=35PKBZwYKCBUDFCz8w19916z.x97638FI-775Gvx5.9C1@flex--surenb.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1736569573; a=rsa-sha256; cv=none; b=fx6odvxgWMib9uooJaPT9Z50aL4qp3e/Rfre6ElB14PB07dXDJO2X1zd3JeuBFQ90Mu0ZQ GpXciRoJWxRkrCOTXrJtC4g1MaTig3GYPic6WykYENxoX8aATiJZCc9BNpZp9Ss7SvX9Z4 nyTJL1RsDNpK9tawOSrTMggM9ZWJgcY= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=PB8r6rzA; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf10.hostedemail.com: domain of 35PKBZwYKCBUDFCz8w19916z.x97638FI-775Gvx5.9C1@flex--surenb.bounces.google.com designates 209.85.216.74 as permitted sender) smtp.mailfrom=35PKBZwYKCBUDFCz8w19916z.x97638FI-775Gvx5.9C1@flex--surenb.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1736569573; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=5pJF9dh9SQ99ZsNMTOkH4coKtI9mgkiS0QQ1s/qtBA0=; b=bqbLCMn7jJcL4J9bqN/RG9Q9c/s3/SSJN11O3Y4MKyMwzxI3md0Ak8KnH2sigwGQT/ecF2 YE5o+W+IJcLkF7X9gDDPn1Vk6U8UAOAR6K3OKiZC+J+U9nN7HcJ65GtGB7qrIGwB24m5Kl DbfeCrAJb49UF9QGbyMw0mMt0AbwHYw= Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-2ee5616e986so6890455a91.2 for ; Fri, 10 Jan 2025 20:26:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736569572; x=1737174372; darn=kvack.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=5pJF9dh9SQ99ZsNMTOkH4coKtI9mgkiS0QQ1s/qtBA0=; b=PB8r6rzAYemAvhy7o0KJ0BpyIpMEvCepVa+1gVZZXCFFfSWF6AogwQ7WoKzpbWgzMs TuhDIPM7pv721mINIW7zkEsPRY0dMbY3NUrpW/Mbe2hsTGAEI+pDyvXgfteMogCAsEz5 4nn9ivqbVGVFJOBM/JnXZCjMF1GBaJpa6NzjBFF14pv9q/ktixGgNn/XEgWqwFqRAprT piVZeL0A5k78OAuN8t+ioyaphreoFDvw6J6SWezlAWaw1L0fSDsRK2WIWTOTKApfcLoS 2dx8udzrVG+1GnqTseuNhSe7xwZnzkfOuKQ3wFReDTHhxO2BtRlzMzweVX+asyKNjSTh EW1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736569572; x=1737174372; 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=5pJF9dh9SQ99ZsNMTOkH4coKtI9mgkiS0QQ1s/qtBA0=; b=GTdoOdzCRwlUuVijPav8FQwnjGZm3V1T7mqkZJjOEe3D4fKNTKdUUn5Pa2jYKZ2Jok PWNJ0gR75JIcfTzfCjfDeqFzbKNWDMGDFxzCDMJP43HC7TUn3ZEl4Wm9UHonCS9HvqcK MVVYDZGa/mE2URuHqRB2auHgGNHOQYQ2ueEz24LTFyn3sWgEBi8rlsTpHLsOiFD9vqLz 3hJzw8Pfl1U82TmILm1sj6Knq9sU3qeQLj2naR5Fw/jAE2eR6pQOE0/idOpY02MJ8rg9 b5zKEMk+kfgMJYAbaIw0DWR1M98gtZeWpljp5ZgjVAdwBDTn7V7nxwrPkiFt+VzrI6kd mjTQ== X-Forwarded-Encrypted: i=1; AJvYcCXGLOIgts64hTBcpRLxTJp0G+sqrUaZxUqDuvlk186RBRumRpz9lSDuefZC0lyuqnR9KfK8wt91wQ==@kvack.org X-Gm-Message-State: AOJu0YzCWNrqVKhM/BJ1jXYLtvphtOq0R1ShQFFs9OgvHNejKuY7T1Ra ChTjBCRqm4T3uRiTg4HlF8Euc/8DKlarNL1/F/Ee0n8Sjxj37NgRAi4yARon032MSNIoIfuc+m/ v4w== X-Google-Smtp-Source: AGHT+IFh7TfnUZiu/6FpeM7mSX4ZUoHPFADM7v9c7q9mHn92V8uTq9qQpCpJ89f5SPaq/DM5hqZIsT2lYpA= X-Received: from pjbdj16.prod.google.com ([2002:a17:90a:d2d0:b0:2ee:4826:cae3]) (user=surenb job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3d09:b0:2ee:cddd:2454 with SMTP id 98e67ed59e1d1-2f548f39a8amr20621472a91.15.1736569572290; Fri, 10 Jan 2025 20:26:12 -0800 (PST) Date: Fri, 10 Jan 2025 20:25:49 -0800 In-Reply-To: <20250111042604.3230628-1-surenb@google.com> Mime-Version: 1.0 References: <20250111042604.3230628-1-surenb@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250111042604.3230628-3-surenb@google.com> Subject: [PATCH v9 02/17] mm: move per-vma lock into vm_area_struct From: Suren Baghdasaryan To: akpm@linux-foundation.org Cc: peterz@infradead.org, willy@infradead.org, liam.howlett@oracle.com, lorenzo.stoakes@oracle.com, david.laight.linux@gmail.com, mhocko@suse.com, vbabka@suse.cz, hannes@cmpxchg.org, mjguzik@gmail.com, oliver.sang@intel.com, mgorman@techsingularity.net, david@redhat.com, peterx@redhat.com, oleg@redhat.com, dave@stgolabs.net, paulmck@kernel.org, brauner@kernel.org, dhowells@redhat.com, hdanton@sina.com, hughd@google.com, lokeshgidra@google.com, minchan@google.com, jannh@google.com, shakeel.butt@linux.dev, souravpanda@google.com, pasha.tatashin@soleen.com, klarasmodin@gmail.com, richard.weiyang@gmail.com, corbet@lwn.net, linux-doc@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, kernel-team@android.com, surenb@google.com, "Liam R. Howlett" X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: BDF93C0005 X-Stat-Signature: e6jya3e4cujqbuqot9exz7n68btkpeym X-Rspam-User: X-HE-Tag: 1736569573-338842 X-HE-Meta: U2FsdGVkX1/v3N9IyQL3OUf5/sbt5CkgNjqR7w3BvIIVGvGfN+pUhMcj0RPifX2UUEaS6S0C95zWLhJTKv2rdDESbgEBlkppw3+c5mp29+GeX507hm4ytYtbi2DZqWjD4hWWlTEsYSuQBDVHd8cdqU7y/iHpGcEW51ruQPbTO91peta6rtaEHUnxaotqVpzCftnbjj+Hp9kSMR23IT/dnaW6W9l9CPceu0/I5zezSi1gsq/9gmabTCa4s83PzwEoSQafuHxHyMCVvrGrn/y2L3Rw5n0yGu/08fuNjkW/S3mspHGKNM8Y25ToQj51p7a3FRxSEKbGTizYMV5W1pnmz9XtIl0fAwu0wk5W+t4iiK9keC/uaZkDttEZF4Z9WKBorLF5zLcczqW54IhV5DcHMRqNnL3rh6a1neMC04ti/H2g2eGva3LMKAn0XkzLM47VQYo6iMUYBqSzofYtsJFmMxsMNCLvb2LahIui8eaUZCy8CbSEbYtI59YLtfYh0qxJGK7wjAIgd2Wzm/o5kXVZRVwDSE0K+OF2quZEZn8hz4P51er+tZzddu2iP281zifuFrULG8AdhN+dOcDLqujKgVS+OP2TGQXs+eSPch9Lzcm0cmFI2z+5g+Cqh4bmD8UQFwDmMVvQNOI/qow7rN51GXdeT3YQNu2R4brQgdp0qxVO+JV6pb8ZzImLfAMFdcqCpv9edIfWYsJz87lt59J0VpEUbMMhRz75eOGrHXYP5z3n6OELgAXASWGlPcbOlXMfMPGXLXBOTtEx6a99V7IIroL+nxWixzLR0Rpqx8U0p4b+NH4T7zNcnoD58E4YYgB0fryzWPwQ/c8g9s8BdNP2t/jwJ0UBlB5Q/ePy0F7q1Nwbnbqv5nITO8bQY3r4lj41T0/2jpKgXnJW4hdDjXoB5zODkrOwbbGKcYPml9vCfcNPSGCoqkwe66ly8UBt0cmEgoC09Vj24GzL2ZGpEC+ XwGwQK0P mS4AnHevoGlysAYEz60Z3R/XSx9qIefYWOgtCQWD+U9agQ8J2PnVsXu4ESPbd+jBcGJo4VHZJYb2y2rRD2374gajpWH8yJtQMgmY23TsBvoRDBKM9IKx0tB8zli9iB0J031Bq0cXCZl3yTKJPdNphN+ukE/gX5XEl1PGLVvL6+7kM6OtDDmjzgAPHWxldIq0Ks8UjJtYtl++pR/BIZQdW8hnaB33c8ltGeMWw3fKYjMnpkN0jjzgnXGdsPL04mHBjD0p713NzggrjSM4Ni5VfuUvYOxUPVocv+HMToksgrM3ppb2t4niUny6ik4eF8C1BaSfZAX0HZMadoGW3lqTo1Kor6N/wHTlZayNmGulDD8aHmTqueTeM637Hjg9vfnObILeQXzKJEpyYB76JR6HHHO+AaaLRWcer1Gd2gWTv7sOxQuwq7iA3eOdQ0BPL8nA0VbTxe1Nj6T5M1GLDrSo3NZOZJuOuSWLlqBcNFXVPb4rtv4xe1fXJ5Tj/5i6uJjDV6+hPGwlmMHFFpGWqxvgLzu12G62wq4Bo/bn5OVff85ofNWi8hjZ6vFcpYakFbke+rDhevc0DlzSQOuj7/7VjjO1R7Xt8c8Nl+O40zJx29TapajZAksRm398yM/21AhZRnieUWULwzCkltY5OGahhMQWvaXuDrM65X3iI+xCyG7Hz8evj1jW9AcekaCJSa4y1AaF3FVWyYz0WdED/p3j3gPS0W4LZ61kLpTdN X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Back when per-vma locks were introduces, vm_lock was moved out of vm_area_struct in [1] because of the performance regression caused by false cacheline sharing. Recent investigation [2] revealed that the regressions is limited to a rather old Broadwell microarchitecture and even there it can be mitigated by disabling adjacent cacheline prefetching, see [3]. Splitting single logical structure into multiple ones leads to more complicated management, extra pointer dereferences and overall less maintainable code. When that split-away part is a lock, it complicates things even further. With no performance benefits, there are no reasons for this split. Merging the vm_lock back into vm_area_struct also allows vm_area_struct to use SLAB_TYPESAFE_BY_RCU later in this patchset. Move vm_lock back into vm_area_struct, aligning it at the cacheline boundary and changing the cache to be cacheline-aligned as well. With kernel compiled using defconfig, this causes VMA memory consumption to grow from 160 (vm_area_struct) + 40 (vm_lock) bytes to 256 bytes: slabinfo before: ... : ... vma_lock ... 40 102 1 : ... vm_area_struct ... 160 51 2 : ... slabinfo after moving vm_lock: ... : ... vm_area_struct ... 256 32 2 : ... Aggregate VMA memory consumption per 1000 VMAs grows from 50 to 64 pages, which is 5.5MB per 100000 VMAs. Note that the size of this structure is dependent on the kernel configuration and typically the original size is higher than 160 bytes. Therefore these calculations are close to the worst case scenario. A more realistic vm_area_struct usage before this change is: ... : ... vma_lock ... 40 102 1 : ... vm_area_struct ... 176 46 2 : ... Aggregate VMA memory consumption per 1000 VMAs grows from 54 to 64 pages, which is 3.9MB per 100000 VMAs. This memory consumption growth can be addressed later by optimizing the vm_lock. [1] https://lore.kernel.org/all/20230227173632.3292573-34-surenb@google.com/ [2] https://lore.kernel.org/all/ZsQyI%2F087V34JoIt@xsang-OptiPlex-9020/ [3] https://lore.kernel.org/all/CAJuCfpEisU8Lfe96AYJDZ+OM4NoPmnw9bP53cT_kbfP_pR+-2g@mail.gmail.com/ Signed-off-by: Suren Baghdasaryan Reviewed-by: Lorenzo Stoakes Reviewed-by: Shakeel Butt Reviewed-by: Vlastimil Babka Reviewed-by: Liam R. Howlett --- include/linux/mm.h | 28 ++++++++++-------- include/linux/mm_types.h | 6 ++-- kernel/fork.c | 49 ++++---------------------------- tools/testing/vma/vma_internal.h | 33 +++++---------------- 4 files changed, 32 insertions(+), 84 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 1c0250c187f6..ed739406b0a7 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -697,6 +697,12 @@ static inline void vma_numab_state_free(struct vm_area_struct *vma) {} #endif /* CONFIG_NUMA_BALANCING */ #ifdef CONFIG_PER_VMA_LOCK +static inline void vma_lock_init(struct vm_area_struct *vma) +{ + init_rwsem(&vma->vm_lock.lock); + vma->vm_lock_seq = UINT_MAX; +} + /* * Try to read-lock a vma. The function is allowed to occasionally yield false * locked result to avoid performance overhead, in which case we fall back to @@ -714,7 +720,7 @@ static inline bool vma_start_read(struct vm_area_struct *vma) if (READ_ONCE(vma->vm_lock_seq) == READ_ONCE(vma->vm_mm->mm_lock_seq.sequence)) return false; - if (unlikely(down_read_trylock(&vma->vm_lock->lock) == 0)) + if (unlikely(down_read_trylock(&vma->vm_lock.lock) == 0)) return false; /* @@ -729,7 +735,7 @@ static inline bool vma_start_read(struct vm_area_struct *vma) * This pairs with RELEASE semantics in vma_end_write_all(). */ if (unlikely(vma->vm_lock_seq == raw_read_seqcount(&vma->vm_mm->mm_lock_seq))) { - up_read(&vma->vm_lock->lock); + up_read(&vma->vm_lock.lock); return false; } return true; @@ -744,7 +750,7 @@ static inline bool vma_start_read(struct vm_area_struct *vma) static inline void vma_start_read_locked_nested(struct vm_area_struct *vma, int subclass) { mmap_assert_locked(vma->vm_mm); - down_read_nested(&vma->vm_lock->lock, subclass); + down_read_nested(&vma->vm_lock.lock, subclass); } /* @@ -756,13 +762,13 @@ static inline void vma_start_read_locked_nested(struct vm_area_struct *vma, int static inline void vma_start_read_locked(struct vm_area_struct *vma) { mmap_assert_locked(vma->vm_mm); - down_read(&vma->vm_lock->lock); + down_read(&vma->vm_lock.lock); } static inline void vma_end_read(struct vm_area_struct *vma) { rcu_read_lock(); /* keeps vma alive till the end of up_read */ - up_read(&vma->vm_lock->lock); + up_read(&vma->vm_lock.lock); rcu_read_unlock(); } @@ -791,7 +797,7 @@ static inline void vma_start_write(struct vm_area_struct *vma) if (__is_vma_write_locked(vma, &mm_lock_seq)) return; - down_write(&vma->vm_lock->lock); + down_write(&vma->vm_lock.lock); /* * We should use WRITE_ONCE() here because we can have concurrent reads * from the early lockless pessimistic check in vma_start_read(). @@ -799,7 +805,7 @@ static inline void vma_start_write(struct vm_area_struct *vma) * we should use WRITE_ONCE() for cleanliness and to keep KCSAN happy. */ WRITE_ONCE(vma->vm_lock_seq, mm_lock_seq); - up_write(&vma->vm_lock->lock); + up_write(&vma->vm_lock.lock); } static inline void vma_assert_write_locked(struct vm_area_struct *vma) @@ -811,7 +817,7 @@ static inline void vma_assert_write_locked(struct vm_area_struct *vma) static inline void vma_assert_locked(struct vm_area_struct *vma) { - if (!rwsem_is_locked(&vma->vm_lock->lock)) + if (!rwsem_is_locked(&vma->vm_lock.lock)) vma_assert_write_locked(vma); } @@ -844,6 +850,7 @@ struct vm_area_struct *lock_vma_under_rcu(struct mm_struct *mm, #else /* CONFIG_PER_VMA_LOCK */ +static inline void vma_lock_init(struct vm_area_struct *vma) {} static inline bool vma_start_read(struct vm_area_struct *vma) { return false; } static inline void vma_end_read(struct vm_area_struct *vma) {} @@ -878,10 +885,6 @@ static inline void assert_fault_locked(struct vm_fault *vmf) extern const struct vm_operations_struct vma_dummy_vm_ops; -/* - * WARNING: vma_init does not initialize vma->vm_lock. - * Use vm_area_alloc()/vm_area_free() if vma needs locking. - */ static inline void vma_init(struct vm_area_struct *vma, struct mm_struct *mm) { memset(vma, 0, sizeof(*vma)); @@ -890,6 +893,7 @@ static inline void vma_init(struct vm_area_struct *vma, struct mm_struct *mm) INIT_LIST_HEAD(&vma->anon_vma_chain); vma_mark_detached(vma, false); vma_numab_state_init(vma); + vma_lock_init(vma); } /* Use when VMA is not part of the VMA tree and needs no locking */ diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 5f1b2dc788e2..6573d95f1d1e 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -730,8 +730,6 @@ struct vm_area_struct { * slowpath. */ unsigned int vm_lock_seq; - /* Unstable RCU readers are allowed to read this. */ - struct vma_lock *vm_lock; #endif /* @@ -784,6 +782,10 @@ struct vm_area_struct { struct vma_numab_state *numab_state; /* NUMA Balancing state */ #endif struct vm_userfaultfd_ctx vm_userfaultfd_ctx; +#ifdef CONFIG_PER_VMA_LOCK + /* Unstable RCU readers are allowed to read this. */ + struct vma_lock vm_lock ____cacheline_aligned_in_smp; +#endif } __randomize_layout; #ifdef CONFIG_NUMA diff --git a/kernel/fork.c b/kernel/fork.c index ded49f18cd95..40a8e615499f 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -436,35 +436,6 @@ static struct kmem_cache *vm_area_cachep; /* SLAB cache for mm_struct structures (tsk->mm) */ static struct kmem_cache *mm_cachep; -#ifdef CONFIG_PER_VMA_LOCK - -/* SLAB cache for vm_area_struct.lock */ -static struct kmem_cache *vma_lock_cachep; - -static bool vma_lock_alloc(struct vm_area_struct *vma) -{ - vma->vm_lock = kmem_cache_alloc(vma_lock_cachep, GFP_KERNEL); - if (!vma->vm_lock) - return false; - - init_rwsem(&vma->vm_lock->lock); - vma->vm_lock_seq = UINT_MAX; - - return true; -} - -static inline void vma_lock_free(struct vm_area_struct *vma) -{ - kmem_cache_free(vma_lock_cachep, vma->vm_lock); -} - -#else /* CONFIG_PER_VMA_LOCK */ - -static inline bool vma_lock_alloc(struct vm_area_struct *vma) { return true; } -static inline void vma_lock_free(struct vm_area_struct *vma) {} - -#endif /* CONFIG_PER_VMA_LOCK */ - struct vm_area_struct *vm_area_alloc(struct mm_struct *mm) { struct vm_area_struct *vma; @@ -474,10 +445,6 @@ struct vm_area_struct *vm_area_alloc(struct mm_struct *mm) return NULL; vma_init(vma, mm); - if (!vma_lock_alloc(vma)) { - kmem_cache_free(vm_area_cachep, vma); - return NULL; - } return vma; } @@ -496,10 +463,7 @@ struct vm_area_struct *vm_area_dup(struct vm_area_struct *orig) * will be reinitialized. */ data_race(memcpy(new, orig, sizeof(*new))); - if (!vma_lock_alloc(new)) { - kmem_cache_free(vm_area_cachep, new); - return NULL; - } + vma_lock_init(new); INIT_LIST_HEAD(&new->anon_vma_chain); vma_numab_state_init(new); dup_anon_vma_name(orig, new); @@ -511,7 +475,6 @@ void __vm_area_free(struct vm_area_struct *vma) { vma_numab_state_free(vma); free_anon_vma_name(vma); - vma_lock_free(vma); kmem_cache_free(vm_area_cachep, vma); } @@ -522,7 +485,7 @@ static void vm_area_free_rcu_cb(struct rcu_head *head) vm_rcu); /* The vma should not be locked while being destroyed. */ - VM_BUG_ON_VMA(rwsem_is_locked(&vma->vm_lock->lock), vma); + VM_BUG_ON_VMA(rwsem_is_locked(&vma->vm_lock.lock), vma); __vm_area_free(vma); } #endif @@ -3188,11 +3151,9 @@ void __init proc_caches_init(void) sizeof(struct fs_struct), 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_ACCOUNT, NULL); - - vm_area_cachep = KMEM_CACHE(vm_area_struct, SLAB_PANIC|SLAB_ACCOUNT); -#ifdef CONFIG_PER_VMA_LOCK - vma_lock_cachep = KMEM_CACHE(vma_lock, SLAB_PANIC|SLAB_ACCOUNT); -#endif + vm_area_cachep = KMEM_CACHE(vm_area_struct, + SLAB_HWCACHE_ALIGN|SLAB_NO_MERGE|SLAB_PANIC| + SLAB_ACCOUNT); mmap_init(); nsproxy_cache_init(); } diff --git a/tools/testing/vma/vma_internal.h b/tools/testing/vma/vma_internal.h index 2404347fa2c7..96aeb28c81f9 100644 --- a/tools/testing/vma/vma_internal.h +++ b/tools/testing/vma/vma_internal.h @@ -274,10 +274,10 @@ struct vm_area_struct { /* * Can only be written (using WRITE_ONCE()) while holding both: * - mmap_lock (in write mode) - * - vm_lock->lock (in write mode) + * - vm_lock.lock (in write mode) * Can be read reliably while holding one of: * - mmap_lock (in read or write mode) - * - vm_lock->lock (in read or write mode) + * - vm_lock.lock (in read or write mode) * Can be read unreliably (using READ_ONCE()) for pessimistic bailout * while holding nothing (except RCU to keep the VMA struct allocated). * @@ -286,7 +286,7 @@ struct vm_area_struct { * slowpath. */ unsigned int vm_lock_seq; - struct vma_lock *vm_lock; + struct vma_lock vm_lock; #endif /* @@ -463,17 +463,10 @@ static inline struct vm_area_struct *vma_next(struct vma_iterator *vmi) return mas_find(&vmi->mas, ULONG_MAX); } -static inline bool vma_lock_alloc(struct vm_area_struct *vma) +static inline void vma_lock_init(struct vm_area_struct *vma) { - vma->vm_lock = calloc(1, sizeof(struct vma_lock)); - - if (!vma->vm_lock) - return false; - - init_rwsem(&vma->vm_lock->lock); + init_rwsem(&vma->vm_lock.lock); vma->vm_lock_seq = UINT_MAX; - - return true; } static inline void vma_assert_write_locked(struct vm_area_struct *); @@ -496,6 +489,7 @@ static inline void vma_init(struct vm_area_struct *vma, struct mm_struct *mm) vma->vm_ops = &vma_dummy_vm_ops; INIT_LIST_HEAD(&vma->anon_vma_chain); vma_mark_detached(vma, false); + vma_lock_init(vma); } static inline struct vm_area_struct *vm_area_alloc(struct mm_struct *mm) @@ -506,10 +500,6 @@ static inline struct vm_area_struct *vm_area_alloc(struct mm_struct *mm) return NULL; vma_init(vma, mm); - if (!vma_lock_alloc(vma)) { - free(vma); - return NULL; - } return vma; } @@ -522,10 +512,7 @@ static inline struct vm_area_struct *vm_area_dup(struct vm_area_struct *orig) return NULL; memcpy(new, orig, sizeof(*new)); - if (!vma_lock_alloc(new)) { - free(new); - return NULL; - } + vma_lock_init(new); INIT_LIST_HEAD(&new->anon_vma_chain); return new; @@ -695,14 +682,8 @@ static inline void mpol_put(struct mempolicy *) { } -static inline void vma_lock_free(struct vm_area_struct *vma) -{ - free(vma->vm_lock); -} - static inline void __vm_area_free(struct vm_area_struct *vma) { - vma_lock_free(vma); free(vma); }