mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Wesley Cheng <quic_wcheng@quicinc.com>
To: Takashi Iwai <tiwai@suse.de>
Cc: <agross@kernel.org>, <andersson@kernel.org>, <robh+dt@kernel.org>,
	<krzysztof.kozlowski+dt@linaro.org>, <conor+dt@kernel.org>,
	<catalin.marinas@arm.com>, <will@kernel.org>,
	<mathias.nyman@intel.com>, <gregkh@linuxfoundation.org>,
	<lgirdwood@gmail.com>, <broonie@kernel.org>, <perex@perex.cz>,
	<tiwai@suse.com>, <srinivas.kandagatla@linaro.org>,
	<bgoswami@quicinc.com>, <Thinh.Nguyen@synopsys.com>,
	<linux-arm-msm@vger.kernel.org>, <devicetree@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>,
	<linux-usb@vger.kernel.org>, <alsa-devel@alsa-project.org>,
	<quic_jackp@quicinc.com>, <pierre-louis.bossart@linux.intel.com>,
	<oneukum@suse.com>, <albertccwang@google.com>,
	<o-takashi@sakamocchi.jp>
Subject: Re: [PATCH v4 18/32] sound: usb: Introduce QC USB SND offloading support
Date: Tue, 25 Jul 2023 15:59:57 -0700	[thread overview]
Message-ID: <243ee81d-d46d-e05a-1fcd-35e6301a39cd@quicinc.com> (raw)
In-Reply-To: <87bkg0v4ce.wl-tiwai@suse.de>

Hi Takashi,

On 7/25/2023 12:26 AM, Takashi Iwai wrote:
> On Tue, 25 Jul 2023 04:34:02 +0200,
> Wesley Cheng wrote:
>>
>> --- a/sound/usb/Kconfig
>> +++ b/sound/usb/Kconfig
>> @@ -165,6 +165,21 @@ config SND_BCD2000
>>   	  To compile this driver as a module, choose M here: the module
>>   	  will be called snd-bcd2000.
>>   
>> +config QC_USB_AUDIO_OFFLOAD
>> +	tristate "Qualcomm Audio Offload driver"
>> +	depends on QCOM_QMI_HELPERS
>> +	select SND_PCM
> 
> So the driver can be enabled without CONFIG_SND_USB_AUDIO?  It makes
> little sense without it.
> Or is it set so intentionally for testing purpose?
> 

Thanks for the review.  I'll change this to be dependent on 
CONFIG_SND_USB_AUDIO...it shouldn't exist in the end use case w/o it.

