Received: by 2002:ac0:da4c:0:0:0:0:0 with SMTP id a12csp655451imi; Fri, 22 Jul 2022 06:44:47 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vVNc+RNfheeD2CtsN6jnKHMgku896WEtpsuuwtPfZNN5Dcke0hJnK9GuH6IUwXRI+AiCcu X-Received: by 2002:a17:90b:4c84:b0:1f1:8f7d:c9a0 with SMTP id my4-20020a17090b4c8400b001f18f7dc9a0mr17128186pjb.41.1658497486893; Fri, 22 Jul 2022 06:44:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1658497486; cv=none; d=google.com; s=arc-20160816; b=eMS/XK1k0JQ///uAzHG7LPnRgdCvI6JOybqUG8A8mxZQfEko//PT6fRRrOf5t6ijk4 ZecKSrYQI64gYNfi9XqsmzUI+fS6Azd+2ju5KnHWzg3/1zN3gvtblFn59RCM9k6syuhP 8as9W+d37PR2msobCDBktgEp0IrruufnAE7F6Aqh13LWitaI97GLF0+4/QKG5o3gra5x /YVofRbJw3t646EWQISOzUagESE0ZkKxcHcHG/ris273tncpjgyvawemai1HXbXU+wiU uky31zKN+3HIr/7Ryr7sbV6Vmh3JGhed6PSL0MXDJkxtP4MGpKVdsR12HMutHZ4i0xF6 BRuQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:user-agent:references:in-reply-to :subject:cc:to:from:message-id:date:dkim-signature:dkim-signature; bh=uuyaztEJO/U+txt+TpKrVT4oWz325yRVlHDru4X0shc=; b=dFpK92XxtNV5KmICoVLrpDnFnMRuZiKI0vYjgMP5ShGmyenwk8vvQXw6Nt8VmgKwHy Ui8aISgKERpLcu85HS1IS6ZFi7I51u4OWKa3dOMqha7sMLcl/rUW233gOSt5QOBtLImy 1JMZYdD39ogqnP9r3pKrd8imq0iTKSY1Jj2jaI7Wa6Oqr/YpZsQewxDvewd9Hbk/FRNn NNVAb1ChyqhntlVMbno9knRe8aQR/5BvW2zXLIxplw7pI34kPbrGDGQ7LOfclqrqjYqN FPkWe0EFJoLB5IFaGkqV5M4TDEa7YVhzyqo8OmZ+t42MrqLYB60020GKmC1/OGXvigy5 Y4zQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@suse.de header.s=susede2_rsa header.b=gabumqZv; dkim=neutral (no key) header.i=@suse.de header.b=PHa4wrnv; 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=suse.de Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id k13-20020a170902c40d00b0016d0bf9febasi6266823plk.390.2022.07.22.06.44.31; Fri, 22 Jul 2022 06:44:46 -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=@suse.de header.s=susede2_rsa header.b=gabumqZv; dkim=neutral (no key) header.i=@suse.de header.b=PHa4wrnv; 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=suse.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235150AbiGVNlL (ORCPT + 99 others); Fri, 22 Jul 2022 09:41:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51226 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234812AbiGVNlI (ORCPT ); Fri, 22 Jul 2022 09:41:08 -0400 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E137E1D0F2 for ; Fri, 22 Jul 2022 06:41:04 -0700 (PDT) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 88AA02054D; Fri, 22 Jul 2022 13:41:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1658497263; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=uuyaztEJO/U+txt+TpKrVT4oWz325yRVlHDru4X0shc=; b=gabumqZvClIYLtonZ7QRkkmiqS3ZyUOvIjMahdFtEBcZ1LvPkdSYQEQgzcIkJbKcSipAlv FE5CEiVnBp6eX0ZxrWMweKEBmiew4iWsbbz59qjkbMmGcGsLA+ZpOc/ZY5W8CHpoIydvsA LeYf3a8f7jCUnJM5sudY3ZMYDxQhcaA= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1658497263; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=uuyaztEJO/U+txt+TpKrVT4oWz325yRVlHDru4X0shc=; b=PHa4wrnvV89bET21NF6pheiOgMYTKTEH0+M0xZX29BjhJwUYufjp6ymnqHN/nL8t6ja47U qBI4oYPwvWAqdCBA== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 45774134A9; Fri, 22 Jul 2022 13:41:03 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id gTw+EO+o2mKVWQAAMHmgww (envelope-from ); Fri, 22 Jul 2022 13:41:03 +0000 Date: Fri, 22 Jul 2022 15:41:02 +0200 Message-ID: <87h739464x.wl-tiwai@suse.de> From: Takashi Iwai To: Venkata Prasad Potturu Cc: , , , , , , , Ajit Kumar Pandey , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , V sujith kumar Reddy , "Charles Keepax" , Yang Yingliang , open list Subject: Re: [PATCH v2] ASoC: amd: acp: Initialize list to store acp_stream during pcm_open In-Reply-To: <20220722133530.3314087-1-venkataprasad.potturu@amd.com> References: <20220722133530.3314087-1-venkataprasad.potturu@amd.com> User-Agent: Wanderlust/2.15.9 (Almost Unreal) Emacs/27.2 Mule/6.0 MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: text/plain; charset=US-ASCII X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,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 On Fri, 22 Jul 2022 15:35:22 +0200, Venkata Prasad Potturu wrote: > > From: Ajit Kumar Pandey > > We are currently allocating acp_stream during pcm_open and saving > it in static array corresponds to array index calculated based on > cpu dai->driver id. This approach will fail if we have single dai > linked to multiple pcm device as we will have same dai->driver id > or array index for multiple pcm open. Initialize new linked list > stream_list to store opened pcm stream info dynamically. If an IRQ handler refers to the linked list, make sure that no list change will happen concurrently during the IRQ handling. It seems that you have no protection for it yet. thanks, Takashi > > Signed-off-by: Ajit Kumar Pandey > Signed-off-by: Venkata Prasad Potturu > Reviewed-by: Vijendar Mukunda > --- > > Changes since v1: > -- Fix compile error and remove unused variable. > > sound/soc/amd/acp/acp-platform.c | 33 ++++++++++++-------------------- > sound/soc/amd/acp/amd.h | 3 ++- > 2 files changed, 14 insertions(+), 22 deletions(-) > > diff --git a/sound/soc/amd/acp/acp-platform.c b/sound/soc/amd/acp/acp-platform.c > index 10730d33c3b0..20c0f75f7c97 100644 > --- a/sound/soc/amd/acp/acp-platform.c > +++ b/sound/soc/amd/acp/acp-platform.c > @@ -94,7 +94,7 @@ static irqreturn_t i2s_irq_handler(int irq, void *data) > struct acp_resource *rsrc = adata->rsrc; > struct acp_stream *stream; > u16 i2s_flag = 0; > - u32 ext_intr_stat, ext_intr_stat1, i; > + u32 ext_intr_stat, ext_intr_stat1; > > if (!adata) > return IRQ_NONE; > @@ -104,8 +104,7 @@ static irqreturn_t i2s_irq_handler(int irq, void *data) > > ext_intr_stat = readl(ACP_EXTERNAL_INTR_STAT(adata, rsrc->irqp_used)); > > - for (i = 0; i < ACP_MAX_STREAM; i++) { > - stream = adata->stream[i]; > + list_for_each_entry(stream, &adata->stream_list, list) { > if (stream && (ext_intr_stat & stream->irq_bit)) { > writel(stream->irq_bit, > ACP_EXTERNAL_INTR_STAT(adata, rsrc->irqp_used)); > @@ -146,9 +145,8 @@ static void config_pte_for_stream(struct acp_dev_data *adata, struct acp_stream > writel(0x01, adata->acp_base + ACPAXI2AXI_ATU_CTRL); > } > > -static void config_acp_dma(struct acp_dev_data *adata, int cpu_id, int size) > +static void config_acp_dma(struct acp_dev_data *adata, struct acp_stream *stream, int size) > { > - struct acp_stream *stream = adata->stream[cpu_id]; > struct snd_pcm_substream *substream = stream->substream; > struct acp_resource *rsrc = adata->rsrc; > dma_addr_t addr = substream->dma_buffer.addr; > @@ -174,13 +172,10 @@ static void config_acp_dma(struct acp_dev_data *adata, int cpu_id, int size) > > static int acp_dma_open(struct snd_soc_component *component, struct snd_pcm_substream *substream) > { > - struct snd_soc_pcm_runtime *soc_runtime = asoc_substream_to_rtd(substream); > - struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(soc_runtime, 0); > struct snd_pcm_runtime *runtime = substream->runtime; > struct device *dev = component->dev; > struct acp_dev_data *adata = dev_get_drvdata(dev); > struct acp_stream *stream; > - int stream_id = cpu_dai->driver->id * 2 + substream->stream; > int ret; > > stream = kzalloc(sizeof(*stream), GFP_KERNEL); > @@ -188,7 +183,8 @@ static int acp_dma_open(struct snd_soc_component *component, struct snd_pcm_subs > return -ENOMEM; > > stream->substream = substream; > - adata->stream[stream_id] = stream; > + > + list_add_tail(&stream->list, &adata->stream_list); > > if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) > runtime->hw = acp_pcm_hardware_playback; > @@ -212,16 +208,13 @@ static int acp_dma_hw_params(struct snd_soc_component *component, > struct snd_pcm_substream *substream, > struct snd_pcm_hw_params *params) > { > - struct snd_soc_pcm_runtime *soc_runtime = asoc_substream_to_rtd(substream); > struct acp_dev_data *adata = snd_soc_component_get_drvdata(component); > - struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(soc_runtime, 0); > struct acp_stream *stream = substream->runtime->private_data; > - int stream_id = cpu_dai->driver->id * 2 + substream->stream; > u64 size = params_buffer_bytes(params); > > /* Configure ACP DMA block with params */ > config_pte_for_stream(adata, stream); > - config_acp_dma(adata, stream_id, size); > + config_acp_dma(adata, stream, size); > > return 0; > } > @@ -261,16 +254,11 @@ static int acp_dma_new(struct snd_soc_component *component, > static int acp_dma_close(struct snd_soc_component *component, > struct snd_pcm_substream *substream) > { > - struct snd_soc_pcm_runtime *soc_runtime = asoc_substream_to_rtd(substream); > - struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(soc_runtime, 0); > - struct device *dev = component->dev; > - struct acp_dev_data *adata = dev_get_drvdata(dev); > - struct acp_stream *stream; > - int stream_id = cpu_dai->driver->id * 2 + substream->stream; > + struct acp_stream *stream = substream->runtime->private_data; > > - stream = adata->stream[stream_id]; > + /* Remove entry from list */ > + list_del(&stream->list); > kfree(stream); > - adata->stream[stream_id] = NULL; > > return 0; > } > @@ -305,6 +293,9 @@ int acp_platform_register(struct device *dev) > dev_err(dev, "Fail to register acp i2s component\n"); > return status; > } > + > + INIT_LIST_HEAD(&adata->stream_list); > + > return 0; > } > EXPORT_SYMBOL_NS_GPL(acp_platform_register, SND_SOC_ACP_COMMON); > diff --git a/sound/soc/amd/acp/amd.h b/sound/soc/amd/acp/amd.h > index af9603724a68..148a9ab6206d 100644 > --- a/sound/soc/amd/acp/amd.h > +++ b/sound/soc/amd/acp/amd.h > @@ -91,6 +91,7 @@ struct acp_chip_info { > }; > > struct acp_stream { > + struct list_head list; > struct snd_pcm_substream *substream; > int irq_bit; > int dai_id; > @@ -123,7 +124,7 @@ struct acp_dev_data { > struct snd_soc_dai_driver *dai_driver; > int num_dai; > > - struct acp_stream *stream[ACP_MAX_STREAM]; > + struct list_head stream_list; > > struct snd_soc_acpi_mach *machines; > struct platform_device *mach_dev; > -- > 2.25.1 >