• R
    redesign and simplify vmlock system · f08ab9e6
    Rich Felker 提交于
    this global lock allows certain unlock-type primitives to exclude
    mmap/munmap operations which could change the identity of virtual
    addresses while references to them still exist.
    
    the original design mistakenly assumed mmap/munmap would conversely
    need to exclude the same operations which exclude mmap/munmap, so the
    vmlock was implemented as a sort of 'symmetric recursive rwlock'. this
    turned out to be unnecessary.
    
    commit 25d12fc0 already shortened the
    interval during which mmap/munmap held their side of the lock, but
    left the inappropriate lock design and some inefficiency.
    
    the new design uses a separate function, __vm_wait, which does not
    hold any lock itself and only waits for lock users which were already
    present when it was called to release the lock. this is sufficient
    because of the way operations that need to be excluded are sequenced:
    the "unlock-type" operations using the vmlock need only block
    mmap/munmap operations that are precipitated by (and thus sequenced
    after) the atomic-unlock they perform while holding the vmlock.
    
    this allows for a spectacular lack of synchronization in the __vm_wait
    function itself.
    f08ab9e6
pthread_create.c 8.4 KB