Date: Sat, 6 May 2006 20:11:38 GMT From: Kip Macy <kmacy@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 96747 for review Message-ID: <200605062011.k46KBc8F023311@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=96747 Change 96747 by kmacy@kmacy_storage:sun4v_rwbuf on 2006/05/06 20:11:36 fix tte_hash_lookup_last_inline generalize number of hash entries Affected files ... .. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/tte_hash.c#23 edit Differences ... ==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/tte_hash.c#23 (text+ko) ==== @@ -62,10 +62,11 @@ #define MAX_HASH_SIZE 16 #define HASH_MASK(th) ((th->th_size << (PAGE_SHIFT - THE_SHIFT)) - 1) #define HASH_VALID 0x1 +#define HASH_ENTRIES 4 +#define NULL_TAG 0 - struct tte_hash_entry; #define MAX_FRAGMENT_ENTRIES ((PAGE_SIZE / sizeof(struct tte_hash_entry)) - 1) @@ -83,7 +84,7 @@ typedef struct tte_hash_entry { - tte_hash_field the_fields[4]; + tte_hash_field the_fields[HASH_ENTRIES]; } *tte_hash_entry_t; @@ -338,20 +339,23 @@ entry = 0; retry: - for (i = 0; i < 4 && fields[i].tte.tag != 0; i++) { + for (i = 0; i < HASH_ENTRIES && fields[i].tte.tag != 0; i++) { if (((fields[i].tte.tag << TTARGET_VA_SHIFT) == (va & ~PAGE_MASK_4M))) { entry = (fields[i].tte.data & ~VTD_LOCK); break; } } - if (i == 4) { - if (fields[3].of.flags & TH_COLLISION) { - fields = fields[3].of.next; + if (i == HASH_ENTRIES) { + if (fields[(HASH_ENTRIES - 1)].of.flags & TH_COLLISION) { + fields = fields[(HASH_ENTRIES - 1)].of.next; goto retry; } - i = 3; + i = (HASH_ENTRIES - 1); } + if (i >= HASH_ENTRIES) + panic("invalid state"); + if (field) *field = &fields[i]; @@ -364,33 +368,40 @@ { uint64_t hash_shift, hash_index; tte_hash_field_t fields; - int i; + int i, index; /* 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); + index = -1;; + retry: - for (i = 0; i < 4 && fields[i + 1].tte.tag != 0; i++) - ; + for (i = 0; i < (HASH_ENTRIES - 1); i++) + if (fields[i + 1].tte.tag == 0) { + index = i; + break; + } - if (i == 4) { - if (fields[3].of.flags & TH_COLLISION) { - if (fields[3].of.next[0].tte.tag != 0) { - fields = fields[3].of.next; + if (index != -1) + *field = &fields[index]; + else { + if (fields[(HASH_ENTRIES - 1)].of.flags & TH_COLLISION) { + if (fields[(HASH_ENTRIES - 1)].of.next[0].tte.tag != 0) { + fields = fields[(HASH_ENTRIES - 1)].of.next; goto retry; } else { /* 3rd entry is last */ - *field = &fields[2]; + *field = &fields[(HASH_ENTRIES - 2)]; /* clear collision pointer */ - tte_hash_set_field(&fields[3], 0, 0); + tte_hash_set_field(&fields[(HASH_ENTRIES - 1)], 0, 0); } } else - *field = &fields[3]; /* 4th is the last entry */ - } else - *field = &fields[i]; + *field = &fields[(HASH_ENTRIES - 1)]; /* last in bucket */ + } + }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200605062011.k46KBc8F023311>