• Jesse Barnes's avatar
    drm/i915: allocate large pointer arrays with vmalloc · 8e7d2b2c
    Jesse Barnes authored
    For awhile now, many of the GEM code paths have allocated page or
    object arrays with the slab allocator.  This is nice and fast, but
    won't work well if memory is fragmented, since the slab allocator works
    with physically contiguous memory (i.e. order > 2 allocations are
    likely to fail fairly early after booting and doing some work).
    
    This patch works around the issue by falling back to vmalloc for
    >PAGE_SIZE allocations.  This is ugly, but much less work than chaining
    a bunch of pages together by hand (suprisingly there's not a bunch of
    generic kernel helpers for this yet afaik).  vmalloc space is somewhat
    precious on 32 bit kernels, but our allocations shouldn't be big enough
    to cause problems, though they're routinely more than a page.
    
    Note that this patch doesn't address the unchecked
    alloc-based-on-ioctl-args in GEM; that needs to be fixed in a separate
    patch.
    
    Also, I've deliberately ignored the DRM's "area" junk.  I don't think
    anyone actually uses it anymore and I'm hoping it gets ripped out soon.
    
    [Updated: removed size arg to new free function.  We could unify the
    free functions as well once the DRM mem tracking is ripped out.]
    
    fd.o bug #20152 (part 1/3)
    Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
    Signed-off-by: default avatarEric Anholt <eric@anholt.net>
    8e7d2b2c
i915_gem.c 114 KB