new lwbuf api and mpsafe sf_bufs

Matthew Dillon dillon at apollo.backplane.com
Tue Mar 10 17:31:11 PDT 2009


:http://gitweb.dragonflybsd.org/~sjg/dragonfly.git/commitdiff/caac5766643042650328f83531dc8fd767df5f60
:
:The basic thought behind the new lwbuf api is that sf_buf's have been
:abused more and more as time has passed for purposes that don't
:necessarily match the original intent. Most uses of sf_bufs beyond
:sendfile are exceedingly short-lived, short enough that they would be
:better served by cpu-local caches of kvm space, even if that means a
:bit of overlap now and again. lwbuf attempts to match the semantics of
:xio, with one addition as suggested by Simon, a sanity check and tlb
:invalidation in lwbuf_kva if the lwbuf strays to some other cpu.
:Currently lwbuf allocates a page of kvm at a time on objcache object
:construction and stores the kvm with the object in objcache when it is
:returned to the cache.
:
:sf_bufs, which are still most applicable to sendfile, have been
:simplified on top of the lwbuf api, converted to objcache and the
:global hash has been protected with a spinlock.
:
:XIO and exec have been modified to use lwbuf's.
:
:Please comment/hate/review/test
:
:Thanks,
:Sam

    Hmm.  If I understand this correctly you are removing SFB_CPUPRIVATE
    from the SFBUF API and splitting the entire set of API procedures out
    for private-cpu use into a new LWBUF API?

    It looks like you moved the cpumask mmu syncing to lwbuf_kva(),
    but I think I see a bug in lwbuf_alloc().

    From my reading of the code lwbuf_alloc() is not able to reuse
    the KVA mappings for previously cached LWBUF's because it is 
    unconditionally changing the vm_page (lwb->m = m; pmap_kenter_quick...).
    Because of the pmap change, lwb->cpumask would have to be set to
    gd->gd_cpumask, NOT or'd with the previous mask.

    i.e. the bug is:

	lwb->cpumask |= gd->gd_cpumask;

    It needs to be:

	lwb->cpumask = gd->gd_cpumask;

    If you want to separate out private mappings like that I think the
    LWBUFs have to cached just like they are with SFBUFs.  I like the
    use of the objcache but I think the LWBUF code needs to retain 
    a sysctl-programmable number of lwb elements in a RBTREE and try to
    reuse the mappings.  i.e. it needs to be a bit more sophisticated
    then your current design.

					-Matt
					Matthew Dillon 
					<dillon at backplane.com>





More information about the Submit mailing list