From c5a2dde1672adc9e326fda6533e9dd90f69dc2f1 Mon Sep 17 00:00:00 2001 From: hunt Date: Wed, 14 Dec 2005 21:06:57 +0000 Subject: 2005-12-14 Martin Hunt * pmap-gen.c (_stp_pmap_new_*): Initialize lock. (_stp_pmap_set_*): Lock map while in use. (_stp_pmap_add_*): Lock map while in use. (_stp_pmap_get_cpu): Ditto. (_stp_pmap_get): Lock each per-cpu map. * map-gen.c: Define and use NULLRET for a NULL return value. * map.c (_stp_pmap_clear): New function. (_stp_pmap_agg): Lock each per-cpu map as it gets aggregated. --- runtime/map.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'runtime/map.c') diff --git a/runtime/map.c b/runtime/map.c index 1fa4a0e5..1d6d084e 100644 --- a/runtime/map.c +++ b/runtime/map.c @@ -355,6 +355,21 @@ void _stp_map_clear(MAP map) } } +void _stp_pmap_clear(PMAP pmap) +{ + int i; + + if (pmap == NULL) + return; + + for_each_cpu(i) { + MAP m = per_cpu_ptr (pmap->map, i); + spin_lock(&m->lock); + _stp_map_clear(m); + spin_unlock(&m->lock); + } + _stp_map_clear(&pmap->agg); +} static void __stp_map_del(MAP map) { @@ -853,6 +868,7 @@ MAP _stp_pmap_agg (PMAP pmap) for_each_cpu(i) { m = per_cpu_ptr (pmap->map, i); + spin_lock(&m->lock); /* walk the hash chains. */ for (hash = 0; hash < HASH_TABLE_SIZE; hash++) { head = &m->hashes[hash]; @@ -873,6 +889,7 @@ MAP _stp_pmap_agg (PMAP pmap) _stp_new_agg(agg, ahead, ptr); } } + spin_unlock(&m->lock); } return agg; } -- cgit