summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkmacy <kmacy@FreeBSD.org>2006-12-16 08:38:02 +0000
committerkmacy <kmacy@FreeBSD.org>2006-12-16 08:38:02 +0000
commit1287f3cd28030b9ee6ad9d05e5f2cde464124323 (patch)
treea7746c54e6ecb4d1584b59010d648ab66515c9c7
parent2ee50bd8693ddeca86111035ac90cb3c4d85055a (diff)
downloadFreeBSD-src-1287f3cd28030b9ee6ad9d05e5f2cde464124323.zip
FreeBSD-src-1287f3cd28030b9ee6ad9d05e5f2cde464124323.tar.gz
Protect consistency of all internal functions in tte_hash.c using PCPU_{GET,SET}
with critical_enter, critical_exit revert previous change to pmap.c now that tte_hash_resize is protected internally
-rw-r--r--sys/sun4v/sun4v/pmap.c2
-rw-r--r--sys/sun4v/sun4v/tte_hash.c18
2 files changed, 13 insertions, 7 deletions
diff --git a/sys/sun4v/sun4v/pmap.c b/sys/sun4v/sun4v/pmap.c
index bfe73a6..d8b8f4d 100644
--- a/sys/sun4v/sun4v/pmap.c
+++ b/sys/sun4v/sun4v/pmap.c
@@ -2165,8 +2165,8 @@ pmap_tte_hash_resize(pmap_t pmap)
{
tte_hash_t old_th = pmap->pm_hash;
- spinlock_enter();
pmap->pm_hash = tte_hash_resize(pmap->pm_hash);
+ spinlock_enter();
if (curthread->td_proc->p_numthreads != 1)
pmap_ipi(pmap, tl_ttehashupdate, pmap->pm_context, pmap->pm_hashscratch);
diff --git a/sys/sun4v/sun4v/tte_hash.c b/sys/sun4v/sun4v/tte_hash.c
index d25f15f..4484098 100644
--- a/sys/sun4v/sun4v/tte_hash.c
+++ b/sys/sun4v/sun4v/tte_hash.c
@@ -418,6 +418,7 @@ tte_hash_clear_bits(tte_hash_t th, vm_offset_t va, uint64_t flags)
tte_t otte_data, tte_tag;
/* XXX - only handle 8K pages for now */
+ critical_enter();
entry = find_entry(th, va, PAGE_SHIFT);
tte_tag = (((uint64_t)th->th_context << TTARGET_CTX_SHIFT)|(va >> TTARGET_VA_SHIFT));
@@ -429,7 +430,7 @@ tte_hash_clear_bits(tte_hash_t th, vm_offset_t va, uint64_t flags)
((tte_hash_field_t)PCPU_GET(lookup_field))->data & ~flags);
hash_bucket_unlock(entry->the_fields, s);
-
+ critical_exit();
return (otte_data);
}
@@ -441,6 +442,7 @@ tte_hash_delete(tte_hash_t th, vm_offset_t va)
tte_t tte_data, tte_tag;
/* XXX - only handle 8K pages for now */
+ critical_enter();
entry = find_entry(th, va, PAGE_SHIFT);
tte_tag = (((uint64_t)th->th_context << TTARGET_CTX_SHIFT)|(va >> TTARGET_VA_SHIFT));
@@ -470,6 +472,7 @@ done:
if (tte_data)
th->th_entries--;
+ critical_exit();
return (tte_data);
}
@@ -508,11 +511,12 @@ tte_hash_insert(tte_hash_t th, vm_offset_t va, tte_t tte_data)
tte_t tte_tag;
uint64_t s;
int retval;
-
+
#ifdef DEBUG
if (tte_hash_lookup(th, va) != 0)
panic("mapping for va=0x%lx already exists", va);
#endif
+ critical_enter();
entry = find_entry(th, va, PAGE_SHIFT); /* should actually be a function of tte_data */
tte_tag = (((uint64_t)th->th_context << TTARGET_CTX_SHIFT)|(va >> TTARGET_VA_SHIFT));
@@ -525,7 +529,8 @@ tte_hash_insert(tte_hash_t th, vm_offset_t va, tte_t tte_data)
s = hash_bucket_lock(entry->the_fields);
tte_hash_extend_locked(th, entry, newentry, tte_tag, tte_data);
hash_bucket_unlock(entry->the_fields, s);
- }
+ }
+ critical_exit();
#ifdef DEBUG
if (tte_hash_lookup(th, va) == 0)
@@ -594,7 +599,7 @@ tte_hash_update(tte_hash_t th, vm_offset_t va, tte_t tte_data)
entry = find_entry(th, va, PAGE_SHIFT); /* should actualy be a function of tte_data */
tte_tag = (((uint64_t)th->th_context << TTARGET_CTX_SHIFT)|(va >> TTARGET_VA_SHIFT));
-
+ critical_enter();
s = hash_bucket_lock(entry->the_fields);
otte_data = _tte_hash_lookup(entry, tte_tag, TRUE);
@@ -606,6 +611,7 @@ tte_hash_update(tte_hash_t th, vm_offset_t va, tte_t tte_data)
tte_tag, tte_data);
hash_bucket_unlock(entry->the_fields, s);
}
+ critical_exit();
return (otte_data);
}
@@ -627,7 +633,7 @@ tte_hash_resize(tte_hash_t th)
tte_hash_entry_t src_entry, dst_entry, newentry;
KASSERT(th != &kernel_tte_hash,("tte_hash_resize not supported for this pmap"));
-
+ critical_enter();
if ((newth = tte_hash_cached_get((th->th_shift - HASH_ENTRY_SHIFT) + 1)) != NULL) {
newth->th_context = th->th_context;
_tte_hash_reset(newth);
@@ -653,7 +659,7 @@ tte_hash_resize(tte_hash_t th)
src_entry = src_entry->of.next;
} while (src_entry);
}
-
+ critical_exit();
KASSERT(th->th_entries == newth->th_entries,
("not all entries copied old=%d new=%d", th->th_entries, newth->th_entries));
OpenPOWER on IntegriCloud