Commit 1aee47a0 authored by Scott Wood's avatar Scott Wood Committed by Avi Kivity

KVM: PPC: e500: Don't search over the entire TLB0.

Only look in the 4 entries that could possibly contain the
entry we're looking for.
Signed-off-by: default avatarScott Wood <scottwood@freescale.com>
Signed-off-by: default avatarAlexander Graf <agraf@suse.de>
parent dd9ebf1f
...@@ -418,11 +418,21 @@ static void kvmppc_e500_stlbe_invalidate(struct kvmppc_vcpu_e500 *vcpu_e500, ...@@ -418,11 +418,21 @@ static void kvmppc_e500_stlbe_invalidate(struct kvmppc_vcpu_e500 *vcpu_e500,
static int kvmppc_e500_tlb_index(struct kvmppc_vcpu_e500 *vcpu_e500, static int kvmppc_e500_tlb_index(struct kvmppc_vcpu_e500 *vcpu_e500,
gva_t eaddr, int tlbsel, unsigned int pid, int as) gva_t eaddr, int tlbsel, unsigned int pid, int as)
{ {
int size = vcpu_e500->gtlb_size[tlbsel];
int set_base;
int i; int i;
/* XXX Replace loop with fancy data structures. */ if (tlbsel == 0) {
for (i = 0; i < vcpu_e500->gtlb_size[tlbsel]; i++) { int mask = size / KVM_E500_TLB0_WAY_NUM - 1;
struct tlbe *tlbe = &vcpu_e500->gtlb_arch[tlbsel][i]; set_base = (eaddr >> PAGE_SHIFT) & mask;
set_base *= KVM_E500_TLB0_WAY_NUM;
size = KVM_E500_TLB0_WAY_NUM;
} else {
set_base = 0;
}
for (i = 0; i < size; i++) {
struct tlbe *tlbe = &vcpu_e500->gtlb_arch[tlbsel][set_base + i];
unsigned int tid; unsigned int tid;
if (eaddr < get_tlb_eaddr(tlbe)) if (eaddr < get_tlb_eaddr(tlbe))
...@@ -441,7 +451,7 @@ static int kvmppc_e500_tlb_index(struct kvmppc_vcpu_e500 *vcpu_e500, ...@@ -441,7 +451,7 @@ static int kvmppc_e500_tlb_index(struct kvmppc_vcpu_e500 *vcpu_e500,
if (get_tlb_ts(tlbe) != as && as != -1) if (get_tlb_ts(tlbe) != as && as != -1)
continue; continue;
return i; return set_base + i;
} }
return -1; return -1;
......
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