• Takashi Iwai's avatar
    ALSA: hda - Register irq handler after the chip initialization · 996fffea
    Takashi Iwai authored
    [ Upstream commit f495222e ]
    
    Currently the IRQ handler in HD-audio controller driver is registered
    before the chip initialization.  That is, we have some window opened
    between the azx_acquire_irq() call and the CORB/RIRB setup.  If an
    interrupt is triggered in this small window, the IRQ handler may
    access to the uninitialized RIRB buffer, which leads to a NULL
    dereference Oops.
    
    This is usually no big problem since most of Intel chips do register
    the IRQ via MSI, and we've already fixed the order of the IRQ
    enablement and the CORB/RIRB setup in the former commit b61749a8
    ("sound: enable interrupt after dma buffer initialization"), hence the
    IRQ won't be triggered in that room.  However, some platforms use a
    shared IRQ, and this may allow the IRQ trigger by another source.
    
    Another possibility is the kdump environment: a stale interrupt might
    be present in there, the IRQ handler can be falsely triggered as well.
    
    For covering this small race, let's move the azx_acquire_irq() call
    after hda_intel_init_chip() call.  Although this is a bit radical
    change, it can cover more widely than checking the CORB/RIRB setup
    locally in the callee side.
    Reported-by: default avatarLiwei Song <liwei.song@windriver.com>
    Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    996fffea
hda_intel.c 73.8 KB