lkml.org 
[lkml]   [2018]   [Mar]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 18/20] firmware: ensure the firmware cache is not used on incompatible calls
    Date
    request_firmware_into_buf() explicitly disables the firmware cache,
    meanwhile the firmware cache cannot be used when request_firmware_nowait()
    is used without the uevent. Enforce a sanity check for this to avoid future
    issues undocumented behaviours should misuses of the firmware cache
    happen later.

    One of the reasons we want to enforce this is the firmware cache is
    used for helping with suspend/resume, and if incompatible calls use it
    they can stall suspend.

    Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org>
    ---
    drivers/base/firmware_loader/main.c | 14 ++++++++++++++
    1 file changed, 14 insertions(+)

    diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_loader/main.c
    index b569d8a09392..2913bb0e5e7b 100644
    --- a/drivers/base/firmware_loader/main.c
    +++ b/drivers/base/firmware_loader/main.c
    @@ -431,6 +431,11 @@ static int fw_add_devm_name(struct device *dev, const char *name)
    return 0;
    }
    #else
    +static bool fw_cache_is_setup(struct device *dev, const char *name)
    +{
    + return false;
    +}
    +
    static int fw_add_devm_name(struct device *dev, const char *name)
    {
    return 0;
    @@ -672,6 +677,9 @@ request_firmware_into_buf(const struct firmware **firmware_p, const char *name,
    {
    int ret;

    + if (fw_cache_is_setup(device, name))
    + return -EOPNOTSUPP;
    +
    __module_get(THIS_MODULE);
    ret = _request_firmware(firmware_p, name, device, buf, size,
    FW_OPT_UEVENT | FW_OPT_NOCACHE);
    @@ -769,6 +777,12 @@ request_firmware_nowait(
    fw_work->opt_flags = FW_OPT_NOWAIT |
    (uevent ? FW_OPT_UEVENT : FW_OPT_USERHELPER);

    + if (!uevent && fw_cache_is_setup(device, name)) {
    + kfree_const(fw_work->name);
    + kfree(fw_work);
    + return -EOPNOTSUPP;
    + }
    +
    if (!try_module_get(module)) {
    kfree_const(fw_work->name);
    kfree(fw_work);
    --
    2.16.2
    \
     
     \ /
      Last update: 2018-03-10 15:17    [W:2.244 / U:0.632 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site