• Ulf Hansson's avatar
    mmc: core: Drop reference counting of the bus_ops · e9ce2ce1
    Ulf Hansson authored
    When the mmc_rescan work is enabled for execution (host->rescan_disable),
    it's the only instance per mmc host that is allowed to set/clear the
    host->bus_ops pointer.
    
    Besides the mmc_rescan work, there are a couple of scenarios when the
    host->bus_ops pointer may be accessed. Typically, those can be described as
    as below:
    
    *)
    Upper mmc driver layers (like the mmc block device driver or an SDIO
    functional driver) needs to execute a host->bus_ops callback. This can be
    considered as safe without having to use some special locking mechanism,
    because they operate on top of the struct mmc_card. As long as there is a
    card to operate upon, the mmc core guarantees that there is a host->bus_ops
    assigned as well. Note that, upper layer mmc drivers are of course
    responsible to clean up from themselves from their ->remove() callbacks,
    otherwise things would fall apart anyways.
    
    **)
    Via the mmc host instance, we may need to force a removal of an inserted
    mmc card. This happens when a mmc host driver gets unbind, for example. In
    this case, we protect the host->bus_ops pointer from concurrent accesses,
    by disabling the mmc_rescan work upfront (host->rescan_disable). See
    mmc_stop_host() for example.
    
    This said, it seems like the reference counting of the host->bus_ops
    pointer at some point have become superfluous. As this is an old mechanism
    of the mmc core, it a bit difficult to digest the history of when that
    could have happened. However, let's drop the reference counting to avoid
    unnecessary code-paths and lockings.
    
    Cc: Pierre Ossman <pierre@ossman.eu>
    Cc: Russell King <linux@armlinux.org.uk>
    Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    Reviewed-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
    Link: https://lore.kernel.org/r/20210212131610.236843-1-ulf.hansson@linaro.org
    e9ce2ce1
core.c 59.1 KB