Dave Anderson wrote:
Hi Sharyathi,

I'm getting a lot of these on a live x86_64 system:

        if (avail > vt->kmem_max_limit) {
                error(INFO,
          "\"%s\" cache: shared array_cache.avail %d greater than limit %ld\n",
                        si->curname, avail, vt->kmem_max_limit);
                si->errors++;
                FREEBUF(start_address);
                return;
        }

I believe that the kmem_max_limit should be be multiplied by the number
of nodes in this function, but since I have only one node, it appears that the
the "max" calculation is significantly different at init-time vs. when the kmem
command is run later?   At a minimum, I would argue for noting somewhere
that vt->kmem_max_limit should be bumped up the next time the kmem
command is run.  Or perhaps it should be recalculated prior to each kmem
command run?

Did you ever see this occurrance on a live ppc64 machine?

Dave

OK -- I found the bug here in your patch to max_cpudata_limit():

+           if(readmem(start_address[i] + OFFSET(kmem_list3_shared), KVADDR, &shared, sizeof(void *),
+              "kmem_list3 shared", RETURN_ON_ERROR|QUIET) ||
+              readmem(shared + OFFSET(array_cache_limit),
+              KVADDR, &limit, sizeof(int), "shared array_cache avail",
+              RETURN_ON_ERROR|QUIET))
+                   if (limit > max_limit)
+                           max_limit = limit;

The "limit" value was not even being read because the patch is using
an "||" instead of an "&&" between the two readmem()'s.  So it never
does the second readmem(), and ends up using a leftover value of "limit".

Don't bother filing another patch -- I'll keep working with this one.

Thanks,
  Dave