> About the code:
> 
>> +/* Offloading IOMMU management */
>> +static unsigned long uaudio_get_iova(unsigned long *curr_iova,
>> +	size_t *curr_iova_size, struct list_head *head, size_t size)
>> +{
>> +	struct iova_info *info, *new_info = NULL;
>> +	struct list_head *curr_head;
>> +	unsigned long va = 0;
>> +	size_t tmp_size = size;
>> +	bool found = false;
>> +
>> +	if (size % PAGE_SIZE) {
>> +		dev_err(uaudio_qdev->dev, "size %zu is not page size multiple\n",
>> +			size);
>> +		goto done;
> 
> This can be easily triggered by user-space as it's passed directly
> from the mmap call, and it implies that you can fill up the messages
> easily.  It's safer to make it debug message or add the rate limit.
> 
> Ditto for other error messages.
> 

Got it, I'll make sure to address the above dev_err().

>> +static void disable_audio_stream(struct snd_usb_substream *subs)
>> +{
>> +	struct snd_usb_audio *chip = subs->stream->chip;
>> +
>> +	if (subs->data_endpoint || subs->sync_endpoint) {
>> +		close_endpoints(chip, subs);
>> +
>> +		mutex_lock(&chip->mutex);
>> +		subs->cur_audiofmt = NULL;
>> +		mutex_unlock(&chip->mutex);
>> +	}
> 
> Now looking at this and...
> 
>> +static int enable_audio_stream(struct snd_usb_substream *subs,
>> +				snd_pcm_format_t pcm_format,
>> +				unsigned int channels, unsigned int cur_rate,
>> +				int datainterval)
>> +{
> 
> ... this implementation, I wonder whether it'd be better to modify and
> export  snd_usb_hw_params() snd snd_usb_hw_free() to fit with qcom
> driver.  Then you can avoid lots of open code.
> 

I think the problem is that snd_usb_hw_params assumes that we've already 
done a PCM open on the PCM device created by USB SND.  However, with the 
offload path, we don't reference the USB PCM device, but the one created 
by the platform sound card.  Hence, I don't have access to the 
snd_pcm_substream.

I attempted to derive snd_pcm_substream from snd_usb_substream, but 
since PCM open isn't run, it doesn't provide a valid structure.

What do you think about adding a wrapper to snd_usb_hw_params?  Have a 
version that will take in snd_usb_substream, and another that is 
registered to hw_params().

> In general, if you see a direct use of chip->mutex, it can be often
> done better in a different form.  The use of an internal lock or such
> from an external driver is always fragile and error-prone.
> 
> Also, the current open-code misses the potential race against the
> disconnection during the operation.  In snd-usb-audio, it protects
> with snd_usb_lock_shutdown() and snd_usb_unlock_shutdown() pairs.
> 

I agree...I think then the best approach would be something like the 
above, ie:

int snd_usb_hw_params(struct snd_pcm_substream *substream,
			     struct snd_pcm_hw_params *hw_params)
{
	struct snd_usb_substream *subs = substream->runtime->private_data;

	snd_usb_ep_attach(subs, hw_params);
...

int snd_usb_ep_attach(...)
{
	//implementation of current code in snd_usb_hw_params()
}
EXPORT_SYMBOL(snd_usb_ep_attach);

>> +static int __init qc_usb_audio_offload_init(void)
>> +{
>> +	struct uaudio_qmi_svc *svc;
>> +	int ret;
>> +
>> +	ret = snd_usb_register_platform_ops(&offload_ops);
>> +	if (ret < 0)
>> +		return ret;
> 
> Registering the ops at the very first opens a potential access to the
> uninitialized stuff.  Imagine a suspend happens right after this
> point.  As the ops is already registered, it'll enter to the
> suspend_cb callback and straight to Oops.
> 
>> +static void __exit qc_usb_audio_offload_exit(void)
>> +{
>> +	struct uaudio_qmi_svc *svc = uaudio_svc;
>> +
>> +	qmi_handle_release(svc->uaudio_svc_hdl);
>> +	flush_workqueue(svc->uaudio_wq);
>> +	destroy_workqueue(svc->uaudio_wq);
>> +	kfree(svc);
>> +	uaudio_svc = NULL;
>> +	snd_usb_unregister_platform_ops();
> 
> Similarly, the unregister order has to be careful, too.
> 

Let me re-organize it a bit more.

Thanks
Wesley Cheng

  reply	other threads:[~2023-07-25 23:00 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-25  2:33 [PATCH v4 00/32] Introduce QC USB SND audio " Wesley Cheng
2023-07-25  2:33 ` [PATCH v4 01/32] xhci: add support to allocate several interrupters Wesley Cheng
2023-07-25  5:35   ` Greg KH
2023-07-25 10:00   ` Oliver Neukum
2023-07-25  2:33 ` [PATCH v4 02/32] xhci: add helper to stop endpoint and wait for completion Wesley Cheng
2023-07-25  2:33 ` [PATCH v4 03/32] xhci: sideband: add initial api to register a sideband entity Wesley Cheng
2023-07-25  2:57   ` Randy Dunlap
2023-07-25  2:33 ` [PATCH v4 04/32] usb: host: xhci-mem: Cleanup pending secondary event ring events Wesley Cheng
2023-08-03 10:33   ` Mathias Nyman
2023-07-25  2:33 ` [PATCH v4 05/32] usb: host: xhci-mem: Allow for interrupter clients to choose specific index Wesley Cheng
2023-07-25  2:33 ` [PATCH v4 06/32] ASoC: Add SOC USB APIs for adding an USB backend Wesley Cheng
2023-07-25  8:10   ` Pierre-Louis Bossart
2023-07-25 23:17     ` Wesley Cheng
2023-07-25  2:33 ` [PATCH v4 07/32] ASoC: dt-bindings: qcom,q6dsp-lpass-ports: Add USB_RX port Wesley Cheng
2023-07-25  2:33 ` [PATCH v4 08/32] ASoC: qcom: qdsp6: Introduce USB AFE port to q6dsp Wesley Cheng
2023-07-25  8:27   ` Pierre-Louis Bossart
2023-08-07 23:39     ` Wesley Cheng
2023-07-25  2:33 ` [PATCH v4 09/32] ASoC: qdsp6: q6afe: Increase APR timeout Wesley Cheng
2023-07-25  2:33 ` [PATCH v4 10/32] ASoC: qcom: Add USB backend ASoC driver for Q6 Wesley Cheng
2023-07-25  8:45   ` Pierre-Louis Bossart
2023-08-08  0:50     ` Wesley Cheng
2023-07-25  2:33 ` [PATCH v4 11/32] sound: usb: card: Introduce USB SND platform op callbacks Wesley Cheng
2023-07-25  6:55   ` Takashi Iwai
2023-07-25  2:33 ` [PATCH v4 12/32] sound: usb: Export USB SND APIs for modules Wesley Cheng
2023-07-25  5:04   ` Trilok Soni
2023-07-25  5:33   ` Greg KH
2023-07-25  6:52     ` Takashi Iwai
2023-07-25  2:33 ` [PATCH v4 13/32] dt-bindings: usb: dwc3: Add snps,num-hc-interrupters definition Wesley Cheng
2023-07-26 17:19   ` Rob Herring
2023-08-29  6:31   ` Krzysztof Kozlowski
2023-07-25  2:33 ` [PATCH v4 14/32] usb: dwc3: Add DT parameter to specify maximum number of interrupters Wesley Cheng
2023-07-25  2:33 ` [PATCH v4 15/32] usb: host: xhci-plat: Set XHCI max interrupters if property is present Wesley Cheng
2023-07-25  2:34 ` [PATCH v4 16/32] sound: usb: pcm: Export fixed rate check USB SND API Wesley Cheng
2023-07-25  2:34 ` [PATCH v4 17/32] sound: usb: qcom: Add USB QMI definitions Wesley Cheng
2023-07-25  2:34 ` [PATCH v4 18/32] sound: usb: Introduce QC USB SND offloading support Wesley Cheng
2023-07-25  2:57   ` Randy Dunlap
2023-07-25  7:26   ` Takashi Iwai
2023-07-25 22:59     ` Wesley Cheng [this message]
2023-07-26 12:31       ` Takashi Iwai
2023-07-25  2:34 ` [PATCH v4 19/32] sound: usb: card: Check for support for requested audio format Wesley Cheng
2023-07-25  6:57   ` Takashi Iwai
2023-07-25  2:34 ` [PATCH v4 20/32] sound: soc: soc-usb: Add PCM format check API for USB backend Wesley Cheng
2023-07-25  2:34 ` [PATCH v4 21/32] sound: soc: qcom: qusb6: Ensure PCM format is supported by USB audio device Wesley Cheng
2023-07-25  2:34 ` [PATCH v4 22/32] sound: usb: Prevent starting of audio stream if in use Wesley Cheng
2023-07-25  2:34 ` [PATCH v4 23/32] ASoC: dt-bindings: Add Q6USB backend bindings Wesley Cheng
2023-07-26  8:00   ` Krzysztof Kozlowski
2023-07-25  2:34 ` [PATCH v4 24/32] ASoC: dt-bindings: Update example for enabling USB offload on SM8250 Wesley Cheng
2023-07-25  4:26   ` Rob Herring
2023-07-25  2:34 ` [PATCH v4 25/32] ASoC: qcom: qdsp6: q6afe: Split USB AFE dev_token param into separate API Wesley Cheng
2023-07-25  2:34 ` [PATCH v4 26/32] sound: Pass USB SND card and PCM information to SOC USB Wesley Cheng
2023-07-25  8:59   ` Pierre-Louis Bossart
2023-08-15  1:48     ` Wesley Cheng
2023-07-25  2:34 ` [PATCH v4 27/32] sound: soc: qdsp6: Add SND kcontrol to select offload device Wesley Cheng
2023-07-25  9:16   ` Pierre-Louis Bossart
2023-07-26 23:06     ` Wesley Cheng
2023-07-25  2:34 ` [PATCH v4 28/32] sound: soc: qdsp6: Add SND kcontrol for fetching offload status Wesley Cheng
2023-07-25  2:34 ` [PATCH v4 29/32] sound: soc: qcom: q6usb: Add headphone jack for offload connection status Wesley Cheng
2023-07-25  9:10   ` Pierre-Louis Bossart
2023-08-16  1:11     ` Wesley Cheng
2023-07-25  2:34 ` [PATCH v4 30/32] sound: usb: qc_audio_offload: Use card and PCM index from QMI request Wesley Cheng
2023-07-25  2:34 ` [PATCH v4 31/32] sound: usb: card: Allow for rediscovery of connected USB SND devices Wesley Cheng
2023-07-25  9:15   ` Pierre-Louis Bossart
2023-07-25  9:27     ` Takashi Iwai
2023-08-28 21:25       ` Wesley Cheng
2023-08-29 14:06         ` Takashi Iwai
2023-08-16  1:38     ` Wesley Cheng
2023-08-16 15:35       ` Pierre-Louis Bossart
2023-07-25  2:34 ` [PATCH v4 32/32] sound: soc: soc-usb: Rediscover USB SND devices on USB port add Wesley Cheng
2023-07-25  2:38 ` [PATCH v4 00/32] Introduce QC USB SND audio offloading support Wesley Cheng

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=243ee81d-d46d-e05a-1fcd-35e6301a39cd@quicinc.com \
    --to=quic_wcheng@quicinc.com \
    --cc=Thinh.Nguyen@synopsys.com \
    --cc=agross@kernel.org \
    --cc=albertccwang@google.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=andersson@kernel.org \
    --cc=bgoswami@quicinc.com \
    --cc=broonie@kernel.org \
    --cc=catalin.marinas@arm.com \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=lgirdwood@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=mathias.nyman@intel.com \
    --cc=o-takashi@sakamocchi.jp \
    --cc=oneukum@suse.com \
    --cc=perex@perex.cz \
    --cc=pierre-louis.bossart@linux.intel.com \
    --cc=quic_jackp@quicinc.com \
    --cc=robh+dt@kernel.org \
    --cc=srinivas.kandagatla@linaro.org \
    --cc=tiwai@suse.com \
    --cc=tiwai@suse.de \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome