kvmarm.lists.cs.columbia.edu archive mirror
 help / color / mirror / Atom feed
From: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
To: <linux-arm-kernel@lists.infradead.org>,
	<kvmarm@lists.cs.columbia.edu>, <linux-kernel@vger.kernel.org>
Cc: jean-philippe@linaro.org, julien@xen.org, maz@kernel.org,
	linuxarm@huawei.com, catalin.marinas@arm.com, will@kernel.org
Subject: [PATCH v4 09/16] arm64/mm: Split the function check_and_switch_context in 3 parts
Date: Wed, 14 Apr 2021 12:23:05 +0100	[thread overview]
Message-ID: <20210414112312.13704-10-shameerali.kolothum.thodi@huawei.com> (raw)
In-Reply-To: <20210414112312.13704-1-shameerali.kolothum.thodi@huawei.com>

From: Julien Grall <julien.grall@arm.com>

The function check_and_switch_context is used to:
    1) Check whether the ASID is still valid
    2) Generate a new one if it is not valid
    3) Switch the context

While the latter is specific to the MM subsystem, the rest could be part
of the generic ASID allocator.

After this patch, the function is now split in 3 parts which corresponds
to the use of the functions:
    1) asid_check_context: Check if the ASID is still valid
    2) asid_new_context: Generate a new ASID for the context
    3) check_and_switch_context: Call 1) and 2) and switch the context

1) and 2) have not been merged in a single function because we want to
avoid to add a branch in when the ASID is still valid. This will matter
when the code will be moved in separate file later on as 1) will reside
in the header as a static inline function.

Signed-off-by: Julien Grall <julien.grall@arm.com>
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
---
v3 comment:
    Will wants to avoid to add a branch when the ASID is still valid. So
    1) and 2) are in separates function. The former will move to a new
    header and make static inline.
---
 arch/arm64/mm/context.c | 70 ++++++++++++++++++++++++++++-------------
 1 file changed, 48 insertions(+), 22 deletions(-)

diff --git a/arch/arm64/mm/context.c b/arch/arm64/mm/context.c
index 041c3c5e0216..40ef013c90c3 100644
--- a/arch/arm64/mm/context.c
+++ b/arch/arm64/mm/context.c
@@ -222,17 +222,49 @@ static u64 new_context(struct asid_info *info, atomic64_t *pasid,
 	return idx2asid(info, asid) | generation;
 }
 
-void check_and_switch_context(struct mm_struct *mm)
+/*
+ * Generate a new ASID for the context.
+ *
+ * @pasid: Pointer to the current ASID batch allocated. It will be updated
+ * with the new ASID batch.
+ * @pinned: refcount if asid is pinned.
+ * Caller needs to make sure preempt is disabled before calling this function.
+ */
+static void asid_new_context(struct asid_info *info, atomic64_t *pasid,
+			     refcount_t *pinned)
 {
 	unsigned long flags;
-	unsigned int cpu;
-	u64 asid, old_active_asid;
-	struct asid_info *info = &asid_info;
+	u64 asid;
+	unsigned int cpu = smp_processor_id();
 
-	if (system_supports_cnp())
-		cpu_set_reserved_ttbr0();
+	raw_spin_lock_irqsave(&info->lock, flags);
+	/* Check that our ASID belongs to the current generation. */
+	asid = atomic64_read(pasid);
+	if (!asid_gen_match(asid, info)) {
+		asid = new_context(info, pasid, pinned);
+		atomic64_set(pasid, asid);
+	}
 
-	asid = atomic64_read(&mm->context.id);
+	if (cpumask_test_and_clear_cpu(cpu, &info->flush_pending))
+		local_flush_tlb_all();
+
+	atomic64_set(&active_asid(info, cpu), asid);
+	raw_spin_unlock_irqrestore(&info->lock, flags);
+}
+
+/*
+ * Check the ASID is still valid for the context. If not generate a new ASID.
+ *
+ * @pasid: Pointer to the current ASID batch
+ * @pinned: refcount if asid is pinned
+ * Caller needs to make sure preempt is disabled before calling this function.
+ */
+static void asid_check_context(struct asid_info *info, atomic64_t *pasid,
+			       refcount_t *pinned)
+{
+	u64 asid, old_active_asid;
+
+	asid = atomic64_read(pasid);
 
 	/*
 	 * The memory ordering here is subtle.
@@ -252,24 +284,18 @@ void check_and_switch_context(struct mm_struct *mm)
 	if (old_active_asid && asid_gen_match(asid, info) &&
 	    atomic64_cmpxchg_relaxed(this_cpu_ptr(info->active),
 				     old_active_asid, asid))
-		goto switch_mm_fastpath;
-
-	raw_spin_lock_irqsave(&info->lock, flags);
-	/* Check that our ASID belongs to the current generation. */
-	asid = atomic64_read(&mm->context.id);
-	if (!asid_gen_match(asid, info)) {
-		asid = new_context(info, &mm->context.id, &mm->context.pinned);
-		atomic64_set(&mm->context.id, asid);
-	}
+		return;
 
-	cpu = smp_processor_id();
-	if (cpumask_test_and_clear_cpu(cpu, &info->flush_pending))
-		local_flush_tlb_all();
+	asid_new_context(info, pasid, pinned);
+}
 
