diff --git a/memory.c b/memory.c
index 333d6e1..7a4c3ce 100755
--- a/memory.c
+++ b/memory.c
@@ -8306,7 +8306,13 @@ dump_kmem_cache(struct meminfo *si)
 
 	si->addrlist = (ulong *)GETBUF((vt->kmem_max_c_num+1) * sizeof(ulong));
 	cnt = 0;
-	si->cache = cache_cache = symbol_value("cache_cache");
+	if (si->flags & CACHE_SET) {
+		readmem(si->cache+OFFSET(kmem_cache_s_c_nextp),
+			KVADDR, &cache_cache, sizeof(ulong),
+			"kmem_cache next", FAULT_ON_ERROR);
+	} else {
+		si->cache = cache_cache = symbol_value("cache_cache");
+	}
 
 	if (si->flags & ADDRESS_SPECIFIED) {
 	        if (!(p1 = vaddr_to_kmem_cache(si->spec_addr, kbuf, VERBOSE))) {
@@ -8512,7 +8518,13 @@ dump_kmem_cache_percpu_v1(struct meminfo *si)
 			GETBUF(vt->kmem_max_limit * sizeof(ulong)); 
 
 	cnt = 0;
-	si->cache = cache_cache = symbol_value("cache_cache");
+	if (si->flags & CACHE_SET) {
+		readmem(si->cache+OFFSET(kmem_cache_s_next), 
+			KVADDR, &cache_cache, sizeof(ulong),
+			"kmem_cache_s next", FAULT_ON_ERROR);
+	} else {
+		si->cache = cache_cache = symbol_value("cache_cache");
+	}
 
 	if (si->flags & ADDRESS_SPECIFIED) {
 	        if (!(p1 = vaddr_to_kmem_cache(si->spec_addr, kbuf, VERBOSE))) {
