objcache depot not used?
Matthew Dillon
dillon at apollo.backplane.com
Mon Jan 28 20:27:40 PST 2008
:Um, I did some testing and I still don't get it.
:
:One of the full magazine will be moved to the depot if and only if
:there is an empty magazine in the depot in the first place:
:
: 548 /*
: 549 * If an empty magazine is available in the depot, cycle it
: 550 * through and retry.
: 551 */
: 552 if (!SLIST_EMPTY(&depot->emptymagazines)) {
:
:
:This does not seem to be the case (the depot is initially empty). As a
:consequence, the path taken is:
:
: 578 /*
: 579 * An empty mag is not available. This is a corner case which can
: 580 * occur due to cpus holding partially full magazines. Do not try
: 581 * to allocate a mag, just free the object.
: 582 */
:
:As a further test, I allocated an empty mag in objcache_create() and stored
:it in the depot (emptymagazines). With this, the allocator behaves as you
:describe.
:
:Cheers,
:Nicolas
Hmm. I haven't looked at this code in a long time, but I think you're
right. I don't see any empty mags in the depot either. Doh!
Ok. Well, I think your fix is correct. Go ahead and spuce it up and
post it.
The objcache_put() path cannot allocate a magazine without potentially
deadlocking the memory subsystem so we want to supply an initial number
of empty magazines to the depot as in your test. The question is, how
many should we throw in there? We Probably want some hysteresis on the
backing store so we could do something like:
n = 0;
if (cluster_limit > 0)
n = (cluster_limit - ncpus * 2 * mag_capacity) / mag_capacity;
if (n < 2)
n = 2; /* minimum, also handles unlimited case */
What do you think?
-Matt
Matthew Dillon
<dillon at backplane.com>
More information about the Kernel
mailing list