Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp436619imu; Fri, 25 Jan 2019 05:04:04 -0800 (PST) X-Google-Smtp-Source: ALg8bN7TO/fsj1TszEd/C+qhMTtYH3p6YYoY08XCysqaAPa0ocbqgkntKcVq4wPN3761AUqkIuxU X-Received: by 2002:a17:902:264:: with SMTP id 91mr11005530plc.108.1548421444122; Fri, 25 Jan 2019 05:04:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548421444; cv=none; d=google.com; s=arc-20160816; b=t7OB21TYc4cOZvdsOx1Hy/qN/UksqTkWTpvyDfomn2lvuy3mYJFrhSjEhIK5EuNqDi Gj0MzH9mUMncsdqmLwKGmWvPQGYrmq8QPPGvALKbNaXmV0caQ3g3zIX4mboX5Ca0el62 cibRqrfjmrDXQapwz9OoYobLb0E+FITp2gmLB0Pk/o8nJAiHJlY2sEZn9FS09f6rXlzW VJmPojrYlwrnwphc50/nY2s6qDgB17urmFxMSyksj3qrOJoN3grAxNvljlcibBkRtEL4 ymLJ2+Q8CKjm8hk8m76WDgl494i9jvrtC+voq6rZsM39im+YLg4mns9f1+DSj1LPjeTP nrCA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:subject:cc:to:from:message-id:date; bh=tJ7FouDF9/rG4hvHGBzDgvcsMyKzE0EVsZcOVcfhZJA=; b=dN9TYwz7EoQuHbKjw4h6BCsRxiXuLcQn4W4kR9odV3Vl2Oh2mEVN2kF5F13WkvB1oe bfCueAyMCOycuVNjGC9x918tXig7yGWJyRQD6OSX3kqN9jbHmmY8/tt3jvWDvxi7GK9X UzJ3ze0cXukXgVv+8GXYI5r4fQQWiuZ862eMS2/DRkbvchI1E8qBGwdaPBnU+t6jaahb Nhb3W2s/iC5ZwKfLn+uC9EOJLRAqWpEAFH+YuTgMbE0/6Je8zbR/nepvO4qEv+c0YLaG l3uBs3Rq0AvCAPdSpg0l/gWGoD5Zba4bSdGC2UTZJ/quIGfQyXLZ1SHMDjCYXffGyd+C jZeg== 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 u8si26355446plh.385.2019.01.25.05.03.47; Fri, 25 Jan 2019 05:04:04 -0800 (PST) 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 S1726689AbfAYNDX (ORCPT + 99 others); Fri, 25 Jan 2019 08:03:23 -0500 Received: from mx2.suse.de ([195.135.220.15]:41524 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726108AbfAYNDX (ORCPT ); Fri, 25 Jan 2019 08:03:23 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 6E9F2AF0D; Fri, 25 Jan 2019 13:03:20 +0000 (UTC) Date: Fri, 25 Jan 2019 14:03:18 +0100 Message-ID: From: Takashi Iwai To: Baolin Wang Cc: Jaroslav Kysela , Leo Yan , Mark Brown , alsa-devel@alsa-project.org, Arnd Bergmann , Kees Cook , bgoswami@codeaurora.org, sr@denx.de, gustavo@embeddedor.com, Phil Burk , Matthew Wilcox , mchehab+samsung@kernel.org, sboyd@kernel.org, Vinod Koul , Daniel Thompson , Mathieu Poirier , Srinivas Kandagatla , anna-maria@linutronix.de, Jon Corbet , Jeffery Miller , Charles Keepax , joe@perches.com, Takashi Sakamoto , colyli@suse.de, LKML Subject: Re: [RFC PATCH] ALSA: core: Add DMA share buffer support In-Reply-To: References: <290f6d3a5fe288b87480cc5fa12c5139728daeca.1547787189.git.baolin.wang@linaro.org> <81e894ba-acad-2fd4-996d-8d35edd8825a@perex.cz> <20190118190805.GF6260@sirena.org.uk> <20190121124053.GA12679@sirena.org.uk> <20190122202535.GK7579@sirena.org.uk> <20190123124658.GE15906@leoy-ThinkPad-X240s> <3962daba-f6ed-d706-c618-b791a1ba6b59@perex.cz> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL/10.8 Emacs/25.3 (x86_64-suse-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 25 Jan 2019 12:11:43 +0100, Baolin Wang wrote: > > Hi Takashi, > On Fri, 25 Jan 2019 at 18:10, Takashi Iwai wrote: > > > > On Fri, 25 Jan 2019 10:25:37 +0100, > > Baolin Wang wrote: > > > > > > Hi Jaroslav, > > > On Thu, 24 Jan 2019 at 21:43, Jaroslav Kysela wrote: > > > > > > > > Dne 23.1.2019 v 13:46 Leo Yan napsal(a): > > > > > Hi all, > > > > > > > > > > On Wed, Jan 23, 2019 at 12:58:51PM +0100, Takashi Iwai wrote: > > > > >> On Tue, 22 Jan 2019 21:25:35 +0100, > > > > >> Mark Brown wrote: > > > > >>> > > > > >>> On Mon, Jan 21, 2019 at 03:15:43PM +0100, Jaroslav Kysela wrote: > > > > >>>> Dne 21.1.2019 v 13:40 Mark Brown napsal(a): > > > > >>> > > > > >>>>> It was the bit about adding more extended permission control that I was > > > > >>>>> worried about there, not the initial O_APPEND bit. Indeed the O_APPEND > > > > >>>>> bit sounds like it might also work from the base buffer sharing point of > > > > >>>>> view, I have to confess I'd not heard of that feature before (it didn't > > > > >>>>> come up in the discussion when Eric raised this in Prague). > > > > >>> > > > > >>>> With permissions, I meant to make possible to restrict the file > > > > >>>> descriptor operations (ioctls) for the depending task (like access to > > > > >>>> the DMA buffer, synchronize it for the non-coherent platforms and maybe > > > > >>>> read/write the actual position, delay etc.). It should be relatively > > > > >>>> easy to implement using the snd_pcm_file structure. > > > > >>> > > > > >>> Right, that's what I understood you to mean. If you want to have a > > > > >>> policy saying "it's OK to export a PCM file descriptor if it's only got > > > > >>> permissions X and Y" the security module is going to need to know about > > > > >>> the mechanism for setting those permissions. With dma_buf that's all a > > > > >>> bit easier as there's less new stuff, though I've no real idea how much > > > > >>> of a big deal that actually is. > > > > >> > > > > >> There are many ways to implement such a thing, yeah. If we'd need an > > > > >> implementation that is done solely in the sound driver layer, I can > > > > >> imagine to introduce either a new ioctl or an open flag (like O_EXCL) > > > > >> to specify the restricted sharing. That is, a kind of master / slave > > > > >> model where only the master is allowed to manipulate the stream while > > > > >> the slave can mmap, read/write and get status. > > > > > > > > > > In order to support EXCLUSIVE mode, it is necessary to convert the > > > > > /dev/snd/ descriptor to an anon_inode:dmabuffer file descriptor. > > > > > SELinux allows that file descriptor to be passed to the client. It can > > > > > also be used by the AAudioService. > > > > > > > > Okay, so this is probably the only point which we should resolve for the > > > > already available DMA buffer sharing in ALSA (the O_APPEND flag). > > > > > > > > I had another glance to your dma-buf implementation and I see many > > > > things which might cause problems: > > > > > > > > - allow to call dma-buf ioctls only when the audio device is in specific > > > > state (stream is not running) > > > > > > Right. Will fix. > > > > > > > - as Takashi mentioned, if we return another file-descriptor (dma-buf > > > > export) to the user space and the server closes the main pcm > > > > file-descriptor (the client does not) - the result will be a crash (dma > > > > buffer will be freed, but referenced through the dma-buf interface) > > > > > > Yes, will fix. > > > > There are a few more overlooked problems. A part of them was already > > mentioned in my previous reply, but let me repeat: > > > > - The racy ioctls have to be considered; you can perform this export > > ioctl concurrently, and both of them write and mix up the setup, > > which is obviously broken. > > Yes, I think I missed the snd_pcm_stream_lock, and will add. Beware that it's not so trivial. The stream lock is usually spinlock. In addition, we need to be careful about the PCM state, as Jaroslav mentioned. Basically SNDRV_PCM_STATE_SETUP is already too late for attaching the buffer, since another buffer is already assigned to the stream. Similarly, after detaching, the stream state must go to SNDRV_PCM_STATE_OPEN. > > - What happens to the PCM buffer that has been allocated before > > attaching, if it's not the pre-allocated one? > > It should be released properly beforehand, otherwise leaks. > > I am not sure I understood you correctly. If the PCM buffer has been > allocated, the platform driver should handle it? Since we always use > substream->dma_buffer. substream->dma_buffer is merely a pre-allocated buffer, and not every driver sets it up. The actual PCM buffer is found in substream's runtime, and this implementation isn't always with the preallocated buffer. It can even be a fixed IO-mapped buffer. > > - There is no validation of the attached dma-buf pages; most drivers > > set coherent DMA mask, and they rely on it. e.g. if a page over the > > DMA mask is passed, it will break silently. > > Sorry maybe I did not get your point here. We have validate the > dma_map_sg_attr() funtion, in this fucntion it will validate the DMA > mask by dma_capable(). OK, then this should be fine -- at least about DMA mask. But, how about other setups, e.g. coherency? Imagine that a buffer allocated for chip A is exported to another chip B. If chip B requires some special setup of the pages while A isn't, this won't work. For example, some HD-audio chips require the non-cached pages while some HD-audio chips allow normal pages. thanks, Takashi