Received: by 2002:a05:6358:1087:b0:cb:c9d3:cd90 with SMTP id j7csp975492rwi; Wed, 19 Oct 2022 05:23:00 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6Vil4wR/UNqr89Sct++SbkAmRj850VGoI4hH5YtdR5O/2jBFEastfwlf+UsA84HicP5jrW X-Received: by 2002:a17:902:d4c5:b0:185:507b:5ef3 with SMTP id o5-20020a170902d4c500b00185507b5ef3mr8334543plg.108.1666182180608; Wed, 19 Oct 2022 05:23:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666182180; cv=none; d=google.com; s=arc-20160816; b=FlO1icj/irutHwFWtrOqWkNg0qOJYoA43O/ZxOpDDW43T4cV5ai1QHzMag9YAnl9s+ O4fdO3y9rjA4jjQ+0QZxr1Sba9/wgPUt7e/gDcKNjaD/4woOPT/RwB6Hta/e4yEJg2G+ Oxf20opEtSwCz7f7Chrcr1Uc42zLGwHgULx7NP9tNpR9hAjbileJnqMpM/mIwRZVwTLX 522ufi4YMCWC+8VVbKWR8Qmj0qd9uA1dsKeRvlEqgUzouLiO66VaQe8KD20kbH+iQC05 RPBK/5Plcb/f8Rnm6T/dKWcg3cpUM+pEetepnfixpCEobjaGWXIqK9wbzha2VeuvCHFg mrug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=h1EuxK6HYlgGwTppQowMKAf8rYnfW66GGWqdHYB6GiY=; b=vB4cjRS/NJ36le3G1kQHCl5LMJRq8easCWmZvcif59slPtB06ysbKAj+Hi6cWmrCdm jHncpzXPuiuQLaYzqtRFjnATJLWAzv6jWYoPW2XRaP9iuUTqzjrDabpEwyOv/nZi2A+N PW49Y/4uVnRCrXa1U4VpZWmofc9Efb1X911LmfiTjf2jdM8LVqOnNFcnM+bnCEhCuDBP bJ0UamKkhy08WTa431f82EaHDr51VAcr5PZN91W3It5hGnxJx4E+c9ZSqFTl4rEKse9G xLzYEM0xKR0LLQXJgVYy/LXq00YB0uzm0a2DrhQulvu28PzJ/YHs/yDKWJqZHBPxTuZY IkUQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=OAHCO7Jm; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id e70-20020a636949000000b00463dbc5cec8si18690338pgc.658.2022.10.19.05.22.28; Wed, 19 Oct 2022 05:23:00 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=OAHCO7Jm; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231782AbiJSMHA (ORCPT + 99 others); Wed, 19 Oct 2022 08:07:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60230 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232503AbiJSMGi (ORCPT ); Wed, 19 Oct 2022 08:06:38 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3FF2DF708B; Wed, 19 Oct 2022 04:43:12 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id F0AE7B824B8; Wed, 19 Oct 2022 09:10:48 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 70B5BC43470; Wed, 19 Oct 2022 09:10:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1666170647; bh=DBhVd95XpZutQyzgeXjErPc70e6GrTLKwZc/rk2PCZI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OAHCO7Jm2Am2p/oqKAlWv+/YzHOp+1l4fIdMie2aSdh5E1D6fxrrsUqMjIdlLAADH oo/YjsFCA9qg8yvA+RTsQNgSvuFcGDAJoKxuZJrDDPVRRhZWpMqHzcFXkSrU/Xul95 smrUhZrKQg5OvzQwGuSCaS/1u2l/1WKP96gNZu9k= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Kai Vehmanen , Pierre-Louis Bossart , Cezary Rojewski , Takashi Iwai , Sasha Levin Subject: [PATCH 6.0 734/862] ALSA: hda: Fix page fault in snd_hda_codec_shutdown() Date: Wed, 19 Oct 2022 10:33:41 +0200 Message-Id: <20221019083322.381422903@linuxfoundation.org> X-Mailer: git-send-email 2.38.0 In-Reply-To: <20221019083249.951566199@linuxfoundation.org> References: <20221019083249.951566199@linuxfoundation.org> User-Agent: quilt/0.67 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Cezary Rojewski [ Upstream commit f2bd1c5ae2cb0cf9525c9bffc0038c12dd7e1338 ] If early probe of HDAudio bus driver fails e.g.: due to missing firmware file, snd_hda_codec_shutdown() ends in manipulating uninitialized codec->pcm_list_head causing page fault. Initialization of HDAudio codec in ASoC is split in two: - snd_hda_codec_device_init() - snd_hda_codec_device_new() snd_hda_codec_device_init() is called during probe_codecs() by HDAudio bus driver while snd_hda_codec_device_new() is called by codec-component's ->probe(). The second call will not happen until all components required by related sound card are present within the ASoC framework. With firmware failing to load during the PCI's deferred initialization i.e.: probe_work(), no platform components are ever registered. HDAudio codec enumeration is done at that point though, so the codec components became registered to ASoC framework, calling snd_hda_codec_device_init() in the process. Now, during platform reboot snd_hda_codec_shutdown() is called for every codec found on the HDAudio bus causing oops if any of them has not completed both of their initialization steps. Relocating field initialization fixes the issue. Reviewed-by: Kai Vehmanen Reviewed-by: Pierre-Louis Bossart Signed-off-by: Cezary Rojewski Link: https://lore.kernel.org/r/20220816111727.3218543-7-cezary.rojewski@intel.com Signed-off-by: Takashi Iwai Signed-off-by: Sasha Levin --- sound/pci/hda/hda_codec.c | 41 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 384426d7e9dd..4ae8b9574778 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -931,8 +931,28 @@ snd_hda_codec_device_init(struct hda_bus *bus, unsigned int codec_addr, } codec->bus = bus; + codec->depop_delay = -1; + codec->fixup_id = HDA_FIXUP_ID_NOT_SET; + codec->core.dev.release = snd_hda_codec_dev_release; + codec->core.exec_verb = codec_exec_verb; codec->core.type = HDA_DEV_LEGACY; + mutex_init(&codec->spdif_mutex); + mutex_init(&codec->control_mutex); + snd_array_init(&codec->mixers, sizeof(struct hda_nid_item), 32); + snd_array_init(&codec->nids, sizeof(struct hda_nid_item), 32); + snd_array_init(&codec->init_pins, sizeof(struct hda_pincfg), 16); + snd_array_init(&codec->driver_pins, sizeof(struct hda_pincfg), 16); + snd_array_init(&codec->cvt_setups, sizeof(struct hda_cvt_setup), 8); + snd_array_init(&codec->spdif_out, sizeof(struct hda_spdif_out), 16); + snd_array_init(&codec->jacktbl, sizeof(struct hda_jack_tbl), 16); + snd_array_init(&codec->verbs, sizeof(struct hda_verb *), 8); + INIT_LIST_HEAD(&codec->conn_list); + INIT_LIST_HEAD(&codec->pcm_list_head); + INIT_DELAYED_WORK(&codec->jackpoll_work, hda_jackpoll_work); + refcount_set(&codec->pcm_ref, 1); + init_waitqueue_head(&codec->remove_sleep); + return codec; } EXPORT_SYMBOL_GPL(snd_hda_codec_device_init); @@ -985,29 +1005,8 @@ int snd_hda_codec_device_new(struct hda_bus *bus, struct snd_card *card, if (snd_BUG_ON(codec_addr > HDA_MAX_CODEC_ADDRESS)) return -EINVAL; - codec->core.dev.release = snd_hda_codec_dev_release; - codec->core.exec_verb = codec_exec_verb; - codec->card = card; codec->addr = codec_addr; - mutex_init(&codec->spdif_mutex); - mutex_init(&codec->control_mutex); - snd_array_init(&codec->mixers, sizeof(struct hda_nid_item), 32); - snd_array_init(&codec->nids, sizeof(struct hda_nid_item), 32); - snd_array_init(&codec->init_pins, sizeof(struct hda_pincfg), 16); - snd_array_init(&codec->driver_pins, sizeof(struct hda_pincfg), 16); - snd_array_init(&codec->cvt_setups, sizeof(struct hda_cvt_setup), 8); - snd_array_init(&codec->spdif_out, sizeof(struct hda_spdif_out), 16); - snd_array_init(&codec->jacktbl, sizeof(struct hda_jack_tbl), 16); - snd_array_init(&codec->verbs, sizeof(struct hda_verb *), 8); - INIT_LIST_HEAD(&codec->conn_list); - INIT_LIST_HEAD(&codec->pcm_list_head); - refcount_set(&codec->pcm_ref, 1); - init_waitqueue_head(&codec->remove_sleep); - - INIT_DELAYED_WORK(&codec->jackpoll_work, hda_jackpoll_work); - codec->depop_delay = -1; - codec->fixup_id = HDA_FIXUP_ID_NOT_SET; #ifdef CONFIG_PM codec->power_jiffies = jiffies; -- 2.35.1