[alsa-devel] [PATCH 1/3] ALSA: pcm: implement the anonymous dup (inode file descriptor)
Takashi Iwai
tiwai at suse.de
Tue Jan 29 19:44:44 CET 2019
On Tue, 29 Jan 2019 18:59:07 +0100,
Jaroslav Kysela wrote:
>
> This patch implements new SNDRV_PCM_IOCTL_ANONYMOUS_DUP ioctl which
> returns the new duplicated anonymous inode file descriptor
> (anon_inode:snd-pcm) which can be passed to the restricted clients.
>
> This patch is meant to be the alternative for the dma-buf interface. Both
> implementation have some pros and cons:
>
> anon_inode:dmabuf
>
> - a bit standard export API for the DMA buffers
> - fencing for the concurrent access [1]
> - driver/kernel interface for the DMA buffer [1]
> - multiple attach/detach scheme [1]
>
> [1] the real usage for the sound PCM is unknown at the moment for this feature
>
> anon_inode:snd-pcm
>
> - simple (no problem with ref-counting, non-standard mmap implementation etc.)
> - allow to use more sound interfaces for the file descriptor like status ioctls
> - more fine grained security policies (another anon_inode name unshared with
> other drivers)
Your sign-off seems missing.
> @@ -999,15 +1002,19 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream,
> }
>
> if (file->f_flags & O_APPEND) {
> - if (prefer_subdevice < 0) {
> - if (pstr->substream_count > 1)
> - return -EINVAL; /* must be unique */
> - substream = pstr->substream;
> + if (clone) {
> + substream = clone;
> } else {
> - for (substream = pstr->substream; substream;
> - substream = substream->next)
> - if (substream->number == prefer_subdevice)
> - break;
> + if (prefer_subdevice < 0) {
> + if (pstr->substream_count > 1)
> + return -EINVAL; /* must be unique */
> + substream = pstr->substream;
> + } else {
> + for (substream = pstr->substream; substream;
> + substream = substream->next)
> + if (substream->number == prefer_subdevice)
> + break;
> + }
> }
> if (! substream)
> return -ENODEV;
So the clone case should return via this block, then...
> @@ -1018,11 +1025,18 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream,
> return 0;
> }
>
> - for (substream = pstr->substream; substream; substream = substream->next) {
> - if (!SUBSTREAM_BUSY(substream) &&
> - (prefer_subdevice == -1 ||
> - substream->number == prefer_subdevice))
> - break;
> + if (clone) {
> + substream = clone;
> + if (SUBSTREAM_BUSY(substream))
> + return -EAGAIN;
> + } else {
> + for (substream = pstr->substream; substream;
> + substream = substream->next) {
> + if (!SUBSTREAM_BUSY(substream) &&
> + (prefer_subdevice == -1 ||
> + substream->number == prefer_subdevice))
> + break;
> + }
... do we need to support cloning without O_APPEND?
thanks,
Takashi
More information about the Alsa-devel
mailing list