Commit a7a04105 authored by Will Deacon's avatar Will Deacon Committed by Russell King

ARM: 7925/1: mm: keep track of last ASID allocation to improve bitmap searching

Since we only clear entries in the ASID bitmap on a rollover event, the
bitmap tends to consist of a block of consecutive set bits followed by
a block of consecutive clear bits. The exception to this rule is for
ASIDs which have been carried over from a previous generation, but
these are bound by the number of CPUs.

This patch optimises our bitmap searching strategy, so that we search
from the last successful allocation, rather than search from index 1
each time we allocate a new ASID.
Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent e1a5848e
...@@ -180,6 +180,7 @@ static int is_reserved_asid(u64 asid) ...@@ -180,6 +180,7 @@ static int is_reserved_asid(u64 asid)
static u64 new_context(struct mm_struct *mm, unsigned int cpu) static u64 new_context(struct mm_struct *mm, unsigned int cpu)
{ {
static u32 cur_idx = 1;
u64 asid = atomic64_read(&mm->context.id); u64 asid = atomic64_read(&mm->context.id);
u64 generation = atomic64_read(&asid_generation); u64 generation = atomic64_read(&asid_generation);
...@@ -197,7 +198,7 @@ static u64 new_context(struct mm_struct *mm, unsigned int cpu) ...@@ -197,7 +198,7 @@ static u64 new_context(struct mm_struct *mm, unsigned int cpu)
* as we reserve ASID #0 to switch via TTBR0 and indicate * as we reserve ASID #0 to switch via TTBR0 and indicate
* rollover events. * rollover events.
*/ */
asid = find_next_zero_bit(asid_map, NUM_USER_ASIDS, 1); asid = find_next_zero_bit(asid_map, NUM_USER_ASIDS, cur_idx);
if (asid == NUM_USER_ASIDS) { if (asid == NUM_USER_ASIDS) {
generation = atomic64_add_return(ASID_FIRST_VERSION, generation = atomic64_add_return(ASID_FIRST_VERSION,
&asid_generation); &asid_generation);
...@@ -205,6 +206,7 @@ static u64 new_context(struct mm_struct *mm, unsigned int cpu) ...@@ -205,6 +206,7 @@ static u64 new_context(struct mm_struct *mm, unsigned int cpu)
asid = find_next_zero_bit(asid_map, NUM_USER_ASIDS, 1); asid = find_next_zero_bit(asid_map, NUM_USER_ASIDS, 1);
} }
__set_bit(asid, asid_map); __set_bit(asid, asid_map);
cur_idx = asid;
asid |= generation; asid |= generation;
cpumask_clear(mm_cpumask(mm)); cpumask_clear(mm_cpumask(mm));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment