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