• Takashi Iwai's avatar
    ALSA: hda - Fix possible race on regmap bypass flip · ec3e7322
    Takashi Iwai authored
    [ Upstream commit 3194ed49 ]
    
    HD-audio driver uses regmap cache bypass feature for reading a raw
    value without the cache.  But this is racy since both the cached and
    the uncached reads may occur concurrently.  The former is done via the
    normal control API access while the latter comes from the proc file
    read.
    
    Even though the regmap itself has the protection against the
    concurrent accesses, the flag set/reset is done without the
    protection, so it may lead to inconsistent state of bypass flag that
    doesn't match with the current read and occasionally result in a
    kernel WARNING like:
      WARNING: CPU: 3 PID: 2731 at drivers/base/regmap/regcache.c:499 regcache_cache_only+0x78/0x93
    
    One way to work around such a problem is to wrap with a mutex.  But in
    this case, the solution is simpler: for the uncached read, we just
    skip the regmap and directly calls its accessor.  The verb execution
    there is protected by itself, so basically it's safe to call
    individually.
    
    Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=116171Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    Signed-off-by: default avatarSasha Levin <sasha.levin@oracle.com>
    ec3e7322
hdac_regmap.c 12.5 KB