lkml.org 
[lkml]   [2019]   [Sep]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.14 52/89] PM / devfreq: passive: Use non-devm notifiers
    Date
    From: Leonard Crestez <leonard.crestez@nxp.com>

    [ Upstream commit 0ef7c7cce43f6ecc2b96d447e69b2900a9655f7c ]

    The devfreq passive governor registers and unregisters devfreq
    transition notifiers on DEVFREQ_GOV_START/GOV_STOP using devm wrappers.

    If devfreq itself is registered with devm then a warning is triggered on
    rmmod from devm_devfreq_unregister_notifier. Call stack looks like this:

    devm_devfreq_unregister_notifier+0x30/0x40
    devfreq_passive_event_handler+0x4c/0x88
    devfreq_remove_device.part.8+0x6c/0x9c
    devm_devfreq_dev_release+0x18/0x20
    release_nodes+0x1b0/0x220
    devres_release_all+0x78/0x84
    device_release_driver_internal+0x100/0x1c0
    driver_detach+0x4c/0x90
    bus_remove_driver+0x7c/0xd0
    driver_unregister+0x2c/0x58
    platform_driver_unregister+0x10/0x18
    imx_devfreq_platdrv_exit+0x14/0xd40 [imx_devfreq]

    This happens because devres_release_all will first remove all the nodes
    into a separate todo list so the nested devres_release from
    devm_devfreq_unregister_notifier won't find anything.

    Fix the warning by calling the non-devm APIS for frequency notification.
    Using devm wrappers is not actually useful for a governor anyway: it
    relies on the devfreq core to correctly match the GOV_START/GOV_STOP
    notifications.

    Fixes: 996133119f57 ("PM / devfreq: Add new passive governor")
    Signed-off-by: Leonard Crestez <leonard.crestez@nxp.com>
    Acked-by: Chanwoo Choi <cw00.choi@samsung.com>
    Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/devfreq/governor_passive.c | 6 +++---
    1 file changed, 3 insertions(+), 3 deletions(-)

    diff --git a/drivers/devfreq/governor_passive.c b/drivers/devfreq/governor_passive.c
    index 673ad8cc9a1d0..4222d3c1efb98 100644
    --- a/drivers/devfreq/governor_passive.c
    +++ b/drivers/devfreq/governor_passive.c
    @@ -168,12 +168,12 @@ static int devfreq_passive_event_handler(struct devfreq *devfreq,
    p_data->this = devfreq;

    nb->notifier_call = devfreq_passive_notifier_call;
    - ret = devm_devfreq_register_notifier(dev, parent, nb,
    + ret = devfreq_register_notifier(parent, nb,
    DEVFREQ_TRANSITION_NOTIFIER);
    break;
    case DEVFREQ_GOV_STOP:
    - devm_devfreq_unregister_notifier(dev, parent, nb,
    - DEVFREQ_TRANSITION_NOTIFIER);
    + WARN_ON(devfreq_unregister_notifier(parent, nb,
    + DEVFREQ_TRANSITION_NOTIFIER));
    break;
    default:
    break;
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-09-22 21:11    [W:3.641 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site