OSDN Git Service

ALSA: hda: Avoid racy recreation of widget kobjects
authorTakashi Iwai <tiwai@suse.de>
Wed, 18 Oct 2017 13:51:59 +0000 (15:51 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 19 Oct 2017 11:58:36 +0000 (13:58 +0200)
commit9780ded39bef5d22a84bdc39112df93f70a58bdd
tree312c860555df48fda2450d833a2cb1a7a7cd5b0e
parent28d1d6d2f314ff395ff67565d1145742614b21c8
ALSA: hda: Avoid racy recreation of widget kobjects

The refresh of HD-audio widget sysfs kobjects via
snd_hdac_refresh_widget_sysfs() is slightly racy.
The driver recreates the whole tree from scratch after deleting the
whole.  When CONFIG_DEBUG_KOBJECT_RELEASE option is used, kobject
release doesn't happen immediately but delayed, while the re-creation
of the same named kobject happens soon after invoking kobject_put().
This may end up with the conflicts of duplicated kobjects, as found in
the bug report below.

In this patch, we take another approach to refresh the tree: instead
of recreating the whole tree, just add the new nodes and delete the
non-existing nodes.  Since the refresh happens only once at
initialization, no longer race would happen.

Along with the code change, merge snd_hdac_refresh_widget_sysfs() with
the existing snd_hdac_refresh_widgets() with an additional bool flag
for simplifying the code.

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=197307
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/hdaudio.h
sound/hda/hdac_device.c
sound/hda/hdac_sysfs.c
sound/hda/local.h
sound/pci/hda/hda_codec.c