From owner-p4-projects@FreeBSD.ORG Tue May 9 00:10:57 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 678E716A41F; Tue, 9 May 2006 00:10:57 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id CC50F16A404 for ; Tue, 9 May 2006 00:10:55 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id ADCCD43D5D for ; Tue, 9 May 2006 00:10:49 +0000 (GMT) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id k490AntN064471 for ; Tue, 9 May 2006 00:10:49 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id k490AnwG064464 for perforce@freebsd.org; Tue, 9 May 2006 00:10:49 GMT (envelope-from kmacy@freebsd.org) Date: Tue, 9 May 2006 00:10:49 GMT Message-Id: <200605090010.k490AnwG064464@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to kmacy@freebsd.org using -f From: Kip Macy To: Perforce Change Reviews Cc: Subject: PERFORCE change 96840 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 09 May 2006 00:11:00 -0000 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++;