[alsa-devel] [PATCH 3/3] ALSA: pcm: conditionally avoid mmap of control data
Takashi Iwai
tiwai at suse.de
Tue May 16 07:46:00 CEST 2017
On Tue, 16 May 2017 07:38:40 +0200,
Takashi Sakamoto wrote:
>
> Hi,
>
> On May 16 2017 10:01, Subhransu S. Prusty wrote:
> > From: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
> >
> > In case of mmap, by default alsa-lib mmaps both control and status data.
> >
> > If driver subscribes for application pointer update, driver needs to get
> > notification whenever appl ptr changes. With the above case driver won't
> > get appl ptr notifications.
> >
> > This patch check on a hw info flag and returns error when user land asks
> > for mmaping control & status data, thus forcing user to issue
> > IOCTL_SYNC_PTR.
> >
> > Suggested-by: Takashi Iwai <tiwai at suse.de>
> > Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
> > Signed-off-by: Ramesh Babu <ramesh.babu at intel.com>
> > Signed-off-by: Jaikrishna Nemallapudi <jaikrishnax.nemallapudi at intel.com>
> > Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty at intel.com>
> > ---
> > include/uapi/sound/asound.h | 1 +
> > sound/core/pcm_native.c | 17 +++++++++++++++++
> > 2 files changed, 18 insertions(+)
>
> Would you please explain about the case that drivers can't support
> page frame mapping, please?
>
> As long as I know, it depends on kernel and platform architecture
> whether mapping is available or not, because the data of 'struct
> snd_pcm_mmap_status' and 'struct snd_pcm_mmap_control' is not directly
> related to data transmission and independent of target device design.
It's only a part of the condition.
In this case, the problem is that the mmap control allows the appl_ptr
being changed silently without interaction with the driver. If the
driver requires some explicit action for changing the appl_ptr, it
won't work.
> Of course, I can understand your intension for previous patches. But
> the code comment is quite misleading and worthless.
Worthless is a too strong word, but I agree that more clarification
would be more helpful.
thanks,
Takashi
>
> > diff --git a/include/uapi/sound/asound.h b/include/uapi/sound/asound.h
> > index c697ff90450d..dea7d89b41ca 100644
> > --- a/include/uapi/sound/asound.h
> > +++ b/include/uapi/sound/asound.h
> > @@ -284,6 +284,7 @@ enum {
> > #define SNDRV_PCM_INFO_HAS_LINK_ABSOLUTE_ATIME 0x02000000 /* report absolute hardware link audio time, not reset on startup */
> > #define SNDRV_PCM_INFO_HAS_LINK_ESTIMATED_ATIME 0x04000000 /* report estimated link audio time */
> > #define SNDRV_PCM_INFO_HAS_LINK_SYNCHRONIZED_ATIME 0x08000000 /* report synchronized audio/system time */
> > +#define SNDRV_PCM_INFO_NO_STATUS_MMAP 0x10000000 /* status and control mmap not supported */
> >
> > #define SNDRV_PCM_INFO_DRAIN_TRIGGER 0x40000000 /* internal kernel flag - trigger in drain */
> > #define SNDRV_PCM_INFO_FIFO_IN_FRAMES 0x80000000 /* internal kernel flag - FIFO size is in frames */
> > diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
> > index c14cdbd9ff86..2635a7d4d1fa 100644
> > --- a/sound/core/pcm_native.c
> > +++ b/sound/core/pcm_native.c
> > @@ -3524,21 +3524,38 @@ static int snd_pcm_mmap(struct file *file, struct vm_area_struct *area)
> > struct snd_pcm_file * pcm_file;
> > struct snd_pcm_substream *substream;
> > unsigned long offset;
> > + unsigned int info;
> >
> > pcm_file = file->private_data;
> > substream = pcm_file->substream;
> > if (PCM_RUNTIME_CHECK(substream))
> > return -ENXIO;
> > + info = substream->runtime->hw.info;
> >
> > offset = area->vm_pgoff << PAGE_SHIFT;
> > switch (offset) {
> > case SNDRV_PCM_MMAP_OFFSET_STATUS:
> > if (pcm_file->no_compat_mmap)
> > return -ENXIO;
> > + /*
> > + * force fallback to ioctl if driver doesn't support status
> > + * and control mmap.
> > + */
> > + if (info & SNDRV_PCM_INFO_NO_STATUS_MMAP)
> > + return -ENXIO;
> > +
> > return snd_pcm_mmap_status(substream, file, area);
> > case SNDRV_PCM_MMAP_OFFSET_CONTROL:
> > if (pcm_file->no_compat_mmap)
> > return -ENXIO;
> > +
> > + /*
> > + * force fallback to ioctl if driver doesn't support status
> > + * and control mmap.
> > + */
> > + if (info & SNDRV_PCM_INFO_NO_STATUS_MMAP)
> > + return -ENXIO;
> > +
> > return snd_pcm_mmap_control(substream, file, area);
> > default:
> > return snd_pcm_mmap_data(substream, file, area);
>
> Regards
>
> Takashi Sakamoto
>
More information about the Alsa-devel
mailing list