• Stephen Boyd's avatar
    firmware: support loading into a pre-allocated buffer · a098ecd2
    Stephen Boyd authored
    Some systems are memory constrained but they need to load very large
    firmwares.  The firmware subsystem allows drivers to request this
    firmware be loaded from the filesystem, but this requires that the
    entire firmware be loaded into kernel memory first before it's provided
    to the driver.  This can lead to a situation where we map the firmware
    twice, once to load the firmware into kernel memory and once to copy the
    firmware into the final resting place.
    This creates needless memory pressure and delays loading because we have
    to copy from kernel memory to somewhere else.  Let's add a
    request_firmware_into_buf() API that allows drivers to request firmware
    be loaded directly into a pre-allocated buffer.  This skips the
    intermediate step of allocating a buffer in kernel memory to hold the
    firmware image while it's read from the filesystem.  It also requires
    that drivers know how much memory they'll require before requesting the
    firmware and negates any benefits of firmware caching because the
    firmware layer doesn't manage the buffer lifetime.
    For a 16MB buffer, about half the time is spent performing a memcpy from
    the buffer to the final resting place.  I see loading times go from
    0.081171 seconds to 0.047696 seconds after applying this patch.  Plus
    the vmalloc pressure is reduced.
    This is based on a patch from Vikram Mulukutla on codeaurora.org:
    Link: http://lkml.kernel.org/r/20160607164741.31849-4-stephen.boyd@linaro.orgSigned-off-by: default avatarStephen Boyd <stephen.boyd@linaro.org>
    Cc: Mimi Zohar <zohar@linux.vnet.ibm.com>
    Cc: Vikram Mulukutla <markivx@codeaurora.org>
    Cc: Mark Brown <broonie@kernel.org>
    Cc: Ming Lei <ming.lei@canonical.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
firmware.h 2.3 KB