• Remi Pommarel's avatar
    mmc: meson-gx: Free irq in release() callback · bb364890
    Remi Pommarel authored
    Because the irq was requested through device managed resources API
    (devm_request_threaded_irq()) it was freed after meson_mmc_remove()
    completion, thus after mmc_free_host() has reclaimed meson_host memory.
    As this irq is IRQF_SHARED, while using CONFIG_DEBUG_SHIRQ, its handler
    get called by free_irq(). So meson_mmc_irq() was called after the
    meson_host memory reclamation and was using invalid memory.
    
    We ended up with the following scenario:
    device_release_driver()
    	meson_mmc_remove()
    		mmc_free_host() /* Freeing host memory */
    	...
    	devres_release_all()
    		devm_irq_release()
    			__free_irq()
    				meson_mmc_irq() /* Uses freed memory */
    
    To avoid this, the irq is released in meson_mmc_remove() and in
    mseon_mmc_probe() error path before mmc_free_host() gets called.
    Reported-by: default avatarElie Roudninski <xademax@gmail.com>
    Signed-off-by: default avatarRemi Pommarel <repk@triplefau.lt>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    bb364890
meson-gx-mmc.c 37.1 KB