Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp4012313img; Tue, 26 Mar 2019 00:53:29 -0700 (PDT) X-Google-Smtp-Source: APXvYqz0qsAPlEzAIu3DtoUindVU9jp3bguScD3T4558XSKUdT5OHC8X9docjo/es9IZ5bJCNpMJ X-Received: by 2002:a17:902:be18:: with SMTP id r24mr7065350pls.69.1553586809330; Tue, 26 Mar 2019 00:53:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553586809; cv=none; d=google.com; s=arc-20160816; b=trVuaohXyNlLlSDxAPAM1kxbqD/dzr82ZlBYE9ywMuRg36D7vz4AhzBqKM4SVRUupF RYw/iDJH0A3ZqN/2O31tQ9KwqeT1pV5y3Uk9U5N7EEUaEzVbRZW3vjhfqe1nZzq5pzJr NY5GslK1bPs8lsXZbgLyAbyrlA9249Rm55gLWD492XM5ucf19y8wXmCGeYr3SmQcsXnY Ktga2Ob/+xA0sc/LTFvww9TOPj6ByIMp8FeFqUMuSgHr010X4y7EJu7WyRBJbus9NjL5 9OctG9h8mEWPKVEIAduolbGv3UvoW2RTNdP7OHUJRKsomNcztKHGBK2Po5MiF0O7T8uV gjQw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=wG03GS80ilGli7BOWpGdX2lb5YjE86tBux2RRt65JaQ=; b=D3GA67bmB0faX/ITW9irqTr6lX9EOxEeDF80TZJzrVboknH0JooQ68iPjIFZB5/w4e wrCM+FP5Jssi8w+OaEZwhPj3E/b0FI/b7BLmBAVwgGK9H0kmom5Z2ixt8XZBxtzPucj3 ozKQPLi2dwER9ks/qVSxHgP+6H/DoIYIbgrNqkVwBjrVHcnWFS/YALWGmEPAXv/K/Oyf L0cjeKLuNC5h7wkwcfqVj4ng81qWESL5J76K2Go8MhnjcH8R4ZkggATh/37GP6Rjo9uN Hhp0R8AEAgA4eF1g+J5jl6E1rw9/1L3hsBPCFIXL85yNP/6E77yMxxWwxgtM9jtrkVWq afRg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g143si15240606pfb.29.2019.03.26.00.53.14; Tue, 26 Mar 2019 00:53:29 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731091AbfCZHvK (ORCPT + 99 others); Tue, 26 Mar 2019 03:51:10 -0400 Received: from smtp1.de.adit-jv.com ([93.241.18.167]:49495 "EHLO smtp1.de.adit-jv.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726279AbfCZHvJ (ORCPT ); Tue, 26 Mar 2019 03:51:09 -0400 Received: from localhost (smtp1.de.adit-jv.com [127.0.0.1]) by smtp1.de.adit-jv.com (Postfix) with ESMTP id 5CF9F3C013A; Tue, 26 Mar 2019 08:51:06 +0100 (CET) Received: from smtp1.de.adit-jv.com ([127.0.0.1]) by localhost (smtp1.de.adit-jv.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id m3kz7e6xXkoQ; Tue, 26 Mar 2019 08:50:59 +0100 (CET) Received: from HI2EXCH01.adit-jv.com (hi2exch01.adit-jv.com [10.72.92.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by smtp1.de.adit-jv.com (Postfix) with ESMTPS id 695B33C02EC; Tue, 26 Mar 2019 08:50:34 +0100 (CET) Received: from vmlxhi-087.adit-jv.com (10.72.93.172) by HI2EXCH01.adit-jv.com (10.72.92.24) with Microsoft SMTP Server (TLS) id 14.3.435.0; Tue, 26 Mar 2019 08:50:34 +0100 From: To: , , , CC: , , Timo Wischer Subject: [PATCH 09/10] ALSA: pcm: Add snd_pcm_ops for snd_pcm_link() Date: Tue, 26 Mar 2019 08:49:33 +0100 Message-ID: <1553586574-18608-5-git-send-email-twischer@de.adit-jv.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1553586574-18608-1-git-send-email-twischer@de.adit-jv.com> References: <1553529644-5654-1-git-send-email-twischer@de.adit-jv.com> <1553586574-18608-1-git-send-email-twischer@de.adit-jv.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.72.93.172] Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Timo Wischer snd_pcm_link() can be called by the user as long as the device is not yet started. Therefore currently a driver which wants to iterate over the linked substreams has to do this at the start trigger. But the start trigger should not block for a long time. Therefore there is no callback which can be used to iterate over the linked substreams without delaying the start trigger. This patch introduces a new callback function which will be called after the linked substream list was updated by snd_pcm_link(). This callback function is allowed to block for a longer time without interfering the synchronized start up of linked substreams. Signed-off-by: Timo Wischer --- include/sound/pcm.h | 1 + sound/core/pcm_native.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/include/sound/pcm.h b/include/sound/pcm.h index 18bd8c3..a7e5dd2 100644 --- a/include/sound/pcm.h +++ b/include/sound/pcm.h @@ -90,6 +90,7 @@ struct snd_pcm_ops { unsigned long offset); int (*mmap)(struct snd_pcm_substream *substream, struct vm_area_struct *vma); int (*ack)(struct snd_pcm_substream *substream); + int (*link_changed)(struct snd_pcm_substream *substream); }; /* diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index f731f90..57a8a66 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -1981,6 +1981,27 @@ static bool is_pcm_file(struct file *file) /* * PCM link handling */ +/* Note: call with snd_pcm_link_rwsem locked */ +static int snd_pcm_link_changed(struct snd_pcm_substream * const substream) +{ + struct snd_pcm_substream *s; + + /* snd_pcm_link_rwsem is down whenever the link_list is changed. + * Therefore this lock is sufficent for the iteration. + */ + snd_pcm_group_for_each_entry(s, substream) { + int err; + + if (!s->ops->link_changed) + continue; + err = s->ops->link_changed(s); + if (err < 0) + return err; + } + + return 0; +} + static int snd_pcm_link(struct snd_pcm_substream *substream, int fd) { int res = 0; @@ -2030,6 +2051,9 @@ static int snd_pcm_link(struct snd_pcm_substream *substream, int fd) snd_pcm_group_assign(substream1, target_group); snd_pcm_stream_unlock(substream1); snd_pcm_group_unlock_irq(target_group, nonatomic); + + if (res >= 0) + res = snd_pcm_link_changed(substream); _end: up_write(&snd_pcm_link_rwsem); _nolock: @@ -2076,6 +2100,11 @@ static int snd_pcm_unlink(struct snd_pcm_substream *substream) snd_pcm_group_unlock_irq(group, nonatomic); if (do_free) kfree(group); + if (res >= 0) + res = snd_pcm_link_changed(substream); + /* Also signal substream which was removed */ + if (res >= 0 && substream->ops->link_changed) + res = substream->ops->link_changed(substream); _end: up_write(&snd_pcm_link_rwsem); -- 2.7.4