• Stephen Boyd's avatar
    mmc: core: Don't allocate IDA for OF aliases · 10252bae
    Stephen Boyd authored
    There's a chance that the IDA allocated in mmc_alloc_host() is not freed
    for some time because it's freed as part of a class' release function
    (see mmc_host_classdev_release() where the IDA is freed). If another
    thread is holding a reference to the class, then only once all balancing
    device_put() calls (in turn calling kobject_put()) have been made will
    the IDA be released and usable again.
    
    Normally this isn't a problem because the kobject is released before
    anything else that may want to use the same number tries to again, but
    with CONFIG_DEBUG_KOBJECT_RELEASE=y and OF aliases it becomes pretty
    easy to try to allocate an alias from the IDA twice while the first time
    it was allocated is still pending a call to ida_simple_remove(). It's
    also possible to trigger it by using CONFIG_DEBUG_KOBJECT_RELEASE and
    probe defering a driver at boot that calls mmc_alloc_host() before
    trying to get resources that may defer likes clks or regulators.
    
    Instead of allocating from the IDA in this scenario, let's just skip it
    if we know this is an OF alias. The number is already "claimed" and
    devices that aren't using OF aliases won't try to use the claimed
    numbers anyway (see mmc_first_nonreserved_index()). This should avoid
    any issues with mmc_alloc_host() returning failures from the
    ida_simple_get() in the case that we're using an OF alias.
    
    Cc: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
    Cc: Sujit Kautkar <sujitka@chromium.org>
    Reported-by: default avatarZubin Mithra <zsm@chromium.org>
    Fixes: fa2d0aa9 ("mmc: core: Allow setting slot index via device tree alias")
    Signed-off-by: default avatarStephen Boyd <swboyd@chromium.org>
    Link: https://lore.kernel.org/r/20210623075002.1746924-3-swboyd@chromium.org
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    10252bae
host.c 16.4 KB