-	atomic64_set(&active_asid(info, cpu), asid);
-	raw_spin_unlock_irqrestore(&info->lock, flags);
+void check_and_switch_context(struct mm_struct *mm)
+{
+	if (system_supports_cnp())
+		cpu_set_reserved_ttbr0();
 
-switch_mm_fastpath:
+	asid_check_context(&asid_info, &mm->context.id,
+			   &mm->context.pinned);
 
 	arm64_apply_bp_hardening();
 
-- 
2.17.1

_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

  parent reply	other threads:[~2021-04-14 11:25 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-14 11:22 [PATCH v4 00/16] kvm/arm: Align the VMID allocation with the arm64 ASID one Shameer Kolothum
2021-04-14 11:22 ` [PATCH v4 01/16] arm64/mm: Introduce asid_info structure and move asid_generation/asid_map to it Shameer Kolothum
2021-04-14 11:22 ` [PATCH v4 02/16] arm64/mm: Move active_asids and reserved_asids to asid_info Shameer Kolothum
2021-04-14 11:22 ` [PATCH v4 03/16] arm64/mm: Move bits " Shameer Kolothum
2021-04-14 11:23 ` [PATCH v4 04/16] arm64/mm: Move the variable lock and tlb_flush_pending " Shameer Kolothum
2021-04-14 11:23 ` [PATCH v4 05/16] arm64/mm: Remove dependency on MM in new_context Shameer Kolothum
2021-04-14 11:23 ` [PATCH v4 06/16] arm64/mm: Introduce NUM_CTXT_ASIDS Shameer Kolothum
2021-04-14 11:23 ` [PATCH v4 07/16] arm64/mm: Move Pinned ASID related variables to asid_info Shameer Kolothum
2021-04-14 11:23 ` [PATCH v4 08/16] arm64/mm: Split asid_inits in 2 parts Shameer Kolothum
2021-04-14 11:23 ` Shameer Kolothum [this message]
2021-04-14 11:23 ` [PATCH v4 10/16] arm64/mm: Split the arm64_mm_context_get/put Shameer Kolothum
2021-04-14 11:23 ` [PATCH v4 11/16] arm64/mm: Introduce a callback to flush the local context Shameer Kolothum
2021-04-14 11:23 ` [PATCH v4 12/16] arm64/mm: Introduce a callback to set reserved bits Shameer Kolothum
2021-04-14 11:23 ` [PATCH v4 13/16] arm64: Move the ASID allocator code in a separate file Shameer Kolothum
2021-04-14 11:23 ` [PATCH v4 14/16] arm64/lib: Add an helper to free memory allocated by the ASID allocator Shameer Kolothum
2021-04-14 11:23 ` [PATCH v4 15/16] arch/arm64: Introduce a capability to tell whether 16-bit VMID is available Shameer Kolothum
2021-04-14 11:23 ` [PATCH v4 16/16] kvm/arm: Align the VMID allocation with the arm64 ASID one Shameer Kolothum
2021-04-22 16:08 ` [PATCH v4 00/16] " Will Deacon
2021-04-23  8:31   ` Shameerali Kolothum Thodi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210414112312.13704-10-shameerali.kolothum.thodi@huawei.com \
    --to=shameerali.kolothum.thodi@huawei.com \
    --cc=catalin.marinas@arm.com \
    --cc=jean-philippe@linaro.org \
    --cc=julien@xen.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxarm@huawei.com \
    --cc=maz@kernel.org \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).