Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 7 Feb 1999 01:26:25 -0800 (PST)
From:      Matthew Dillon <dillon@apollo.backplane.com>
To:        "John S. Dyson" <dyson@iquest.net>
Cc:        current@FreeBSD.ORG
Subject:   Re: Significant page coloring improvement
Message-ID:  <199902070926.BAA20420@apollo.backplane.com>
References:   <199902070901.EAA26213@y.dyson.net>

next in thread | previous in thread | raw e-mail | index | archive | help
:Matthew Dillon said:
:>
:>     Ah, interesting.  I understand the second bit.  The first bit seems
:>     somewhat odd, though - the automatic page coloring adjustment made
:>     by _vm_object_allocate() doesn't work well enough for kmem_object?
:> 
:
:The problem with it was that there appeared to be a clash.  The color
:allocation in _vm_object_allocate is ad-hoc, and tuned for a general
:case, essentially randomizing the coloring (but also statistically
:coloring processes approximately correctly.)  My original code (and
:I forget if the current code does this) attempts to color the objects
:(or pages in the objects) so that there isn't much overlap in normal
:processes.

    The standard increment in _vm_object_allocate() is:

        if ( size > (PQ_L2_SIZE / 3 + PQ_PRIME1))
                incr = PQ_L2_SIZE / 3 + PQ_PRIME1;
        else
                incr = size;
	next_index = (next_index + incr) & PQ_L2_MASK;

    Which, for the kmem_object you are overriding with:

	 kmem_object->pg_color = (kernel_object->pg_color + PQ_L2_SIZE/4) & 
	PQ_L2_MASK;

    Would it make more sense to change vm_object_allocate() to simply
    increment by PQ_L2_SIZE/4 plus an additional 1 if it rolls over and
    then not do anything special for kmem_object?   Like this:

	next_index += PQ_L2_SIZE/4;
	if (next_index > PQ_L2_MASK)
		next_index = (next_index + 1) & PQ_L2_MASK;

    I don't see much point in trying to include the object size in the 
    pg_color optimization since an objects tends to be acted upon in a
    non-contiguous manner relative to other objects.  In fact, dividing
    PQ_L2_SIZE by 3 and adding 5 ( for PQ_NORMALCACHE case ) doesn't even
    give us a pseudo-random distribution since that increment is '10', which
    is an even number.

:If you want to see the L1 mods and perhaps remove the L1 coloring, you are
:welcome and it would be a good thing to remove it.  The L1 mods are pretty
:much straight-forward, and might be a compromise between removing the coloring
:all together and keeping all of the complexity.

    If the L1 coloring doesn't help, I'd love to remove it.  It wouldn't be
    a big deal, though, since presumably the only two routines we are talking
    about are vm_page_select_free() and vm_page_list_find().  Still, there
    are a bunch of #if 0's ( surrounding the now defunct object->page_hint
    stuff ) in vm_page.c that I could clean up at the same time, so lay
    those diffs on me!

:I do suggest that the base color allocation (and proper management of the
:coloring) would be a good day or so project to clean-up.  Again, right
:now, the coloring looks okay, and the kernel page coloring choices were just
:a degenerate case.  The low level coloring code is good -- so improving
:the upper level mgmt is fertile ground.
:
:dyson@iquest.net      | it makes one look stupid

					-Matt
					Matthew Dillon 
					<dillon@backplane.com>

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199902070926.BAA20420>