Date: Tue, 9 May 2006 00:10:49 GMT From: Kip Macy <kmacy@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 96840 for review Message-ID: <200605090010.k490AnwG064464@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=96840 Change 96840 by kmacy@kmacy_storage:sun4v_rwbuf on 2006/05/09 00:10:36 disable interrupts entirely when updating hash bucket Affected files ... .. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/tte_hash.c#26 edit Differences ... ==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/tte_hash.c#26 (text+ko) ==== @@ -142,22 +142,24 @@ uma_zfree(thzone, th); } -static void +static int hash_bucket_lock(tte_hash_field_t fields) { uint64_t data; + int s; + s = intr_disable_all(); - spinlock_enter(); data = fields[0].tte.data & ~VTD_LOCK; while (atomic_cmpset_long(&fields[0].tte.data, data, data | VTD_LOCK)) data = fields[0].tte.data & ~VTD_LOCK; - membar(LoadLoad); + membar(Sync); + return s; } static __inline void -hash_bucket_unlock_inline(tte_hash_field_t fields) +hash_bucket_unlock_inline(tte_hash_field_t fields, int s) { membar(StoreStore|LoadStore); @@ -167,8 +169,8 @@ #endif fields[0].tte.data &= ~VTD_LOCK; - membar(StoreLoad); - spinlock_exit(); + membar(Sync); + intr_restore_all(s); } void @@ -411,18 +413,19 @@ uint64_t hash_shift, hash_index; tte_hash_field_t fields, lookup_field; tte_t otte_data; + int s; /* XXX - only handle 8K pages for now */ hash_shift = PAGE_SHIFT; hash_index = (va >> hash_shift) & HASH_MASK(th); fields = (th->th_hashtable[hash_index].the_fields); - hash_bucket_lock(fields); + s = hash_bucket_lock(fields); if((otte_data = tte_hash_lookup_inline(th, va, &lookup_field)) != 0) tte_hash_set_field(lookup_field, lookup_field->tte.tag, lookup_field->tte.data & ~flags); - hash_bucket_unlock_inline(fields); + hash_bucket_unlock_inline(fields, s); return (otte_data); } @@ -433,6 +436,7 @@ uint64_t hash_shift, hash_index; tte_hash_field_t fields, lookup_field, last_field; tte_t tte_data; + int s; /* XXX - only handle 8K pages for now */ @@ -440,7 +444,7 @@ hash_index = (va >> hash_shift) & HASH_MASK(th); fields = (th->th_hashtable[hash_index].the_fields); - hash_bucket_lock(fields); + s = hash_bucket_lock(fields); if ((tte_data = tte_hash_lookup_inline(th, va, &lookup_field)) == 0) goto done; @@ -459,7 +463,7 @@ tte_hash_set_field(last_field, 0, 0); done: - hash_bucket_unlock_inline(fields); + hash_bucket_unlock_inline(fields, s); return (tte_data); } @@ -471,7 +475,7 @@ uint64_t hash_shift, hash_index, tte_tag; tte_hash_field_t fields, lookup_field; tte_t otte_data; - + int s; /* XXX - only handle 8K pages for now */ hash_shift = PAGE_SHIFT; @@ -480,7 +484,7 @@ tte_tag = (((uint64_t)th->th_context << TTARGET_CTX_SHIFT)|(va >> TTARGET_VA_SHIFT)); - hash_bucket_lock(fields); + s = hash_bucket_lock(fields); otte_data = tte_hash_lookup_inline(th, va, &lookup_field); if (lookup_field->tte.tag != 0) lookup_field = tte_hash_allocate_fragment_entry(th, lookup_field); @@ -491,7 +495,7 @@ #endif tte_hash_set_field(lookup_field, tte_tag, tte_data); - hash_bucket_unlock_inline(fields); + hash_bucket_unlock_inline(fields, s); th->th_entries++; } @@ -516,15 +520,16 @@ uint64_t hash_shift, hash_index; tte_hash_field_t fields; tte_t tte_data; + int s; /* XXX - only handle 8K pages for now */ hash_shift = PAGE_SHIFT; hash_index = (va >> hash_shift) & HASH_MASK(th); fields = (th->th_hashtable[hash_index].the_fields); - hash_bucket_lock(fields); + s = hash_bucket_lock(fields); tte_data = tte_hash_lookup_inline(th, va, NULL); - hash_bucket_unlock_inline(fields); + hash_bucket_unlock_inline(fields, s); return (tte_data); } @@ -567,13 +572,14 @@ tte_hash_field_t fields, lookup_field; tte_t otte_data; uint64_t tag; + int s; /* XXX - only handle 8K pages for now */ hash_shift = PAGE_SHIFT; hash_index = (va >> hash_shift) & HASH_MASK(th); fields = (th->th_hashtable[hash_index].the_fields); - hash_bucket_lock(fields); + s = hash_bucket_lock(fields); otte_data = tte_hash_lookup_inline(th, va, &lookup_field); if (otte_data == 0 && lookup_field->tte.tag != 0) lookup_field = tte_hash_allocate_fragment_entry(th, lookup_field); @@ -582,7 +588,7 @@ tte_hash_set_field(lookup_field, tag, tte_data); - hash_bucket_unlock_inline(fields); + hash_bucket_unlock_inline(fields, s); if (otte_data == 0) th->th_entries++;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200605090010.k490AnwG064464>