----- Original Message -----
 So I don't understand how you got into a loop unless the kmem_cache list
 walk-through is the real problem.  If you were to print out the "cache"
 address each time through the do-while loop, does the list start repeating
 itself?
 
 And if that's true, perhaps the kmem_cache_init() should use the
 hq_open()/hq_enter()/hq_close() facility on each cache address to
 catch a duplicate (false) entry.
 
 Dave 
As a side issue, you have pinpointed a potential problem
area if the first readmem() does fail, because in that case it
should "continue" instead of using the invalid "shared" value
in the second readmem():  
 
                        if (readmem(start_address[i] + OFFSET(kmem_list3_shared),
                            KVADDR, &shared, sizeof(void *),
                            "kmem_list3 shared", RETURN_ON_ERROR|QUIET)) {
                                if (!shared)
                                        break;
                        }
                        if (readmem(shared + OFFSET(array_cache_limit),
                            KVADDR, &limit, sizeof(int), "shared array_cache
limit",
                            RETURN_ON_ERROR|QUIET)) {
                                if (limit > max_limit)
                                        max_limit = limit;
                                break;
                        }
But again, I don't see that having anything to do with your problem.
And in all practical circumstances, that first readmem() should
never fail, even though it is allowable.
I'll fix that...
Dave